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