2.2.8 Nandflash
Nandflash也是Flash闪存的一种,其内部采用非线性单元设计模式,为固态大容量闪存的实现提供了廉价有效的解决方案。Nandflash存储器具有容量较大、改写速度快等优点,适用于大量数据的存储,广泛应用于嵌入式产品中。
由于内部结构相对简单,Nandflash芯片使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。所以不能像Norflash、SDRAM等芯片,可以直接和CPU等设备相连并且寻址到每个存储字节。因此Nandflash芯片需要为它设计专门的控制器才能和其他设备进行通信。
mini2440开发板上有两种Flash闪存,一种是前面说过的Norflash闪存,大小为2MB;另一种是Nandflash,型号为K9F1G08,大小为128MB,旧版本为K9F1208,大小为64MB。Norflash和Nandflash闪存的芯片都存在于mini2440开发板上,前面说过Norflash有足够的地址引脚和数据引脚,因此它可以直接提供类似SRAM接口和CPU相连、通信。而Nandflash闪存则不行,它需要专门的Nandflash控制器,这个Nandflash控制器就存在于S3C2440A这个芯片中。S3C2440A支持这两种Flash启动系统,通过拨动跳线开关,可以选择从Norflash还是从Nandflash启动系统。实际的产品中使用一片Nandflash就够了,因为mini2440开发板是为了方便用户开发学习,所以还保留了Norflash。
要操作Nandflash芯片,从中读取和写入数据。那么就要Nandflash控制器进行操作,对它进行编程,通过Nandflash控制器操作Nandflash芯片。对S3C2440A芯片上的Nandflash控制器的编程步骤如下:
写命令寄存器,向Nandflash控制器写入相关命令,对应于Nandflash芯片的命令周期。
写地址寄存器,向Nandflash控制器写入相关地址,比如上面输入的读写命令是需要读写地址的,对应于Nandflash芯片的地址周期。
读/写数据寄存器,读/写入数据到Nandflash存储器,根据上面相应的命令做相应的动作,可能是读也可能是写数据,对应于Nandflash芯片的读/写周期。
读Nandflash控制器的主ECC寄存器和备份ECC寄存器。对数据进行校验。
等用到Nandflash控制器时,再详细研究其细节。下面介绍Nandflash芯片的结构。
Nandflash芯片的数据是以位的方式保存在存储单元中的,一般来说,一个存储单元中只能存储一个位。这些存储单元以8个或者16个为单位,连接成位行,这些位行会再组成页,这些页面会再组成块。Nandflash芯片有多种结构,笔者使用的Nandflash芯片是K9F1208,它是这样的:每页528B,其中512B用于存放数据,还有16B存放这个页面的数据的校验信息,每32个页面形成一个块,块大小为32×528B。具体一片Flash上有多少个块是根据需要决定的。K9F1208的Nandflash芯片具有4096个块,故总容量为4096×(32×528B)一共是66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的空间为64MB,如图2-11所示。
图2-11 Nandflash芯片逻辑视图
Nandflash芯片以页为单位读写数据,所以一次读写最少为512B的数据,不能像Norflash芯片一样可以以字为单位读写数据。而Nandflash芯片是以块为单位擦除数据的。按照这样的组织方式可以形成所谓的三类地址:
1)列地址。
2)页地址。
3)块地址。
对于Nandflash来说,地址和命令只能在I/O[7:0]引脚上传递,数据宽度是8位。
由于Nandflash芯片的工艺不能保证存储单元在其生命周期中保持性能的可靠,所以在Nandflash芯片的生产及使用过程中会产生坏块。为了检测其可靠性,在应用Nandflash芯片的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠地进行坏区检测。如果操作时序和电路稳定性不存在问题,Nandflash芯片出错的时候一般不会造成整个块或页面不能读取或全部出错,而是整个页面(如512B)中只有一位或几位出错。对数据的校验常用的有奇偶校验、CRC校验等,而在Nandflash芯片处理中,一般使用一种比较专业的ECC校验。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快。
我们只要知道Nandflash芯片就和PC中硬盘一样,只能一次以页面为单位读取数据,最少是512B。CPU要访问Nandflash芯片需要通过专门的Nandflash控制器,其动作是对Nandflash控制器发送相关的命令。Nandflash芯片就说到这里吧,大脑中有个印象即可。