Имею отладочную плату STM32F4 Discovery
К ней припаяна панелька для EEPROM. Процесс прошивки работает очень странно, например в AT29C010 прошивка происходит только если прошиваю первые 4 сектора. Если больше то процесс прошивки не происходит.
В плане алгоритма прошивки это вроде самые простые флешки. То есть не надо никаких кодов записи отсылать.
Вероятно где-то косяк с таймингами.
Если все верно понял, нужно слать данные одного сектора, в этом процесс может проходить почти без задержек.
Потом нужно выждать некоторое время что флешка из буфера успела записать данные в память.
И так пройтись по всем секторам. Экспериментально установить нужную задержку не получилось, а с указаной в даташите работает как-то не так.
В чем может быть проблема?
Вот так выглядит попытка прошивать https://dl.dropboxusercontent.com/u/6439155/1%230.ORI
Я пробовал писать сплошные числа, 01,03,170 итп. Видно что их раскидало по памяти как-то не понятно.
Вот исходник:
Код:
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 ----------
Изначально код был такой:
PHP код:
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/r.../AT29C010A.pdf