Добрый вечер дорогие форумчане! Помогите пожалуйста решить проблему....
значит проблема такая:
Ни в какую не удаётся прочитать данные из флешки. Почему то , ее выход "болтается в воздухе" HI-Z состояние . Потому как в момент чтения , если приблизить руку к ней - данные хаотично принимаются.
код при обращении такой:
Код
soft_spi_write_instruct(SPI_FLASH_INS_READ); // comand
soft_spi_write_addr(0x000000); // adress
Код
// в вечном цикле читаю данные и вывожу прямо на экран дисплея + показываю считанный байт
sprintf(buffer, "A=%x P=%d ", soft_spi_read(), y++); // колл. этапов
lcd_xy(3,1);
lcd_out(buffer);
библиотека такая , сильно не пинайте , писал на скорую руку , да и опыта конечно не много в этом деле

:
CODE
файл .С
#include "EN25T80.h"
#define DLY 10000
void delay(long x)
{
while(x)
{
x--;
}
}
void soft_spi_init()
{
//GPIOC->CRH |=0x24200000; //
//GPIOD->CRL |=0x00000002; //
}
void soft_spi_write_instruct(unsigned char instruct)
{
char x;
SPI_CS_CLR;
delay(DLY);
for(x=0;x<8;x++) // instruction
{
if (0x80 & instruct)
{
SPI_DATA1;
}
else
{
SPI_DATA0;
}
SCK_SPI_CLR;
delay(DLY);
SCK_SPI_SET;
instruct = instruct<<1;
delay(DLY);
}
SPI_CS_SET;
}
void soft_spi_write_addr(long addr_dev)
{
char x;
SPI_CS_CLR;
delay(DLY);
for(x=0;x<24;x++) // instruction
{
if (0x800000 & addr_dev)
{
SPI_DATA1;
}
else
{
SPI_DATA0;
}
SCK_SPI_CLR;
delay(DLY);
SCK_SPI_SET;
addr_dev = addr_dev<<1;
delay(DLY);
}
SPI_CS_SET;
}
int soft_spi_read()
{
int data_buff=0;
char x;
SPI_CS_CLR;
delay(DLY);
for(x=0;x<8;x++)
{
SCK_SPI_CLR;
delay(DLY);
if (SPI_IN)
{
data_buff |=1;
}
data_buff = data_buff<<1;
SCK_SPI_SET;
SPI_DATA1;
delay(DLY);
}
SPI_CS_SET;
return data_buff;
}
файл .Н
#include "stm32f10x_gpio.h"
#define BIT_IN (1<<1) // номер бита входа SPI
#define SCK_SPI_SET GPIO_SetBits(GPIOC, GPIO_Pin_1)
#define SCK_SPI_CLR GPIO_ResetBits(GPIOC, GPIO_Pin_1)
#define SPI_DATA1 GPIO_SetBits(GPIOC, GPIO_Pin_0)
#define SPI_DATA0 GPIO_ResetBits(GPIOC, GPIO_Pin_0)
#define SPI_CS_SET GPIO_ResetBits(GPIOC, GPIO_Pin_2)
#define SPI_CS_CLR GPIO_SetBits(GPIOC, GPIO_Pin_2)
//****************** SPI Definitions **************//
//#define CHIP_SELECT_AT25 PORTE.3=0;delay_ms(100);
//#define CHIP_UNSELECT_AT25 PORTE.3=1;delay_ms(100);
//******************* SPI Definitions *************//
//******************* Instruction Set ************//
// Read Commands
#define SPI_FLASH_INS_READ 0x03 // Read array
#define SPI_FLASH_INS_FAST_READ 0x0B // Read array(low frequency)
// Program and Erase Commands
#define SPI_FLASH_INS_BLOCK_ERASE_4K 0x20 // Sector erase
#define SPI_FLASH_INS_BLOCK_ERASE_32K 0x52 // Sector erase
#define SPI_FLASH_INS_BLOCK_ERASE_64K 0xD8 // Sector erase
#define SPI_FLASH_INS_CHIP_ERASE_1 0x60 // Sector erase
#define SPI_FLASH_INS_CHIP_ERASE_2 0xC7 // Sector erase
#define SPI_FLASH_INS_PAGE_PROGRAM 0x02 // Byte/Page program
// Protection commands
#define SPI_FLASH_INS_WRITE_ENABLE 0x06 // Write enable
#define SPI_FLASH_INS_WRITE_DISABLE 0x04 // Write disable
#define SPI_FLASH_INS_PROTECT_SECTOR 0x36 // Write disable
#define SPI_FLASH_INS_UNPROTECT_SECTOR 0x39 // Write disable
// Status register commands
#define SPI_FLASH_INS_READ_STATUS_REGISTER 0x05 // Read status register
#define SPI_FLASH_INS_WRITE_STATUS_REGISTER 0x01 // Write status register
// Miscellanous Commands
#define SPI_FLASH_INS_READ_DEVICE_ID 0x9F // Read identification
#define SPI_FLASH_INS_DEEP_POWER_DOWN 0xB9 // Deep power-down
#define SPI_FLASH_INS_RESUME_FROM_DEEP_POWER_DOWN 0xAB // Release from deep power- down
#define SPI_IN ((GPIOA->IDR & BIT_IN)==BIT_IN)
void soft_spi_init();
void soft_spi_write_instruct(unsigned char instruct);
void soft_spi_write_addr(long addr_dev);
int soft_spi_read();
Подскажите пожалуйста что я делаю не так.......
ПС: клок от МК присутствует , и чип селект тоже.
Даташит взял отсюда :
http://www.suwa-koubou.jp/micom/TempLogger/EN25T80.pdfБуду крайне благодарен за любую помощь в решении данной проблемы....
С уважением Артем Угримов.
Сообщение отредактировал IgorKossak - Aug 11 2014, 07:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!