S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
(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的基本操作就介绍到这吧
S3C2440NandFlashK9F2G08U0 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)