реклама на сайте
подробности

 
 
> Проблемы с AT25DF081, при вызове Chip Erase флаг RDY/BSY постоянно висит в лог. 1
alexunder
сообщение Jun 27 2011, 19:23
Сообщение #1


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Коллеги, у меня такая проблема.
Пытаюсь программировать 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В.
В общем, намучался я с ней. Буду рад любому совету.

Модераторам: если раздел не тот, перекиньте куда следует, пожалуйста.


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
Дмитрий_Б
сообщение Jul 4 2011, 18:59
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 211
Регистрация: 25-10-09
Пользователь №: 53 195



Стоит заметить, что микросхема в режиме Absolute Maximum Rating всего лишь гарантированно не выйдет из строя. Правильное функционирование не гарантируется.
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Jul 4 2011, 19:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



кусок исходников 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();
}



Сообщение отредактировал Warlockwolf - Jul 4 2011, 19:30
Go to the top of the page
 
+Quote Post
alexunder
сообщение Jul 4 2011, 20:26
Сообщение #4


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



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


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
Мур
сообщение Jan 5 2012, 12:14
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



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

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

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

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

Ну ведь нормально работало!...
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Мур
сообщение Jan 19 2012, 11:35
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Пришлось написать адаптивный алгоритм записи в EEPROM с контрольной проверкой чтением. На стенде погонял записью-чтением счетчика. Наблюдаю расхождение по времени записи в ячейки в 100 раз.(1Мгц SCK), т е 300 ячеек могут записываться от 2 сек до 3 мин. Сбоев нет, но такое время записи не подходит!..
Go to the top of the page
 
+Quote Post
Мур
сообщение Jan 23 2012, 10:07
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Все из-за шустрости FPGA! Достаточно сделать паузу хотя бы 0.8uS(лог '1') по CS после последнего "неудачного" (не готово на запись) чтения слова состояния И все заработало штатно... Ура!
Go to the top of the page
 
+Quote Post
Мур
сообщение Jan 25 2012, 10:52
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Цитата(Мур @ Jan 23 2012, 14:07) *
Все из-за шустрости FPGA! Достаточно сделать паузу хотя бы 0.8uS(лог '1') по CS после последнего "неудачного" (не готово на запись) чтения слова состояния И все заработало штатно... Ура!


И еще важно! Читать содержимое после записи не стоит часто, а выждать время (в моем случае 1.8мС-готовность к записи по внутреннему автомату).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016