|
|
  |
Проблемы с AT45DB041D, некорректное непрерывное чтение |
|
|
|
Aug 26 2013, 06:57
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424

|
Добрый день! Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff. В чем может быть проблема? Не могу понять( CODE void continuous_low_freq_read(unsigned char* in_data, unsigned int page_address, unsigned int byte_address, unsigned int byte_count) { unsigned char dummy; unsigned int i; set_address_bytes(page_address,byte_address); chip_select(); // opcode dummy=SPI_TX_RX(comm_cont_read_low); // three address bytes for (i=0;i<3;i++) dummy=SPI_TX_RX(spi_addr_byte[i]); // input data for (i=0; i<byte_count; i++) in_data[i]=SPI_TX_RX(0xaa); chip_deselect(); } unsigned char SPI_TX_RX(unsigned char data) { SPIC.DATA=data; while(!(SPIC.STATUS&SPI_IF_bm)); return SPIC.DATA; } void set_address_bytes(unsigned int page_address, unsigned int byte_address) { unsigned int temp; temp=page_address; temp>>=7; spi_addr_byte[0]=(unsigned char) temp; temp=(page_address&0x007F); temp<<=1; spi_addr_byte[1]=((unsigned char)(temp))|((unsigned char)(byte_address>>8)); spi_addr_byte[2]=(unsigned char)(byte_address); } #define chip_select() PORTD.OUT&= ~0x02 #define chip_deselect() PORTD.OUT|= 0x02
// command codes for at45
#define comm_cont_read_low 0x03
Запись страницы и чтение в рамках одной страницы происходят корректно.
|
|
|
|
|
Aug 26 2013, 07:11
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Мария Е @ Aug 26 2013, 09:57)  В чем может быть проблема? Не могу понять( Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ? И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный. Все должно работать, т.к. в даташите написано: Цитата When the end of a page in the main memory is reached during a Continuous Array Read, the device will continue reading at the beginning of the next page ...
|
|
|
|
|
Aug 26 2013, 07:33
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424

|
Цитата(kovigor @ Aug 26 2013, 11:11)  Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ? И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный. Все должно работать, т.к. в даташите написано: Буфер, в который читаю, не переполняется. На данный момент он 9 байт, я 9 байт и считываю. Даже, если увеличить буфер в два раза, тоже самое. Т.е. пока считывание идет с одной страницы все ок, а когда переходит на другую - 0xff. Ну, 32-разрядные типы не нужны для моей задачи. Для номера страницы, смещения в байтах и количества считываемых байт использую 16-разрядные типы. При этом номер страницы 280, смещение 255 ( например) и количество байт 9, т.е. нет поводов для переполнения.
Сообщение отредактировал Мария Е - Aug 26 2013, 07:35
|
|
|
|
|
Aug 26 2013, 07:41
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Мария Е @ Aug 26 2013, 10:33)  я 9 байт и считываю Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ? А CS вы для чего снимаете ? В даташите четко написано: Цитата The CS pin must remain low during the loading of the opcode, the address bytes, and the reading of data. When the end of a page in the main memory is reached during a Continuous Array Read, the device will continue reading at the beginning of the next page Может, у вас из-за этого адрес внутри ИС сбивается ...
|
|
|
|
|
Aug 26 2013, 08:17
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424

|
Цитата(kovigor @ Aug 26 2013, 11:41)  Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ? Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую. Как это функции удобно?! Она должна работать, как написано в datasheet. Там никаких ограничений на количество байт нет. Если читать две страницы подряд, то все равно первая страница читается правильно, а вторая - 0xff. Цитата(kovigor @ Aug 26 2013, 11:41)  А CS вы для чего снимаете ? В даташите четко написано:
Может, у вас из-за этого адрес внутри ИС сбивается ... Я снимаю CS, когда заканчиваю считывать нужное мне количество байт. Не вижу противоречия с ds
Сообщение отредактировал Мария Е - Aug 26 2013, 08:21
|
|
|
|
|
Aug 26 2013, 08:57
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Мария Е @ Aug 26 2013, 11:17)  Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую. Разумных объяснений три: или сбивается адрес внутри ИС, или там реально записаны 0xff, или у вас в программе ошибка. Вы читаете 9 байт, так, что первая их часть попадает в конец первой страницы, а вторая часть - в начало второй страницы ? Не люблю гадать. И без осциллографа почти никогда и ничего не отлаживаю. Самый полезный прибор - осциллограф. Записываете в страницы хорошо различимые на экране осциллографа последовательности (например, 0xaa в одну страницу и 0xcc в следующую) и смотрите, что реально приходит из микросхемы. Байт у вас всего девять, проблем не должно быть. Гадать можно до бесконечности ...
|
|
|
|
|
Aug 26 2013, 14:17
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424

|
Картинка с осциллографа:
Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал.
|
|
|
|
|
Aug 26 2013, 16:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Мария Е @ Aug 26 2013, 12:57)  Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff. По-моему, для 256-байтовой страницы вы неправильно формируете адрес. Надо так: старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице. И ещё, проверьте Manufacturer and Device ID. А то мне недавно вполне надёжный поставщик прислал перемаркированные под AT25DF641A чипы совсем другого производителя.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 27 2013, 06:31
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424

|
Цитата(AHTOXA @ Aug 26 2013, 20:45)  По-моему, для 256-байтовой страницы вы неправильно формируете адрес. Надо так: старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице.
И ещё, проверьте Manufacturer and Device ID. А то мне недавно вполне надёжный поставщик прислал перемаркированные под AT25DF641A чипы совсем другого производителя. Спасибо за подсказку  . действительно, проблема была в формировании адреса. Функция была написана для размера страницы 264. А когда я перешла на 256, забыла переписать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|