采用如下程序来写的, 程序是从SJF2440里拷出来用的.
#define NF_WAITRB() {while(!(rNFSTAT&(1<<0)));}
//wait tWB and check F_RNB pin.
static int NF_WritePage(U32 block,U32 page,U8 *buffer,U8 *spareBuf)
{
int i,j;
U32 blockPage=(block<<6)+page;
U8 *bufPt=buffer;
NF_nFCE_L();
//NF_CLEAR_RB();
NF_CMD(0x0);
NF_CMD(0x80); // Write 1st command
NF_ADDR(0); // Column A[7:0]=0
NF_ADDR(0); // Column A[11:8]=0
NF_ADDR(blockPage&0xff); // A[19:12]
NF_ADDR((blockPage>>8)&0xff); // A[27:20] //
for(i=0;i<2048;i++)
{
if(*bufPt!=gImage_480272[i]) // 这里这段用来证明参数传递过程中没发生错误
{
Uart_Printf("error\n");
}
NF_WRDATA(*bufPt); // Write one page to NFM from buffer
bufPt++;
}
if(spareBuf!=NULL)
{
for(i=0;i<64;i++)
{
NF_WRDATA(spareBuf[i]); // Write spare array(ECC and Mark)
}
}
NF_CMD(0x10); // Write 2nd command
Delay(90); //tWB = 100ns.
NF_WAITRB(); //wait tPROG 200~500us;
// NF_DETECT_RB();
NF_CMD(0x70); // Read status command
Delay(1); //twhr=60ns
if (NF_RDDATA()&0x1) // Page write error
{
NF_nFCE_H();
Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
NF_MarkBadBlock(block);
return 0;
}
else
{
NF_nFCE_H();
#if (WRITEVERIFY==1)
//return NF_VerifyPage(block,page,pPage);
#else
return 1;
#endif
}
}
调试时发现, 一次写2k的字符时, 只有前 512+8 个字符是正确的, 其他字符写进的都是0, 而且不管怎么改,怎么延时都不起作用.
请教一下这是为什么啊. |