1. NAND Flash简介

    Flash全称为Flash Memory,属于非易失性存储设备(Non-volatile Memory Device)Flash主要分两种,NAND FlashNOR Flash

    NOR的成本相对高,容量相对小,优点是读写数据时候,不容易出错。NAND Flash成本相对低,缺点是使用中数据读写容易出错,所以一般都需要有对应的软件或者硬件的数据校验算法,统称为ECC。但优点是,相对来说容量比较大。

  2. 基础原理

    2.1 NAND 布局

    NAND Flash内部由几个芯片(chip)组成,每个chip包含了几片(Plane),每一片中包含很多块(Block),每一块又包含很多页(Page),如图 21所示。常见的NAND Flash,内部只有一个chip,每个chip只有一个plane

    每一个页,对应还有一块区域,叫做空闲区域(spare area/冗余区域(redundant area),一般叫做OOBOut Of Band),这个区域,是最初基于NAND Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECCError Code Correction,或者Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。

     

    NAND FLASH基础知识总结

    2-1 NAND Flash结构

    老的NAND Flash,页大小是256B512B,这类的NAND Flash被称作small block,地址周期只有4个。对于现在常见的NAND Flash多数是2KB,被称作big block,对应的发读写命令地址,一共5个周期(cycle),更新的NAND Flash4KB。NAND Flash擦除操作的基本/最小单位为块,写入操作的基本/最小单位为页。 

    对于NAND Flash读取和编程操作来说,一般最小单位是页,所以,NAND Flash在硬件设计时候,就考虑到这一特性,对于每一片(Plane),都有一个对应的PAGE Buffer,专门用于存放,将要写入到物理存储单元中去的或者刚从存储单元中读取出来的一页数据。只有写到了这个页缓存中,你发了对应的编程第二阶段的确认命令0x10之后,实际的编程动作才开始,才开始把页缓存中的数据,一点点写到物理存储单元中去。通过PAGE Buffer还可以实现对NAND Flash的多片同时编程。

     

    2.2 NAND Flash ID

    Read IDNAND Flash基础命令之一,用于读取存储在NAND中的ID。读取的ID中包含多个字节,一般最少是4个,新的芯片,支持5个甚至更多,如图 2-2所示。从这些字节中,可以解析出很多相关的信息,比如此NAND Flash内部是几个芯片(chip)所组成的, SLC还是MLC,如图 2-3所示;如页大小,块大小,OOB大小等,如图 2-4所示;以及每个chip包含了几片(Plane),每片的大小,如图 2-5所示。

    NAND FLASH基础知识总结

    2-2 Read ID Byte

    NAND FLASH基础知识总结

    2-3 Read ID Byte 3 Description

    NAND FLASH基础知识总结

    2-4 Read ID Byte 4 Description

    NAND FLASH基础知识总结

    2-5 Read ID Byte 5 Description

    2.3 NAND Flash引脚功能

    NAND Flash的引脚功能如表 2-1所示:

    2-1 NAND Flash引脚说明

    引脚

    描述

    I/O0 ~ I/O7

    用于输入地址/数据/命令,输出数据,有8位和16位的

    CLE

    命令锁存使能,在输入命令之前,要先在模式寄存器中,设置CLE使能

    ALE

    地址锁存使能,在输入地址之前,要先在模式寄存器中,设置ALE使能

    CE#

    芯片使能,在操作Nand Flash之前,要先选中此芯片,才能操作

    RE#

    Read Enable,读使能,在读取数据之前,要先使CE#有效

    WE#

    读使能,在读取数据之前,要先使CE#有效

    WP#

    写保护

    R/B#

    就绪/,主要用于在发送完编程/擦除命令后,检测这些操作是否完成,,表示编程/擦除操作仍在进行中,就绪表示操作完成

    Vcc

    电源

    Vss

    接地

    N.C

    未定义,未连接

    2.4 NAND Flash的典型特性

    1.页擦除时间是200us,有些慢的有800us

    2.块擦除时间是1.5ms

    3.页数据读取到数据寄存器的时间一般是20us

    4.串行访问(Serial access)读取一个数据的时间是25ns,而一些旧的nand flash30ns,甚至是50ns

    5.输入输出端口是地址和数据以及命令一起multiplex复用的

    2.5 NAND Flash中的坏块(Bad Block

    NAND Flash中,一个块中含有1个或多个位是坏的,就成为其为坏块。坏块的稳定性是无法保证的,也就是说,不能保证你写入的数据是对的,或者写入对了,读出来也不一定对的。而正常的块,肯定是写入读出都是正常的。

    约定俗成的,small blockNAND,坏块标记在byte 5large blockNAND,坏块标记在byte0。坏块标记如果不是0xFF,就说明是坏块。

    关于坏块标记,实际情况更复杂些:对于2K页的NAND Flash,标记位置都是页内OOB开始处,都是非0xFF表示坏块。但是,对于是第几页,不同NAND Flash就有不同的规定了:有些NAND Flash,是标记在坏块的第一个页或者是第二个页。另一些,是在一个块内的最后一页或倒数第二页做此标记。所以,真正比较完整的检查坏块的做法,至少要检测块内第一,第二,倒数第一,倒数第二页,是否是0xFF,才能比较全面的判断是否是坏块的。

    2.6 NAND Flash坏块管理

    对于坏块的管理,在SylixOS系统中,叫做坏块管理(BBMBad Block Management),对应的会有一个表去记录好块,坏块的信息,以及坏块是出厂就有的,还是后来使用产生的,这个表叫做坏块表(BBTBad Block Table)。SylixOS内核MTD架构下的NAND Flash驱动,和UbootNAND Flash驱动中,在加载完驱动之后,如果你没有加入参数主动要求跳过坏块扫描的话,那么都会去主动扫描坏块,建立必要的BBT的,以备后面坏块管理所使用。

    2.7 常见NAND Flash操作

    NAND Flash的常见操作如图 2-6所示:

    NAND FLASH基础知识总结

    2-6 NAND Flash常见命令

    很多操作命令有2Cycle。开始设置,最后确认的命令方式,是为了避免由于外部由于无意的/未预料而产生的噪音而误操作,这样使得数据更安全。

    2.8 NAND Flash的地址周期

    在需要输入地址时,small block,地址周期只有4个,如图 2-7所示。而big block,对应的发读写命令地址,一共5个周期(cycle),如图 2-8所示。

    NAND FLASH基础知识总结

    2-7 4周期地址输入

    NAND FLASH基础知识总结

    2-8 5周期地址输入

    NAND Flash地址周期共有5个,2个列(Column)周期,3个行(Row)周期。列地址A0~A10,就是页内地址,地址范围是从02047,而对出的A11,理论上可以表示20484095,但是实际上,我们最多也只用到了20482112,用于表示页内的OOB区域,其大小是64字节。A12A30,称作页号,页的号码,可以定位到具体是哪一个页。而其中,A18A30,表示对应的块号,即属于哪个块。

    2.8 NAND Flash的页编程(写操作)

    NADN FLASH的写操作叫做编程Program,一般情况下,是以页为单位的。时序图如图 2-9所示:

     

    NAND FLASH基础知识总结

    2-9 NAND Flash写操作时序

    2.9 NAND FALSH的读操作

    NAND Flash的读操作以页为单位,时序图如图 2-10所示:

    NAND FLASH基础知识总结

    2-10 NAND Flash读操作时序

    2.10 NAND Flash的擦除

    NAND Flash的擦除以块为单位,在写操作之前,必须先进行擦除,时序图如图 2-11所示:

    NAND FLASH基础知识总结

    2-11 NAND Flash擦除操作时序

  3. 参考资料

    Spansion SLC NAND Flash Memory for Embedded