- UID
- 1029342
- 性别
- 男
|
5) NAND 的读操作
static int NF_ReadPage(U32 block,U32 page,U8 *buffer) //读Flash
{
int i;
unsigned int blockPage;
U8 ecc0,ecc1,ecc2;
U8 *bufPt=buffer;
U8 se[16];
page=page&0x1f; //32页
blockPage=(block //1Bolck包含32页
NF_RSTECC(); // Initialize ECC
NF_nFCE_L();
NF_CMD(0x00); // Read command
NF_ADDR(0); // Column = 0
NF_ADDR(blockPage&0xff); //
NF_ADDR((blockPage>>8)&0xff); // Block & Page num.
NF_ADDR((blockPage>>16)&0xff); //
for(i=0;i //wait tWB(100ns)
NF_WAITRB(); // Wait tR(max 12us)
for(i=0;i
{
*bufPt++=NF_RDDATA(); // Read one page
}
/************************ECC校验***************************/
ecc0=rNFECC0; //利用2410自带的硬件ECC校验
ecc1=rNFECC1;
ecc2=rNFECC2;
[q3]
for(i=0;i
{
se=NF_RDDATA(); // Read spare array
//读页内冗余的16B
}
NF_nFCE_H();
if(ecc0==se[0] && ecc1==se[1] && ecc2==se[2]) //未知使用哪一种软件规范?
{ //比较数据结果是否正确
Uart_Printf("[ECC OK:%x,%x,%x]\n",se[0],se[1],se[2]);
return 1;
}
else
{
Uart_Printf("[ECC ERROR(RD):read:%x,%x,%x, reg:%x,%x,%x]\n",
se[0],se[1],se[2],ecc0,ecc1,ecc2);
return 0;
}
}
6) NAND 的写操作
static int NF_WritePage(U32 block,U32 page,U8 *buffer) //写Flash
{
int i;
U32 blockPage=(block
U8 *bufPt=buffer;
NF_RSTECC(); // Initialize ECC
NF_nFCE_L();
NF_CMD(0x0
[q4]
); //?????\\Read Mode 1
NF_CMD(0x80); // Write 1st command,数据输入
NF_ADDR(0); // Column 0
NF_ADDR(blockPage&0xff);
NF_ADDR((blockPage>>8)&0xff); // Block & page num.
NF_ADDR((blockPage>>16)&0xff);
for(i=0;i
{
NF_WRDATA(*bufPt++); // Write one page to NFM from buffer
}
seBuf[0]=rNFECC0;
seBuf[1]=rNFECC1;
seBuf[2]=rNFECC2;
seBuf[5]=0xff; // Marking good block
for(i=0;i
{
NF_WRDATA(seBuf); // Write spare array(ECC and Mark)
}
[q5]
NF_CMD(0x10); // Write 2nd command
for(i=0;i //tWB = 100ns. ////??????
NF_WAITRB(); //wait tPROG 200~500us;
NF_CMD(0x70); // Read status command
for(i=0;i //twhr=60ns
if (NF_RDDATA()&0x1) // Page write error
{
NF_nFCE_H();
Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
return 0;
}
else
{
NF_nFCE_H();
#if (WRITEVERIFY==1)
//return NF_VerifyPage(block,page,pPage);
#else
return 1;
#endif
}
} |
|