4.2 NandFlash器件原理
4.2.1 NandFlash存储单元组织
下面以三星公司的K9F2G08U0M NandFlash为例来讲述NandFlash原理。该NandFlash的输入输出端口如表4-1所示。
表4-1 K9F2G08U0M输入输出端口描述
K9F2G08U0M的功能方框图如图4-1所示。
图4-1 K9F2G08U0M的功能方框图
K9F2G08U0M的存储器组织如图4-2所示。K9F2G08U0M是一个2Gbits的闪存,每2K+64字节被组织成为一个页,每64个页被组织成为一个块,整个器件共有2048个块,共2112Mbits。读操作每次至少读取一个字节,而擦除操作每次擦除一个块。
图4-2 K9F2G08U0M的存储器组织
NandFlash的地址分为行地址和列地址,行地址选择指定的页,列地址选择指定的页内字节。每一个页有2K+64字节,因此,需要12比特的地址进行寻址。NandFlash的地址通过I/O[7:0]送入器件,先送入列地址,再送入行地址,29比特地址需要5周期才能送完,每个周期送入的地址位如图4-3所示。
图4-3 K9F2G08U0M的地址周期
4.2.2 NandFlash坏块与坏块管理
NandFlash坏块在出厂的时候可能已存在。在芯片出厂时,NandFlash已经被擦除,擦除后所有字节都是0xFF。对于坏块,在出厂时,其第一页或第二页的第2048列的内容为非0xFF。这些信息可以用来初始化坏块描述表。坏块描述表由软件来维护,NandFlash的第一个块,即地址0开始的块,在出厂时保证是正确的,且保证至少最初1000次擦除/编程操作都是正确的。坏块描述表可以放在地址0开始的块中。坏块描述表对于NandFlash的管理十分重要,在实际系统设计中,还应该对其采取适当的备份措施。
在初始化坏块描述表之前若对NandFlash进行了不恰当的写操作或擦除操作,可能导致坏块信息被破坏并不可恢复。在后续的使用中,NandFlash会新增坏块,坏块信息被破坏的块及新增的坏块可以在写操作失败、块擦除失败来发现,新发现的坏块通过软件添加到坏块描述表中。
在NandFlash的使用中,可能会出现个别比特反转的情况,即某一个比特在写入时被写入了0,但是因为储存单元的问题导致在后来某个时间读取到的该比特的值为0。为了解决这一问题,有些NandFlash控制器专门设计了硬件前向纠错机制。常见的前向纠错机制能够纠错一个比特,检错多个比特。当发生超过一个比特以上的错误无法纠正时,软件必须作出适当的处理。前向纠检错机制都是针对页进行的,在进行整页写操作时,2048个字节被写入一个页的前2048个字节,纠检错机制产生的校验比特被存储在2048字节后面的64个字节空间。在进行整页读取时,将一个页2048个字节读出并由纠检错机制计算出新的校验比特,如果新的校验比特与存储在2048字节后面的64个字节空间的校验比特不同,则读取的数据出错。若能够纠错,则数据仍然能够使用,若不能够纠错,则只能报告页面错误。
在一般的嵌入式系统中,常常根据运行时的需要产生页面失败(Page Fault)中断,将一个页加载到SDRAM即内存中,对于能够纠正的错误,系统能够继续正常工作,一般将数据转存到另外一个块中;若错误不可纠正,则错误就是致命(Fatal Error)的,系统将不能够再正常工作。