Стабильно терялись данные в 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;
}