|
|
  |
STM32F100 + AT35DB161 + Continuous Array Read, Байты считываються с ошибкой.. |
|
|
|
Jan 28 2013, 11:25
|
Частый гость
 
Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190

|
Господа. По данной пробелме создавал тему в другой ветке форума http://electronix.ru/forum/index.php?showtopic=109847Но незнаю даже верно ли там создал... но так как проблема возможно связана и с STM23 то продублирую сюда суть проблемы: Подскажите а чем сообственно координальным различаються три режима Continuous Array Read, в даташите их описано три: Continuous Array Read (Legacy Command: E8H): Up to 66 MHz; Continuous Array Read (High Frequency Mode: 0BH): Up to 66 MHz; Continuous Array Read (Low Frequency Mode: 03H): Up to 33 MHz. Пробовал все три, данные читаются некорректные. МК STM32F100C4, работает на 24 МГц. При чтении посредством буфера всё нормально и запичь и чтение. Ошибка только с тремя вышеприведёнными командами. Инициализация: Код SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(sFLASH_SPI, &SPI_InitStructure); SPI_Cmd(sFLASH_SPI, ENABLE); Cчитывание данных: Код sFLASH_CS_LOW(); sFLASH_SendByte(0x0B); sFLASH_SendByte((char)(addr_page>>6)); sFLASH_SendByte((char)(addr_page<<2)); sFLASH_SendByte(0x00); sFLASH_SendByte(sFLASH_DUMMY_BYTE);/0xAA while(1) { DACData_16bit_H = sFLASH_ReadByte(); ... } Функция sFLASH_ReadByte(): Код uint8_t sFLASH_ReadByte(void) { return (sFLASH_SendByte(sFLASH_DUMMY_BYTE)); } Вышеприведённые алгоритмы при получении данных не дают желаемый результат, если же читаю страницу в буфер и из буфера то всё нормальн, данные корректны: Код sFlash_ReadPageBuff1(2*528); while((sFlash_StatusRegisterRead()>>7)!=0x01); sFlash_ReadBuff1(BufInput1,528,0x00);
|
|
|
|
|
Jan 28 2013, 13:50
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174

|
Судя по даташиту команда Continuous Array Read (Legacy Command: E8H): Up to 66 MHz; требует после адресных байт 4 пустых байта для инициализации чтения (команда для старых типом микросхем вроде, для совместимости). команда Continuous Array Read (High Frequency Mode: 0BH): Up to 66 MHz; требует после адресных байт 1 пустой байт для инициализации чтения. команда Continuous Array Read (Low Frequency Mode: 03H): Up to 33 MHz не требует пустых байтов после адресных байт, но работает на меньшей частоте. На 30 странице прилагаемого вами даташита есть таблица в последней колонке которой указано количество пустых байт для каждой команды. возможно надо адреса писать так [code] sFLASH_SendByte((char)(addr_page>>2)); sFLASH_SendByte((char)(addr_page<<2)); sFLASH_SendByte(0x00); [code/]
|
|
|
|
|
Jan 28 2013, 13:55
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Basilij @ Jan 28 2013, 17:25)  Cчитывание данных: Код sFLASH_CS_LOW(); sFLASH_SendByte(0x0B); sFLASH_SendByte((char)(addr_page>>6)); sFLASH_SendByte((char)(addr_page<<2)); sFLASH_SendByte(0x00); sFLASH_SendByte(sFLASH_DUMMY_BYTE);/0xAA while(1) { DACData_16bit_H = sFLASH_ReadByte(); ... } Не понял. На сколько я понимаю (и у меня это работает) команда "Continuous Array Read" считывает данные начиная с любого адреса. Номер страницы здесь вообще не при чем. Вот мой вариант функции: Код /******************************************************************************* Read data from AT45 *******************************************************************************/ void AT45DB_Read(UINT32 addr, P_UINT8 data, UINT16 len) { IDF_CS_ON(); IDF_TxByte(AT45DB_CMD_CONT_ARRAY_READ_LF); /* 0x03 */ IDF_TxByte(LOBYTE(HIWORD(addr))); IDF_TxByte(HIBYTE(LOWORD(addr))); IDF_TxByte(LOBYTE(LOWORD(addr))); IDF_RxData(data, len); IDF_CS_OFF(); }
--------------------
|
|
|
|
|
Jan 28 2013, 15:37
|
Частый гость
 
Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190

