您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > NAND Flash驱动程序设计
当前各类嵌入式系统开发设计中,存储模块设计是不可或缺的重要方面。NOR和NAND是目前市场上两种主要的非易失闪存技术。NORFlash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常用于程序代码的存储。与NOR相比,NAND闪存的优点是容量大,但其速度较慢,因为它的I/O端口只有8或16个,要完成地址和数据的传输就必须让这些信号轮流传送。NAND型Flash具有极高的单元密度,容量可以比较大,价格相对便宜。本文以三星公司的K9F2808UOB芯片为例,介绍了NANDFlash的接口电路与驱动的设计方法。文中介绍了开发NANDFlash驱动基本原理,意在简化嵌入式系统开发过程。1NANDFlash工作原理S3C2410板的NANDFlash支持由两部分组成:集成在S3C2410CPU上的NANDFlash控制器和NANDFlash存储芯片。要访问NANDFlash中的数据,必须通过NANDFlash控制器发送命令才能完成。所以,NANDFlash相当于S3C2410的一个外设,并不位于它的内存地址区。1.1芯片内部存储布局及存储操作特点一片NANDFlash为一个设备,其数据存储分层为:1设备=4096块;1块=32页;1页=528字节=数据块大小(512字节)+OOB块大小(16字节)。在每一页中,最后16字节(又称OOB,Out?of?Band)用于NANDFlash命令执行完后设置状态用,剩余512字节又分为前半部分和后半部分。可以通过NANDFlash命令00h/01h/50h分别对前半部、后半部、OOB进行定位,通过NANDFlash内置的指针指向各自的首地址。存储操作特点有:擦除操作的最小单位是块;NANDFlash芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除(擦除即是将相应块的位全部变为1);OOB部分的第6字节(即517字节)标志是否是坏块,值为FF时不是坏块,否则为坏块。除OOB第6字节外,通常至少把OOB的前3字节用来存放NANDFlash硬件ECC码。1.2NANDFlash接口电路首先介绍开发板的硬件设计,图1为NANDFlash接口电路。其中开关SW的1、2连接时R/B表示准备好/忙,2、3连接时nWAIT可用于增加读/写访问的额外等待周期。在S3C2410处理器中已经集成了NANDFlash控制器,图2为微控制器与NANDFlash连接的方式。图1NANDFlash接口电路1.3控制器工作原理NANDFlash控制器在其专用寄存器区(SFR)地址空间中映射有属于自己的特殊功能寄存器,就是通过将NANDFlash芯片的内设命令写到其特殊功能寄存器中,从而实现对NANDFlash芯片读、检验和编程控制。特殊功能寄存器有:NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT、NFECC。图2NANDFlash与S3C2410连接电路2Flash烧写程序原理及结构基本原理:将在SDRAM中的一段存储区域中的数据写到NANDFlash存储空间中。烧写程序在纵向上分三层完成。第一层:主烧写函数,将SDRAM中一段存储区域的数据写到NANDFlash存储空间中。第二层:该层提供对NANDFlash进行操作的页读、写及块擦除等函数。第三层:为第二层提供具体NANDFlash控制器中对特殊功能寄存器进行操作的核心函数,该层也是真正将数据在SDRAM和NANDFlash之间实现传送的函数。其中第二层为驱动程序的设计关键所在,下面对该层的读、写(又称编程)、擦除功能编码进行详细介绍。2.1NANDFlashRead功能:读数据操作以页为单位,读数据时首先写入读数据命令00H,然后输入要读取页的地址,接着从数据寄存器中读取数据,最后进行ECC校验。参数说明:block,块号;page,页号;buffer,指向将要读取到内存中的起始位置;返回值1,读成功,返回值0:读失败。staticintNF_ReadPage(unsignedintblock,unsignedintpage,unsignedchar*buffer){NF_RSTECC();/*初始化ECC*/NF_nFCE_L();/*片选NANDFlash芯片*/NF_CMD(0x00);/*从A区开始读*//*A0~A7(列地址)*/NF_ADDR(0);/*A9A16(页地址)*/NF_ADDR(blockPage&0xff);/*A17A24,(页地址)*/NF_ADDR((blockPage8)&0xff);/*A25,(页地址)*/NF_ADDR((blockPage16)&0xff);/*等待NANDFlash处于再准备状态*/ReadPage();/*读整个页,512字节*/ReadECC();/*读取ECC码*/ReadOOB();/*读取该页的OOB块*//*取消NANDFlash选中*/NF_nFCE_H();/*校验ECC码,并返回*/Return(checkEcc())}2.2NANDFlashProgram功能:对页进行编程命令,用于写操作。命令代码:首先写入00h(A区)/01h(B区)/05h(C区),表示写入那个区;再写入80h开始编程模式(写入模式),接下来写入地址和数据;最后写入10h表示编程结束。图3为程序流程图。图3写程序流程参数说明:block,块号;page,页号;buffer,指向内存中待写入NANDFlash中的数据起始位置;返回值0,写错误,返回值1,写成功。staticintNF_WritePage(unsignedintblock,unsignedintpage,unsignedchar*buffer){NF_RSTECC();/*初始化ECC*/NF_nFCE_L();/*片选NANDFlash芯片*/NF_CMD(0x0);/*从A区开始写*/NF_CMD(0x80);/*写第一条命令*//*A0~A7(列地址)*/NF_ADDR(0);/*A9A16(页地址)*/NF_ADDR(blockPage&0xff);/*A17A24(页地址)*/NF_ADDR((blockPage8)&0xff);/*A25(页地址)*/NF_ADDR((blockPage16)&0xff);/*写页为512B到NANDFlash芯片*/WRDATA();/*OOB一共16字节,每一个字节存放什么由程序员自己定义,在Byte0Byte2存ECC检验码,Byte6存放坏块标志*/WRDATA();/*写该页的OOB数据块*/CMD(0x10);/*结束写命令*/WAITRB();/*等待NANDFlash处于准备状态*//*发送读状态命令给NANDFlash*/CMD(0x70);if(RDDATA()&0x1){/*如果写有错,则标示为坏块,取消NANDFlash选中*/MarkBadBlock(block);return0;}else{/*正常退出,取消NANDFlash选中*/return1;}2.3NANDFlashErase功能:块擦除命令。命令代码:首先写入60h进入擦写模式,然后输入块地址,接下来写入D0h,表示擦写结束。参数说明:block,块号;返回值0,擦除错误(若是坏块直接返回0;若擦除出现错误则标记为坏块然后返回0),返回值1,成功擦除。staticintNF_EraseBlock(unsignedintblock){/*如果该块是坏块,则返回*/if(NF_IsBadBlock(block))return0;NF_nFCE_L();/*片选NANDFlash芯片*/NF_CMD(0x60);/*设置擦写模式*//*A9A16(PageAddress),是基于块擦除*/NF_ADDR(blockPage&0xff);NF_ADDR((blockPage8)&0xff);/*A25(PageAddress)*/NF_ADDR((blockPage16)&0xff);NF_CMD(0xd0);WAITRB();CMD(0x70);if(RDDATA()&0x1){/*如有错,标为坏块,取消Flash选中*/MarkBadBlock(block);return0;}else{/*退出,取消Flash选中*/return1;}3ECC校检原理与实现由于NANDFlash的工艺不能保证NAND的MemoryArray在其生命周期中保持性能可靠,因此在NAND的生产及使用过程中会产生坏块。为了检测数据的可靠性,在应用NANDFlash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠地进行坏区检测。如果操作时序和电路稳定性不存在问题的话,NANDFlash出错的时候一般不会造成整个块或是页不能读取或全部出错,而是整个页(例如512字节)中只有一位或几位出错。对数据的校验常用的有奇偶校验、CRC校验等,而在NANDFlash处理中,一般使用一种专用的校验——ECC。ECC能纠正单位错误和检测双位错误,而且计算速度很快,但对1位以上的错误无法纠正,对2位以上的错误不保证能检测。ECC一般每256字节原始数据生成3字节ECC校验数据,这3字节共24位分成两部分:6位的列校验和16位的行校验,多余的2位置1,如表1所列。表1校检数据组成首先介绍ECC的列校检。ECC的列校验和生成规则如图4所示,“^”表示“位异或”操作。由于篇幅关系,行校检不作介绍,感兴趣的读者可以参考芯片datasheet,在三星公司网站可以免费下载。图4列校验和生成规则数学表达式为:当向NANDFlash的页中写入数据时,每256字节生成一个ECC校验和,称之为原ECC校验和,保存到页的OOB数据区中。当从NANDFlash中读取数据时,每256字节生成一个ECC校验和,称之为新ECC校验和。校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和与新ECC校验和按位异或,若结果为0,则表示无错(或者出现了ECC无法检测的错误);若3字节异或结果中存在11位为1,表示存在一个位错误,且可纠正;若3个字节异或结果中只存在1位为1,表示OOB区出错;其他情况均表示出现了无法纠正的错误。4UBOOT下功能验证实现UBOOT对NANDFlash的支持主要是在命令行下实现对NANDFlash的操作。对NANDFlash实现的命令为:nandinfo、nanddevice、nandread、nandwrite、nanderease、nandbad。用到的主要数据结构有:structnand_flash_dev和structnand_chip,前者包括主要的芯片型号、存储容量、设备ID、I/O总线宽度等信息,后者是对NANDFlash进行具体操作时用到的信息。由于将驱动移植到UBoot的方法不是本文重点,故不作详细介绍。验证方式:通过TFTP将数据下载到SDRAM中,利用nandread、nandwrite、nanderease三个命令对NANDFlash进行读、编程、擦写测试。测试结果如表2所列。和datasheet中数据对比,可以得出结论,驱动在系统中运行良好。表2测试结果结语现在嵌入式系统应用越来越广泛,而存储器件又是嵌入式系统必不可少的一部分,NANDFlash在不超过4GB容量的需求下,较其他存储器件优势明显。本文所设计的驱动并未基于任何操作系统,可以方便地移植到多种操作系统和BootLoader下,对于简化嵌入式系统开发有一定的实际意义。
本文标题:NAND Flash驱动程序设计
链接地址:https://www.777doc.com/doc-4042329 .html