Перейти к содержанию
    

Проблемы с AT45DB041D

Добрый день!

 

Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff.

В чем может быть проблема? Не могу понять(

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

 

Запись страницы и чтение в рамках одной страницы происходят корректно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чем может быть проблема? Не могу понять(

Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ?

И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 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 ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ?

И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный.

Все должно работать, т.к. в даташите написано:

 

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

 

Ну, 32-разрядные типы не нужны для моей задачи. Для номера страницы, смещения в байтах и количества считываемых байт использую 16-разрядные типы. При этом номер страницы 280, смещение 255 ( например) и количество байт 9, т.е. нет поводов для переполнения.

Изменено пользователем Мария Е

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ?

 

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

 

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

 

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

 

А CS вы для чего снимаете ? В даташите четко написано:

 

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

 

Я снимаю CS, когда заканчиваю считывать нужное мне количество байт. Не вижу противоречия с ds

Изменено пользователем Мария Е

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Разумных объяснений три: или сбивается адрес внутри ИС, или там реально записаны 0xff, или у вас в программе ошибка.

Вы читаете 9 байт, так, что первая их часть попадает в конец первой страницы, а вторая часть - в начало второй страницы ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Картинка с осциллографа:

post-32424-1377526521_thumb.jpg

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот бы еще CS в это время (в момент смены страниц) увидеть. Может, он у вас в единичку встает ? А если не встает, тогда в микросхеме действительно "эфки" записаны. Запишите туда что-нибудь, удостоверьтесь в успешности записи, а потом читайте. Я же говорил: осциллограф - самый полезный прибор ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff.

По-моему, для 256-байтовой страницы вы неправильно формируете адрес.

Надо так:

старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице.

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, для 256-байтовой страницы вы неправильно формируете адрес.

Надо так:

старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице.

 

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

 

 

Спасибо за подсказку :a14: . действительно, проблема была в формировании адреса. Функция была написана для размера страницы 264. А когда я перешла на 256, забыла переписать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...