|
Цитата(nx6310 @ Jan 28 2013, 19:50)  ... На 30 странице прилагаемого вами даташита есть таблица в последней колонке которой указано количество пустых байт для каждой команды. возможно надо адреса писать так Код sFLASH_SendByte((char)(addr_page>>2)); sFLASH_SendByte((char)(addr_page<<2)); sFLASH_SendByte(0x00); На 30-й странице для 512 байтного режима работы. Если в этой таблице смотреть на команду 0Bh, то видно, что после команды чтения, первые три байта состоят из 2 бита - незначащие, 12 бит - адрес страницы, 10 бит - адрес байта в странице откуда следует начинать чтение. В првевых двух байтах адрес расположен по середине, когда мы применяем (char) перед (addr_page>>6), у нас сначала адрес смещается вправо, грубо говоря в младшем байте остаются 6-ть значащих бит, и с помощью (char) мы этот младший байт и берём. Во втором байте нам напротив нужно чтобы справа оставалось два бита под дрес байта, мы и сдвигаем влево на 2. Цитата Код /******************************************************************************* Read data from AT45 *******************************************************************************/ void AT45DB_Read(UINT32 addr, P_UINT8 data, UINT16 len) { IDF_CS_ON(); IDF_TxByte(AT45DB_CMD_CONT_ARRAY_READ_LF); /* 0x03 */ IDF_TxByte(LOBYTE(HIWORD(addr))); IDF_TxByte(HIBYTE(LOWORD(addr))); IDF_TxByte(LOBYTE(LOWORD(addr))); IDF_RxData(data, len); IDF_CS_OFF(); } Ваш код для 512 режима. Там как раз 21 бит под адрес и выходит. Хоть знаю теперь что в 512 режиме работает, правда сам не проверял у себя.
Сообщение отредактировал Basilij - Jan 28 2013, 16:06
|
|
|
|
|
Jan 29 2013, 07:05
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Basilij @ Jan 29 2013, 09:15)  Задумался здесь, а как AT45 определяет в каком режиме мы хотим читать по коду 0x03, в 512 или 528 !? В даташите не нашёл команды которая бы указывала памяти в каком режиме ей работать. Статусный регистр PAGE_SIZE Чтобы изменить умолчание (528 на 512 однократно!!!), нужно 13. “Power of 2” Binary Page Size Option The “power of 2” page size is a onetime programmable configuration register and once the device is configured for “power of 2” page size, it cannot be reconfigured again.
|
|
|
|
|
Jan 29 2013, 08:08
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Basilij @ Jan 29 2013, 10:16)  Уважаемый Дмитрий, подскажите, верно ли я понял что, однакратно это вообще однократно, т.е после сброса питания, я уже несмогу страницу сделать размером 528, и после полной очистки всей памяти также несмогу ничего предпринять. Т.е. под словом "однократно " следует понимать необратимость процесса после перехода с 528 на 512. Верно? Спасибо за ответы! Да, именно так. Если перевести в режим 512, то режим 528 будет недоступен.
|
|
|
|
|
Jan 30 2013, 04:48
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174

|
Ну как успехи? Попробуйте команду чтения страницы памяти Main Memory Page Read. Я работаю с ней. Код void MMP_Read(int *RxData, int adr,int page, int size){int i,high, low; // Main Memory Page Read GPIO_WriteBit(GPIOA,GPIO_Pin_4, Bit_RESET); SPI_I2S_SendData(SPI1,0xD2); SPI_I2S_SendData(SPI1,adr>>6); SPI_I2S_SendData(SPI1,((adr<<2)+(page>>8))); SPI_I2S_SendData(SPI1,(char)page); SPI_I2S_SendData(SPI1,0xff); SPI_I2S_SendData(SPI1,0xff); SPI_I2S_SendData(SPI1,0xff); SPI_I2S_SendData(SPI1,0xff); for (i=0;i<size;i++){high=SPI_I2S_ReceiveData(SPI1);low=SPI_I2S_ReceiveData(SPI1); RxData[i]=(high<<8)+low;} Delay(0x9); GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); } у меня здесь adr - это номер страницы
|
|
|
|
|
Feb 12 2013, 09:48
|
Частый гость
 
Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190

|
Цитата(nx6310 @ Jan 30 2013, 10:48)  Ну как успехи? Здравствуйте. Спустя две недели вновь возвращаюсь к этой задаче. У меня возник вопрос к вам. а в page вы что передаёте, 0 или 1 ? Заранее спасибо за комментарии!
Сообщение отредактировал IgorKossak - Feb 12 2013, 21:28
Причина редактирования: избыточное цитирование
|
|
|
|
|
Feb 12 2013, 09:57
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174

|
page я всегда передаю ноль и считываю полностью страницу с номером j. пример: Код MMP_Read(std, j,0,264); считываю в массив std, элемент этого массива 16-ти битный, поэтому size= 264 а не 528.
Сообщение отредактировал nx6310 - Feb 12 2013, 10:00
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|