Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F100 + AT35DB161 + Continuous Array Read
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Basilij
Господа.
По данной пробелме создавал тему в другой ветке форума 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);
nx6310
Судя по даташиту команда 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/]
prottoss
Цитата(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();
}
Basilij
Цитата(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
Задумался здесь, а как AT45 определяет в каком режиме мы хотим читать по коду 0x03, в 512 или 528 !?
В даташите не нашёл команды которая бы указывала памяти в каком режиме ей работать.
DmitryM
Цитата(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.
Basilij
Уважаемый Дмитрий, подскажите, верно ли я понял что, однакратно это вообще однократно, т.е после сброса питания, я уже несмогу страницу сделать размером 528, и после полной очистки всей памяти также несмогу ничего предпринять. Т.е. под словом "однократно " следует понимать необратимость процесса после перехода с 528 на 512. Верно?
Спасибо за ответы!
DmitryM
Цитата(Basilij @ Jan 29 2013, 10:16) *
Уважаемый Дмитрий, подскажите, верно ли я понял что, однакратно это вообще однократно, т.е после сброса питания, я уже несмогу страницу сделать размером 528, и после полной очистки всей памяти также несмогу ничего предпринять. Т.е. под словом "однократно " следует понимать необратимость процесса после перехода с 528 на 512. Верно?
Спасибо за ответы!

Да, именно так. Если перевести в режим 512, то режим 528 будет недоступен.
nx6310
Ну как успехи? Попробуйте команду чтения страницы памяти 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 - это номер страницы
Basilij
Цитата(nx6310 @ Jan 30 2013, 10:48) *
Ну как успехи?



Здравствуйте.
Спустя две недели вновь возвращаюсь к этой задаче. У меня возник вопрос к вам. а в page вы что передаёте, 0 или 1 ?
Заранее спасибо за комментарии!
nx6310
page я всегда передаю ноль и считываю полностью страницу с номером j.
пример:
Код
MMP_Read(std, j,0,264);

считываю в массив std, элемент этого массива 16-ти битный, поэтому size= 264 а не 528.
uriy
Проверьте корректно ли у вас считываются регистры содержимое которых известно - статусный регистр, код производителя.
У меня тоже были проблемы http://electronix.ru/forum/index.php?showt...t&p=1118249
Basilij
Да, эти все регистры считываются корректно. Все режимы нормально работают за исключением полностью потокового чтения(Continuous Array Read). Сделал как nx6310 рекомендовал в 9 сообщении, тоже заработало. А вот режим чтение Continuous Array Read нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.