Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Забывчивость" AT45DB161
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Цифровые схемы, высокоскоростные ЦС
smalcom
Используем ИМС AT45DB161D. Запасы и только для старого оборудования.
Столкнулись с проблемой потери данных. При проверке использовался логический анализатор, поэтому наличие этой проблемы подтверждено и визуально тоже.
Порядок действий:
1. Записываем ~50 кБ данных(проводили аналогичный тест с размером блока данных ~3 кБ).
2. После записи сразу считываем и проверяем. Все данные верны.
3. Ожидаем несколько секунд и выполняем повторное считывание. Появляются чистые страницы: записаны 0xFF.
4. Ожидаем ещё несколько секунд. Вся ранее записанная область становится чистой: записаны 0xFF.

ИМС подключена длинными проводами - ~10 см. Вначале грешили на это и установили резисторы 20 Ом со стороны ИМС памяти на линии MOSI, MISO, SCK. Ситуация не изменилась.
Питание от TPS76333. Частота SCK: ~50 кГц.
На этом же SPI рядом сидит FRAM FM25CL16B. С FRAM подобных проблем не обнаружено. Во время тестов с Flash, к FRAM обращений не выполнялось.

Подскажите, что это за мистика может быть такая.
mcheb
Цитата(smalcom @ Mar 27 2015, 13:14) *
2. После записи сразу считываем и проверяем. Все данные верны.
3. Ожидаем несколько секунд и выполняем повторное считывание. Появляются чистые страницы: записаны 0xFF.

Попробуйте поменять пункты 2 и 3. Похоже, что после записи к памяти нельзя обращаться,пока она не запишется.
smalcom
Нет-нет, я перед записью или чтением всегда проверяю флаг доступности в регистре статуса.
_4afc_
Стабильно терялись данные в AT45DB321D если стоящий над ней небольшой тор излучал ВЧ сигнал.
Часто терялись данные при дребезге питания платы (плохой разъём).
Шились через компьютер очень долго, поэтому в основном их зашивал тот камень что от них и запускался.
Была партия в которых дальше 120 страницы записать не удавалось - приходилось учиться писать короткий код.

Статус не считывал - ставил паузы в 100...500мС между действиями.

CODE
#define MaxPages (120)

unsigned char Buf[520];
unsigned char BufR[520];

void ErasePage(unsigned char *pD,unsigned int A)
{
int i;
Buf[0]=0x81;
Buf[1]= ((A & 0x00FF0000) >> 16);
Buf[2]= ((A & 0x0000FF00) >> 8);
Buf[3]= ((A & 0x000000FF) >> 0);

Spi_OFF(); PauseMC(100);
Spi_ON(); PauseMC(100);

for (i=0;i<(4);i++) SpiRW(Buf[i]);
PauseMC(100);
Spi_OFF(); PauseMC(500);
}

void WritePage(unsigned char *pD,unsigned int A)
{
int i;
Buf[0]=0x82;
Buf[1]= ((A & 0x00FF0000) >> 16);
Buf[2]= ((A & 0x0000FF00) >> 8);
Buf[3]= ((A & 0x000000FF) >> 0);

for (i=0;i<512;i++) Buf[i+4]=pD[i];


Spi_OFF(); PauseMC(100);
Spi_ON(); PauseMC(100);

for (i=0;i<(512+4);i++) SpiRW(Buf[i]);
PauseMC(100);
Spi_OFF(); PauseMC(100);
}

void ReadPage(unsigned char *pD,unsigned int A)
{
int i;
Buf[0]=0xE8;
Buf[1]= ((A & 0x00FF0000) >> 16);
Buf[2]= ((A & 0x0000FF00) >> 8);
Buf[3]= ((A & 0x000000FF) >> 0);
Buf[4]=0;
Buf[5]=0;
Buf[6]=0;
Buf[7]=0;
Buf[8]=0;

Spi_OFF(); PauseMC(100);
Spi_ON(); PauseMC(100);
for (i=0;i<8;i++) SpiRW(Buf[i]);
for (i=0;i<(512);i++) pD[i]=SpiRW(Buf[i]);

PauseMC(100);
Spi_OFF(); PauseMC(100);
}

