一、结构与简介:
1、结构图:
①、Nand Flash 以bit的方式保存数据在memory cell中。通常一个cell存一个bit。cell以8或者16为单位连成bit line,形成 byte(x8)/word(x16),即位宽。Page由Line组成。
②、每个 Nand Flash 设备由多个块(block)组成。每个块(block)由多个页(page)组成。
③、每个页(page)由普通区域和OOB区组成。普通区域存放读写数据,OOB区域存放校验码。
④、向页内写数据时可能发生位反转。所以需要产生校验码,并存入OOB区。从页内读数据时同时读出校验码,纠正位反转。
⑤、OOB区首字节存放block状态。如果是 0xff,表明是好的。如果非 0xff,则是坏块。 OOB对 CPU 来说透明(out of bank)。
⑥、页(page)是 Nand Flash 的最小读写单元。块(block)是 Nand Flash 的最小擦除单元 。
⑦、对 Nand Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。
2、原理图:
3、操作命令(不同 Nand Flash 或有差异):
3、操作步骤:片选选中 ==> 发命令 ==> 发地址 ==> 传输数据
①、发命令:拉高 CLE ==> 用DATA线写命令(写寄存器) ==> 发写脉冲
②、发地址:拉高 ALE ==> 用DATA线写地址(写寄存器) ==> 发写脉冲
③、发数据:拉低 ALE,CLE ==> 用DATA线写数据(写寄存器) ==> 发写脉冲
④、读数据:拉低 ALE,CLE ==> 发读脉冲 ==> 用DATA线读数据(读寄存器)
二、ECC校验:
三、Nand Flash 移植:
1、初始化:(根据不同型号 Nand Flash 的 datasheet,配置寄存器)
①、设置时序。
②、初始化 Nand Flash 控制器。
③、初始化ECC。并禁止片选,以防误操作。(及一些其他操作)
④、如有必要,进行重定位(拷贝到内存)。
2、识别(读芯片信息):
①、使能片选。
②、发送命令和地址周期,并读数据。注意设延迟。
Ⅰ、根据时序图设延时。必要时读取寄存器并判断操作是否完成,没完成则等待。
Ⅱ、地址根据 datasheet 设置,按位数及顺序依次写入。(行列地址分别写入)
③、取消片选使能。
3、擦除(一次擦除一个 block):
①、使能片选。
②、发送命令和地址周期。(只需要行地址 page)
③、发出擦除命令,延迟等待擦除结束。(擦除一个块。如有需要,则循环操作)
④、取消片选使能。
4、读(一次读一个 page):
①、判断坏块,坏的跳过。
②、使能片选。
③、发送命令和地址周期,及读命令,延迟等待。
④、读数据(数据寄存器中的值)。
⑤、取消片选使能。
4、烧写(一次写一个 page):
①、使能片选。
②、发送命令和地址周期。
③、发出要烧写的数据(地址不一定从页首位开始)。判断大小,如果超过一页大小,则写入下页。依次循环。
④、发出烧写命令。延迟等待烧写结束。
⑤、更新行列的值,判断循环,写入下一页。
⑥、取消片选使能。
5、数据定位:行(page)与列(column)
①、行与列的定位:与传入地址 addr,页大小 pagesize 有关。等决定具体参照芯片手册。
②、行(page):page = addr / pagesize; 或 page = addr >> bitnum; 2的 bitnum 次方等于 pagesize
③、列(column):column = addr % pagesize; 或 column = addr & (pagesize - 1);