Было в свое время разработано устройство на микроконтроллере LPC1778 и флешке AT45DB081D-SSU. Последняя использовалась для хранения таблиц с коэффициентами. Эту флешку постранично могло обновлять программное обеспечение. Запись во флешку делается при помощи команды 0x82 (Main Memory Page Program through Buffer 1 with Built-In Erase), для чтения использую 0xD2 (Main Memory Page Read). Все работало замечательно, пока AT45DB081D-SSU не сняли с производства. На замену ей пришла AT45DB081E от Adesto, которую мы установили в новую партию. И тут начались чудеса. После создания тестовых программ, выяснилось, что данные записываются некорректно, причем может во всей памяти записаться некорректно один байт, а может и вся страница, а может и все нормально записаться. Причем это не от чего не зависит, глючит спонтанно. Даже ввели верификацию страниц и повторную запись. Однако выяснилось, что контрольная сумма данных не совпадала, даже когда постраничная верификация и перезаписть проходила на ОК. Т.е. запись одной страницы может убить данных в другой. Думали, что флешки бракованные. Купили в проверенном месте - тоже самое.
Подскажите, в чем может быть причина?
Функция записи страницы приведена ниже. (используется 264 байтная страница)
Код
BOOL at45db081d::write264(WORD page, BYTE *pBuf)
{
unsigned int i;
if(page > MAX_PAGES)
return FALSE;// FALSE;
SET_AT45D_CS();
reg[0] = 0x82;
reg[1] = page >> 7;
reg[2] = page << 1;
reg[3] = 0x00;
pSpi->transfer(reg, 4);
pSpi->transfer(buf, 264);
CLR_AT45D_CS();
for(i = 0xFFFFFFFF; i > 0; i--)
{
if(status() & 0x80)
break;
}
if(i == 0)
return FALSE;
if(status() & 0x20) // EPE bit
return FALSE;
return TRUE;
}
{
unsigned int i;
if(page > MAX_PAGES)
return FALSE;// FALSE;
SET_AT45D_CS();
reg[0] = 0x82;
reg[1] = page >> 7;
reg[2] = page << 1;
reg[3] = 0x00;
pSpi->transfer(reg, 4);
pSpi->transfer(buf, 264);
CLR_AT45D_CS();
for(i = 0xFFFFFFFF; i > 0; i--)
{
if(status() & 0x80)
break;
}
if(i == 0)
return FALSE;
if(status() & 0x20) // EPE bit
return FALSE;
return TRUE;
}