void EraseFlash(void)
{
unsigned int i;
//Erase
for (i=0;i<(MaxPages*512);i+=512)
{
ErasePage(&FlashData[i],i);
Print0VH(i/0x200+1,"PageErase 50/");
}
}
void WriteFlash(void)
{
unsigned int i;
//write
for (i=0;i<(MaxPages*512);i+=512)
{
WritePage(&FlashData[i],i);
Print0VH(i/0x200+1,"PageWrite 50/");
}
}
void TestFlash(void)
{
unsigned int i,j;
//test
for (j=0;j<MaxPages;j++)
{
ReadPage(&BufR[0],j*0x200);
Print0VH(j,"PageTest");
for (i=0;i<512;i++) if (BufR[i]!=FlashData[j*0x200+i]) Print0VH(j*0x200+i,"Error ");
}
}
void PrintFlash(void)
{
unsigned int i,j;
//read & print
for (j=0;j<MaxPages;j++)
{
ReadPage(&BufR[0],j*0x200);
Print0VH(j,"PageRead");
for (i=0;i<512;i++) Print0VHM(BufR[i],16);Print0VHM(0,0);
}
}
PageSize512(void)
{
unsigned char V[5];

Spi_OFF();
PauseMC(100);
Spi_ON();
PauseMC(2);

//--- Programmed to 512--------
V[0]=SpiRW(0x3D);
V[1]=SpiRW(0x2A);
V[2]=SpiRW(0x80);
V[3]=SpiRW(0xA6);
//-----------------------------------

PauseMC(2);
Spi_OFF();


PrintClock("SPI end");

Print0VH(V[0],"1=");
Print0VH(V[1],"2=");
Print0VH(V[2],"3=");
Print0VH(V[3],"4=");
}
VerifyFlashStatus(void)
{
unsigned char V[5];

Spi_OFF();
PauseMC(100);
Spi_ON();
PauseMC(2);

//--- Verify Status register--------
V[0]=SpiRW(0xD7);
V[1]=SpiRW(0x00); // reply 0xB4 if 528, 0xB5 if 512
V[2]=SpiRW(0x00); // reply 0xB4 if 528, 0xB5 if 512
V[3]=SpiRW(0x00); // reply 0xB4 if 528, 0xB5 if 512
//-----------------------------------

PauseMC(2);
Spi_OFF();


PrintClock("SPI end");

Print0VH(V[0],"1=");
Print0VH(V[1],"2=");
Print0VH(V[2],"3=");
Print0VH(V[3],"4=");
}
//-----------------------------------------------------

int main( void )
{
printf("CoreA: started\n");
Init_UART();
CheckClock();
Spi_Init();

//while(1)
Print0("FlashInit");


EraseFlash();

WriteFlash();
TestFlash();
//PrintFlash();

//==========================================================================
//VerifyFlashStatus(); // reply 0xB4 if 528, 0xB5 if 512

//PageSize512();

while(1);
return 0;
}

mcheb
Цитата(_4afc_ @ Mar 27 2015, 18:59) *
Стабильно терялись данные в AT45DB321D если стоящий над ней небольшой тор излучал ВЧ сигнал.

Можно здесь поподробнее? Как тор небольшой может излучать ВЧ сигнал?
smalcom
Трагичная ИМС.
У меня выше и сбоку в нескольких сантиметрах как раз стоит L5973D. Попробую приведённый код.
_4afc_
Цитата(mcheb @ Mar 27 2015, 19:07) *
Можно здесь поподробнее? Как тор небольшой может излучать ВЧ сигнал?


Передатчик и приёмник были соединены по двухпроводной линии на расстоянии нескольких сотен метров через трансформаторы на торе.
На вход модулятора передатчика выдавалась последовательность через MOSI поступавшая на ЧМ модулятор в диапазоне КВ.
Если разработчик передатчика обновлял прошивку AT45 не отключив его от линии, то после этого приёмник не работал с вероятностью 100% т.к. первая страница его прошивки почему-то содержала нули.
Конструктивно тор приёмника диаметром 10мм располагался этажеркой выше AT45 на пару миллиметров.

В следующей версии системы тор приёмника был перемещён в сторону от AT45 и модулятор подключен на другую ногу - проблемы исчезли!
Что было источником проблем - магнитное поле от тора или то, что помеха содержала модулированные коды стирания и прошивки AT45 - я не знаю.
smalcom
Разнёс в пространстве память и стабилизатор. Проблема осталась. Теперь попробую идею с более длинными паузами между действиями.
_4afc_
Цитата(smalcom @ Apr 10 2015, 15:50) *
Разнёс в пространстве память и стабилизатор. Проблема осталась. Теперь попробую идею с более длинными паузами между действиями.


Не забудте, что чтение статуса - тоже действие. А лучше статус вообще не долбить...
uriy
Используем AT45DB161D, а пследнее время AT45DB161E уже лет 5. Изделий по несколько тысяч в год.
Плата стоит в радиостанции. В нескольких сантиметрах от микросхемы антенна излучает мощность 5 Вт.
Частоты VHF и UHF.
Из памяти грузиться DSP процессор и там же хранятся данные.
Не встречал проблемы порчи данных со временем.
__Sergey_
1. Смотрите питание внимательно - возможно есть выбросы при включении, или работе кокой-нибудь силы.
2. Сильное электрическое поле в районе микросхемы (цепи более 100В в непосредственной близости.)
3. Выбросы напряжения на SPI на много больше пределов питания, например от затекания статики через внешние разъемы и элементы схемы.
4. Может просто попалась битая партия флешек - приет о китайцев?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.