Вход

Просмотр полной версии : Алгоритм и тайминги прошивки EEPROM (Flash)



newart
23.07.2015, 18:03
Имею отладочную плату STM32F4 Discovery


К ней припаяна панелька для EEPROM. Процесс прошивки работает очень странно, например в AT29C010 прошивка происходит только если прошиваю первые 4 сектора. Если больше то процесс прошивки не происходит.

В плане алгоритма прошивки это вроде самые простые флешки. То есть не надо никаких кодов записи отсылать.
Вероятно где-то косяк с таймингами.
Если все верно понял, нужно слать данные одного сектора, в этом процесс может проходить почти без задержек.
Потом нужно выждать некоторое время что флешка из буфера успела записать данные в память.
И так пройтись по всем секторам. Экспериментально установить нужную задержку не получилось, а с указаной в даташите работает как-то не так.

В чем может быть проблема?

Вот так выглядит попытка прошивать https://dl.dropboxusercontent.com/u/6439155/1%230.ORI
Я пробовал писать сплошные числа, 01,03,170 итп. Видно что их раскидало по памяти как-то не понятно.

https://dl.dropboxusercontent.com/u/6439155/top.jpg
https://dl.dropboxusercontent.com/u/6439155/bottom.jpg

Вот исходник:



SET_DATA_MODE_OUT

uint16_t sector = 0;
uint16_t byte = 0;
uint16_t addr = 0;
uint8_t d = 1;
uint8_t data = 0;

OE_HIGH;
CE_HIGH;
WE_HIGH;

Delay(0xfffff);

for (sector=0; sector<256; sector++) {

for (byte=0; byte<128; byte++) {

addr = (sector << 7 ) | byte;
data = rom_gb[addr];

OE_HIGH;

ADDR_OUT = addr;

WE_LOW;

DATA_OUT = (uint16_t)data << 8;

Delay(d);

WE_HIGH;
OE_LOW;

Delay(d);

}

Delay(300);

}



Функция Delay дает задержку в uS. То есть 300 это примерно 200 uS.

Полинг не использую, так-как не очень понял как это правильно делать.

Посмотрел в сорцах к Wylliam програмеру, там задержка между секорами 17ms. У меня же при больших задержках запись похоже вообще не происходит. Ну то есть скали скажем выставить ее в 1 секунду.

Denn поделился своим опытом с неэкранированым кабелем, но я думаю дело не в этом. В инете похожие схемы выглядят еще более страшно и витьевато чем у меня и ведь работают.


Где искать подвох? Ну или сорцы с записью 29 серии? В сорцах к Wylliam есть только 27 и 28.

---------- Post added at 18:59 ---------- Previous post was at 18:57 ----------

Дело осложняетс тем что я не могу на комп считать данные и проконтролировать то что записал.

---------- Post added at 19:03 ---------- Previous post was at 18:59 ----------

Изначально код был такой:




for (byte=0; byte<128; byte++) {

addr = (sector << 7 ) | byte;
data = rom_gb[addr];

OE_HIGH;

ADDR_OUT = addr;

CE_LOW;
WE_LOW;

DATA_OUT = (uint16_t)data << 8;

Delay(d);

WE_HIGH;
CE_HIGH;

Delay(d);

}




Даташиты

http://www.soselectronic.cz/a_info/resource/c/Atmel/AT29C010A.pdf

HardWareMan
23.07.2015, 18:35
1. Плешка 5В, контроллер 3.3В. Где преобразователи уровня?
2. Плешка JEDEC, для записи требуются определенные телодвижения, где они в коде?

newart
24.07.2015, 07:55
1. Плешка 5В, контроллер 3.3В. Где преобразователи уровня?
Дак по идее ей как и SRAM и всему прочему хватает этих 3.3 вольта чтобы воспринять их за HIGH.



2. Плешка JEDEC, для записи требуются определенные телодвижения, где они в коде?
Какие? Что это значит?

HardWareMan
24.07.2015, 10:42
Например, вот (http://www.allcomponents.ru/pdf/winbond/w29ee01115.pdf):
http://savepic.su/5849612.png
Если не разблокировать запись - ничего не запишется. А если не заблокировать - стерётся.

Denn
31.07.2015, 12:50
Советую обратить внимание на толщину GND по пути к ПЗУхе. Когда много сигнальных шин находятся в лог."1", то суммарная толщина плюсового потенциала, подводимого к ПЗУ многократно превышает толщину общего провода. В момент перезаряда паразитных ёмкостей ПЗУ с уровнем лог."0" может твориться чёрте что.