U8 rNF_WritePage(U32 page_number)
{
U32 i, mecc0, secc;
U8 stat, temp;
temp = rNF_IsBadBlock(page_number>>6); //判断该块是否为坏块
if(temp == 0x33)
return 0x42; //是坏块,返回
NF_RSTECC(); //复位ECC
NF_MECC_UnLock(); //解锁main区的ECC
NF_nFCE_L(); //打开nandflash片选
NF_CLEAR_RB(); //清RnB信号
NF_CMD(CMD_WRITE1); //页写命令周期1
//写入5个地址周期
NF_ADDR(0x00); //列地址A0~A7
NF_ADDR(0x00); //列地址A8~A11
NF_ADDR((page_number) & 0xff); //行地址A12~A19
NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27
NF_ADDR((page_number >> 16) & 0xff); //行地址A28
//写入一页数据
for (i = 0; i < 2048; i++)
{
NF_WRDATA8((char)(i+6));
}
NF_MECC_Lock(); //锁定main区的ECC值
mecc0=rNFMECC0; //读取main区的ECC校验码
//把ECC校验码由字型转换为字节型,并保存到全局变量数组ECCBuf中
ECCBuf[0]=(U8)(mecc0&0xff);
ECCBuf[1]=(U8)((mecc0>>8) & 0xff);
ECCBuf[2]=(U8)((mecc0>>16) & 0xff);
ECCBuf[3]=(U8)((mecc0>>24) & 0xff);
NF_SECC_UnLock(); //解锁spare区的ECC
//把main区的ECC值写入到spare区的前4个字节地址内,即第2048~2051地址
for(i=0;i<4;i++)
{
NF_WRDATA8(ECCBuf[i]);
}
NF_SECC_Lock(); //锁定spare区的ECC值
secc=rNFSECC; //读取spare区的ECC校验码
//把ECC校验码保存到全局变量数组ECCBuf中
ECCBuf[4]=(U8)(secc&0xff);
ECCBuf[5]=(U8)((secc>>8) & 0xff);
//把spare区的ECC值继续写入到spare区的第2052~2053地址内
for(i=4;i<6;i++)
{
NF_WRDATA8(ECCBuf[i]);
}
NF_CMD(CMD_WRITE2); //页写命令周期2
delay(1000); //延时一段时间,以等待写操作完成
NF_CMD(CMD_STATUS); //读状态命令
//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同
do{
stat = NF_RDDATA8();
}while(!(stat&0x40));
NF_nFCE_H(); //关闭nandflash片选
//判断状态值的第0位是否为0,为0则写操作正确,否则错误
if (stat & 0x1)
{
temp = rNF_MarkBadBlock(page_number>>6); //标注该页所在的块为坏块
if (temp == 0x21)
return 0x43 //标注坏块失败
else
return 0x44; //写操作失败
}
else
return 0x66; //写操作成功
}