Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с AT25DF081
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Цифровые схемы, высокоскоростные ЦС
alexunder
Коллеги, у меня такая проблема.
Пытаюсь программировать Flash память Atmel AT25DF081 посредством SPI0 порта МК Silabs C8051F320.
Настройки SPI у меня правильные, т.к. на запрос Manufacturer and Device ID я считываю правильные 4 байта (все как в ДЩ прописано). Решил реализовать функцию полного стирания памяти (Chip Erase) и, согласно ДЩ, выполняю в такой последовательности:

1. Посылаю команду Write Enable, которая устанавливает защелку WEL
2. Делаю спец. запись в регистр статуса Global Unprotect, чтобы снять запрет на запись (как я понял, это необходимо и для стирания).
3. Снова шлю команду Write Enable, т.к. после Global Unprotect защелка WEL сбрасывается автоматически (так и должно быть в случае успешной операции записи).
4. И наконец отправляю команду Chip Erase.
5. Теперь, согласно ДЩ, мониторю бит RDY/BSY регистра статуса (один раз отправляю команду Read Status Register, а потом дёргаю SCK для вытаскивания значения регистра).

И вот тут происходит самое интересное. Иногда, после внутреннего цикла стирания (неск. секунд) ИМС выдает RDY/BSY = 0, а иногда (намного чаще) он постоянно равен единице, т.е. программа зацикливается на этом.
Помимо того что RDY/BSY=1, флаг WEL тоже частенько "любит" сидеть в лог. "1".
Код пишу на асм, переписывал несколько раз, перепроверял на кристалле по шагам и читал статус по шагам, опускал тактовую SPI до 3 кГц. Ничего не помогает побороть нестабильное поведение ИМС.

Есть такое соображение. Моя флэш низковольной серии AT25 (Vcc=1.65...1.95В), но я питаю ее от 3.3В, т.к. трехвольтовой серии AT26 не было в продаже. В ДЩ напряжение на пинах absolute max. rating для AT25 указано 3.8В, то есть вроде как она должна стабильно работать на 3.3В.
В общем, намучался я с ней. Буду рад любому совету.

Модераторам: если раздел не тот, перекиньте куда следует, пожалуйста.
Дмитрий_Б
Стоит заметить, что микросхема в режиме Absolute Maximum Rating всего лишь гарантированно не выйдет из строя. Правильное функционирование не гарантируется.
Warlockwolf
кусок исходников ST.com
у меня работает. питание 3.3
у меня AT25DF321A-SH-B .


CODE


#define sFLASH_CMD_RDSR 0x05 /*!< Read Status Register instruction */
#define sFLASH_CMD_WREN 0x06 /*!< Write enable instruction */
#define sFLASH_DUMMY_BYTE 0x00
#define sFLASH_WIP_FLAG 0x01 /*!< Write In Progress (WIP) flag */


void sFLASH_GlobalEraze()
{
sFLASH_WriteEnable();
sFLASH_CS_LOW();
sFLASH_SendByte(0x60);
sFLASH_CS_HIGH();
sFLASH_WaitForWriteEnd();
}


void sFLASH_GlobalUnprotekted()
{
sFLASH_WriteEnable();
sFLASH_CS_LOW();
sFLASH_SendByte(0x01);
sFLASH_SendByte(0x00);
sFLASH_CS_HIGH();
sFLASH_WaitForWriteEnd();

sFLASH_GlobalEraze();
}




void sFLASH_WriteEnable(void)
{
/*!< Select the FLASH: Chip Select low */
sFLASH_CS_LOW();

/*!< Send "Write Enable" instruction */
sFLASH_SendByte(sFLASH_CMD_WREN);

/*!< Deselect the FLASH: Chip Select high */
sFLASH_CS_HIGH();
}

void sFLASH_WaitForWriteEnd(void)
{
uint8_t flashstatus = 0;

/*!< Select the FLASH: Chip Select low */
sFLASH_CS_LOW();

/*!< Send "Read Status Register" instruction */
sFLASH_SendByte(sFLASH_CMD_RDSR);

/*!< Loop as long as the memory is busy with a write cycle */
do
{
/*!< Send a dummy byte to generate the clock needed by the FLASH
and put the value of the status register in FLASH_Status variable */
flashstatus = sFLASH_SendByte(sFLASH_DUMMY_BYTE);

}
while ((flashstatus & sFLASH_WIP_FLAG) == SET); /* Write in progress */

/*!< Deselect the FLASH: Chip Select high */
sFLASH_CS_HIGH();
}

alexunder
Warlockwolf
Спасибо, но проблема не с кодом. Ваша ИМС AT25DF321A-SH-B по datasheet расчитана на 3.3 В режим (Single 2.7V - 3.6V Supply), в то время как AT25DF081 для низковольтных систем (Single 1.65V - 1.95V Supply).

Дмитрий_Б,
пожалуй, вы правы. Сегодня раздобыл и запаял SST25VF080, она полностью аналогична по функционалу и питанию искомой AT26DF081 (2.7В...3.6В). Все прекрасно работает.
Видимо, мне стоило обратить внимание на сноску у Absolute maximum ratings cranky.gif
Мур
Обнаружилась проблема взаимодействия ПЛИС с EEPROM AT25080B\AT25160B. Речь идет о записи в неё массива. Как частный случай всех нулей. Мой автомат производит управление и чтением\записью управляя регистром состояния. Время записи одной ячейки 1.8мС, как видно по состоянию готовности к записи. Удивительно, но при посмотре осцилом результата записи нулей видны некоторые необнуленные ячейки. Каждый акт нового прописывания сокращает их число, но не полностью. полная очистка получается после 3х-4х циклов обнуления.
1. Может ли это быть результатом деградации ячеек вследствие окончания рессурса.
2. Может это эффект от короткого времени запрета готовности 1.8мС, который по доке может достигать 5мС.
SCK-5МГц. Времена сигналов CS и данных разнесены к SCK по доке.

Что предпринять для решения проблемы?

1. Искусственно ввести задержку на новую запись после формальной готовности?
2. Что говорит опыт форумчан в подобном случае? На что обратить внимание?

Тут скриншот(c МоделСима) цикла записи кода 33h

Ну ведь нормально работало!...
Мур
Пришлось написать адаптивный алгоритм записи в EEPROM с контрольной проверкой чтением. На стенде погонял записью-чтением счетчика. Наблюдаю расхождение по времени записи в ячейки в 100 раз.(1Мгц SCK), т е 300 ячеек могут записываться от 2 сек до 3 мин. Сбоев нет, но такое время записи не подходит!..
Мур
Все из-за шустрости FPGA! Достаточно сделать паузу хотя бы 0.8uS(лог '1') по CS после последнего "неудачного" (не готово на запись) чтения слова состояния И все заработало штатно... Ура!
Мур
Цитата(Мур @ Jan 23 2012, 14:07) *
Все из-за шустрости FPGA! Достаточно сделать паузу хотя бы 0.8uS(лог '1') по CS после последнего "неудачного" (не готово на запись) чтения слова состояния И все заработало штатно... Ура!


И еще важно! Читать содержимое после записи не стоит часто, а выждать время (в моем случае 1.8мС-готовность к записи по внутреннему автомату).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.