自己学驱动16——NAND Flash

来源:互联网 发布:美帝 知乎 编辑:程序博客网 时间:2024/06/08 10:46
1.NOR Flash和NAND Flash
    对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有的Flash器件(包括NOR Flash和NAND Flash)都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),NAND Flash出现这种问题的几率远大于NOR Flash。当位反转发生在关键的代码、数据上时,有可能导致系统崩溃。当仅仅是报告位反转,重新读取即可;如果确实发生了位反转,则必须有相应的错误检测/恢复措施,推荐使用EDC/ECC进行错误检测/恢复。
    嵌入式Linux对NOR、NAND Flash的软件支持都很成熟,在NOR Flash上常用jffs2文件系统,而在NAND Flash上常用yaffs文件系统。在更底层,有MTD驱动程序(源代码位于linux源代码的/drivers/mtd中)实现对它们的读、写和擦除操作,它也实现了EDC/ECC校验。

2.K9F1208U0M存储格式
    K9F1208U0M容量为528Mbit=64MB,内部分为131072行(页)、528列;每一行(页)大小为512字节,外加16字节的额外空间,这16字节的额外空间的列地址为512~527。
    K9F1208U0M的64MB的存储空间需要26位地址,因此以字节为单位访问Flash时需要4个地址序列:列地址(A0~A7)、行地址的低位部分以及行地址的高位部分(A9~A25)。读写页在发出命令后,需要4个地址序列,而擦除块在发出擦除命令后仅需要3个地址序列。这是因为NAND Flash一般以512字节为单位进行读写,NAND Flash的块大小范围为8kB~64kB,读写是按行(页)进行,而擦除是以块为单位完成的。

3.读操作方法
    操作NAND Flash时,先传输命令,然后传输地址,最后读/写数据,期间要检查Flash的状态。
    K9F1208U0M一页的大小为512字节,分为两部分:上半部、下半部。
    列地址的8bits用来在半页(256字节)中寻址。
    当发出读命令00h时,表示列地址将在上半部寻址;当发出读命令01h时,表示列地址将在下半部寻址。A8地址线将被读命令00h设置为低电平,被01h设置为高电平。所以2440向K9F1208U0M传输地址过程中不会出现A8,在K9F1208U0M内部A8会根据命令自动被设置为高电平或低电平。
    K9F1208U0M一页大小为528字节,而列地址A0~A7可以寻址的范围是256字节,所以必须辅以其他手段才能完全寻址这528字节,将一页分为A、B、C三个区:A区为0~255字节,B区为256~511字节,C区为512~527字节。访问某页时,需要选定特定的区:命令00h选中A区、命令01h选中B区、命令50h选中C区。命令00h和50h会使得访问Flash的地址指针一直从A区或C区开始,除非发出了其他的修改地址指针的命令。而命令01h的效果只能维持一次,当前的读、写、擦除、复位或者上电操作完成之后,地址指针将重新指向A区。

4.写操作方法
    写操作命令分为两种:Page Program(True)和Page Program(Dummy)。Page Program(True)需要的命令组合为80h和10h;而Page Program(Dummy)需要的命令组合为80h和11h。写不同于读操作,写操作不分A、B、C三个部分,因为NAND Flash的写操作一般是以页为单位的,但是也可以只写一页中的一部分。写操作的地址序列依然同读一致,A8依然是没有的,所以写NAND Flash一部分的地址只能是在A0~A7寻址空间内开始。
    Page Program(True):发出命令80h后,紧接着是4个地址序列,然后向Flash发送数据(最大可以达到528字节),然后发出10h启动写操作,这时Flash会自动完成写、校验操作。一旦发出10h后,就可以通过读取状态命令70h获知当前的写操作是否完成、是否成功。
    Page Program(Dummy):由于K9F1208U0M内部分为4个128Mbit的存储层,每个存储层包含1024个Block(不是页而是块)和528个寄存器。这使得可以同时写多个页或者同时擦除多个块。K9F1208U0M的第1块位于第1个存储层、第2块位于第2个存储层、第3个块位于第3个存储层、第4个块位于第4个存储层,以此类推。这样当用于需要连续写1~4块时,就能够充分使用这4个存储层各自的528字节存储器。

5.块擦除
    K9F1208U0M块大小为16KB,当发出60h命令后,后续需要发出3个地址(第2、3、4cycle的地址),并且A9~A13被忽略,即可完成块擦除操作。
1 0