微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TQ2440之nand flash读写

TQ2440之nand flash读写

时间:11-21 来源:互联网 点击:

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(mydata);

i += 6;

Uart_Printf("\n test %s",mydata);

}

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(); //关闭Nand Flash片选

//判断状态值的第0位是否为0,为0则写操作正确,否则错误

if (stat & 0x1)

{

temp = rNF_MarkBadBlock(page_number>>6);//标注该页所在的块为坏块

if (temp == 0x21)

return 0x43; //标注坏块失败

else

return 0x44; //写操作失败

}

else

return 0x66; //写操作成功

}

U8 rNF_ReadPage( U32 page_number)

{

U32 i, mecc0, secc;

S8 buf[2048];

NF_RSTECC(); //复位ECC

NF_MECC_UnLock(); //解锁main区ECC

NF_nFCE_L();//使能芯片

NF_CLEAR_RB();//清除RnB

NF_CMD(CMD_READ1); //页读命令周期1,0x00

//写入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

NF_CMD(CMD_READ2); //页读命令周期2,0x30

NF_DETECT_RB(); ////等待RnB信号变高,即不忙

for (i = 0; i < 2048; i++)

{

buf[i] = NF_RDDATA8();//读取一页数据内容

Uart_Printf("%s",buf[i]);

}

NF_MECC_Lock(); //锁定main区ECC值

NF_SECC_UnLock(); //解锁spare区ECC

mecc0=NF_RDDATA(); //读spare区的前4个地址内容,即第2048~2051地址,这4个字节为main区的ECC

//把读取到的main区的ECC校验码放入NFMECCD0/1的相应位置内

rNFMECCD0=((mecc0&0xff00)<8)|(mecc0&0xff);

rNFMECCD1=((mecc0&0xff000000)>>8)|((mecc0&0xff0000)>>16);

NF_SECC_Lock(); //锁定spare区的ECC值

secc=NF_RDDATA(); //继续读spare区的4个地址内容,即第2052~2055地址,其中前2个字节为spare区的ECC值

//把读取到的spare区的ECC校验码放入NFSECCD的相应位置内

rNFSECCD=((secc&0xff00)<8)|(secc&0xff);

NF_nFCE_H(); //关闭nandflash片选

//判断所读取到的数据是否正确

if((rNFESTAT0 & 0xf) == 0x0)

return 0x66; //正确

else

return 0x44; //错误

}

void Main(void)

{

S8 myid;

S8 *str = "BERLIN";

Port_Init();

Uart_Select(0);

Uart_Init(50000000,115200);//初始化串口

Uart_Printf("\n\nWelcome to test nand flash!\n");

delay(100);

Uart_Printf("Now begin to init the nand flash\n");

rNF_Init();//初始化nand flash

Uart_Printf("Complete\n");

delay(100);

Uart_Printf("Now begin to reset\n");

rNF_Reset();//复位

Uart_Printf("Complete\n");

delay(100);

Uart_Printf("Now begin to read ID\n");

myid=rNF_ReadID();//读ID

Uart_Printf("The ID is %s \n",myid);

delay(100);

Uart_Printf("Now begin to erase the nand flash\n");

rNF_

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top