微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)

S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)

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

(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all”选项。此时的“all”选项会以熔丝位的初始状态定义来配置芯片的熔丝位,而实际上其往往并不是用户所需要的配置结果。如果要使用“all”选项,应先使用“read->

for(i=5;i>

NF_ADDR((addr >>

NF_ADDR((addr >>

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

temp = rNF_IsBadBlock(page_number>>

NF_ADDR((page_number >>

NF_ADDR((page_number >>

ECCBuf[1]=(U8)((mecc0>>

ECCBuf[2]=(U8)((mecc0>>

ECCBuf[3]=(U8)((mecc0>>

ECCBuf[5]=(U8)((secc>>

temp = rNF_MarkBadBlock(page_number>>

NF_ADDR((block_number >>

NF_ADDR((block_number >>

temp = rNF_MarkBadBlock(page_number>>

NF_CMD(CMD_READ1); //页读命令周期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

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

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

NF_CMD(CMD_RANDOMREAD1); //随意读命令周期1

//页内地址

NF_ADDR((char)(add&0xff)); //列地址A0~A7

NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11

NF_CMD(CMD_RANDOMREAD2); //随意读命令周期2

return NF_RDDATA8(); //读取数据

}

U8 rNF_RamdomWrite(U32 page_number, U32 add, U8 dat)

{

U8 temp,stat;

NF_nFCE_L(); //打开Nand Flash片选

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

NF_CMD(CMD_RANDOMWRITE); //随意写命令

//页内地址

NF_ADDR((char)(add&0xff)); //列地址A0~A7

NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11

NF_WRDATA8(dat); //写入数据

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)

return 0x44; //失败

else

return 0x66; //成功

}

下面介绍上文中提到的判断坏块以及标注坏块的那两个程序:rNF_IsBadBlock和rNF_MarkBadBlock。在这里,我们定义在spare区的第6个地址(即每页的第2054地址)用来标注坏块,0x44表示该块为坏块。要判断坏块时,利用随意读命令来读取2054地址的内容是否为0x44,要标注坏块时,利用随意写命令来向2054地址写0x33。下面就给出这两个程序,它们的输入参数都为块地址,也就是即使仅仅一页出现问题,我们也标注整个块为坏块。

U8 rNF_IsBadBlock(U32 block)

{

return rNF_RamdomRead(block*64, 2054);

}

U8 rNF_MarkBadBlock(U32 block)

{

U8 result;

result = rNF_RamdomWrite(block*64, 2054, 0x33);

if(result == 0x44)

return 0x21; //写坏块标注失败

else

return 0x60; //写坏块标注成功

}

关于Nand Flash的基本操作就介绍到这吧

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

网站地图

Top