FLASH读SPARE的问题
我的FLASH是K9F1208,在读写数据(没有SPARE)的时候完全正确(这个驱动已经用了几年了),但现在要读取SPARE数据,当只读前面的15个字节的SPARE时,DATA和SPARE都正确,但当要读第16位字节的SPARE,就出现问题。
出现的问题现象:
ReadPage(150*32+1,RAM+512,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(151*32,RAM+512*2,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(151*32+1,RAM+512*3,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(152*32,RAM+512*4,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(152*32+1,RAM+512*5,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(153*32,RAM+512*6,SPARE);
if(SPARE[5]!=0xff)
while(1);
ReadPage(153*32+1,RAM+512*7,SPARE);
假设连续读几个块和扇区的数据时,分两种情况:
全速运行:
当不读取SPARE的第16数据时,数据就完全正确;而读取第16位SPARE数据时,就会出现错误,也就是说会停留在while(1)这里,而此时的DATA和SPARE数据均为0;
单步运行:
如果ReadPage(152*32+1,RAM+512*5,SPARE);在这里设断点,相当于一次读一个扇区的数据,数据就完全正确,就算是读取SPARE的第16位数据也正确。
void ReadPage(U32 addr, U8 *buf,U8 *spare)
{
U16 i;
U32 Mecc, Secc,tspare;
NFChipEn();
WrNFCmd(READCMD0);
WrNFAddr(0);
WrNFAddr(addr);
WrNFAddr(addr>>8);
if(NandAddr)
WrNFAddr(addr>>16);
InitEcc();
for(i=0; i<10; i++);
WaitNFBusy();
for(i=0; i<512; i++)
buf[i] = RdNFDat();
SEccLock();
spare[0]=RdNFDat();
spare[1]=RdNFDat();
spare[2]=RdNFDat();
spare[3]=RdNFDat();
//tspare=RdNFDat32(); // read 4~7
spare[4]=RdNFDat();
spare[5]=RdNFDat();
spare[6]=RdNFDat();
spare[7]=RdNFDat();
///Secc=RdNFDat32();
//rNFSECCD=((Secc&0xff00)<<8)|(Secc&0xff);
spare[8]=RdNFDat();
spare[9]=RdNFDat();
spare[10]=RdNFDat();
spare[11]=RdNFDat();
//tspare=RdNFDat32(); // read 12~15
spare[12]=RdNFDat();
spare[13]=RdNFDat();
spare[14]=RdNFDat();
spare[15]=RdNFDat();//如果把这句语句屏蔽掉,数据就完全正确
NFChipDs();
}