Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с AT45DB041D
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Мария Е
Добрый день!

Работают в связке МК 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


Запись страницы и чтение в рамках одной страницы происходят корректно.
kovigor
Цитата(Мария Е @ 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 ...
Мария Е
Цитата(kovigor @ Aug 26 2013, 11:11) *
Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ?
И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный.
Все должно работать, т.к. в даташите написано:


Буфер, в который читаю, не переполняется. На данный момент он 9 байт, я 9 байт и считываю. Даже, если увеличить буфер в два раза, тоже самое. Т.е. пока считывание идет с одной страницы все ок, а когда переходит на другую - 0xff.

Ну, 32-разрядные типы не нужны для моей задачи. Для номера страницы, смещения в байтах и количества считываемых байт использую 16-разрядные типы. При этом номер страницы 280, смещение 255 ( например) и количество байт 9, т.е. нет поводов для переполнения.
kovigor
Цитата(Мария Е @ 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

Может, у вас из-за этого адрес внутри ИС сбивается ...
Мария Е
Цитата(kovigor @ Aug 26 2013, 11:41) *
Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ?


Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую.

Как это функции удобно?! Она должна работать, как написано в datasheet. Там никаких ограничений на количество байт нет.

Если читать две страницы подряд, то все равно первая страница читается правильно, а вторая - 0xff.

Цитата(kovigor @ Aug 26 2013, 11:41) *
А CS вы для чего снимаете ? В даташите четко написано:

Может, у вас из-за этого адрес внутри ИС сбивается ...


Я снимаю CS, когда заканчиваю считывать нужное мне количество байт. Не вижу противоречия с ds
kovigor
Цитата(Мария Е @ Aug 26 2013, 11:17) *
Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую.

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

Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал.
kovigor
Цитата(Мария Е @ Aug 26 2013, 17:17) *
Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал.

Вот бы еще CS в это время (в момент смены страниц) увидеть. Может, он у вас в единичку встает ? А если не встает, тогда в микросхеме действительно "эфки" записаны. Запишите туда что-нибудь, удостоверьтесь в успешности записи, а потом читайте. Я же говорил: осциллограф - самый полезный прибор ...
AHTOXA
Цитата(Мария Е @ 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 чипы совсем другого производителя.
Мария Е
Цитата(AHTOXA @ Aug 26 2013, 20:45) *
По-моему, для 256-байтовой страницы вы неправильно формируете адрес.
Надо так:
старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице.

И ещё, проверьте Manufacturer and Device ID. А то мне недавно вполне надёжный поставщик прислал перемаркированные под AT25DF641A чипы совсем другого производителя.



Спасибо за подсказку a14.gif . действительно, проблема была в формировании адреса. Функция была написана для размера страницы 264. А когда я перешла на 256, забыла переписать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.