嵌入式Linux裸机开发(十一)——Nandflash
一、Nand Flash简介
NandFlash是Flash的一种,具有容量较大,改写速度快等优点,适用于大量数据的存储。NandFlash没有专门的地址线,发送指令、地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器。
NandFlash分为SLC和MLC两类。SLC全称为Single-Level Cell,单层单元闪存,MLC全称为Multi-Level Cell,多层单元闪存。SLC每一个单元储存一位数据,而MLC通过使用大量的电压等级,每一个单元储存两位数据,数据密度比较大。SLC晶片生产成本较高,在效能上大幅胜于MLC。SLC晶片可重复写入次数约10万次,而MLC晶片的写入次数至少要达到1万次才算标准。MLC缺点有:读写速度较慢、MLC能耗比SLC高、MLC理论写入次数上限相对较少、MLC的价格比SLC低。
二、NandFlash存储器结构
1、NandFlash存储器结构
NAND Flash存储器由block (块) 构成, block的基本单元是page (页)。每一个block由16, 32或64个page组成。大多数的NAND Flash器件每一个page (页)内包含512个字节的Data area(数据存储区域)和扩展的16字节的 Spare area(备用区域)。每一个page的大小为512+16=528字节,称为small page。
大容量的(1Gbig或更多)的NAND Flash,page的容量较大, 每page内Data area(数据存储区域)的大小为2048字节, Spare area(备用区域)大小为64字节。
NAND Flash的读取和烧录以页为基础, 而NORFlash以字节或字为基础。 NAND Flash的擦除操作是基于block (块)的。在NAND Flash上有三种基本的操作:读取一个页, 烧录一个页和擦除一个块。
在一个页的读取操作中, 该页内528字节的数据首先被传输到数据寄存器中, 然后再输出。在一个页的烧录中, 该页内528字节的数据首先被写进数据寄存器, 然后再存储到存储阵列中。在一个块的擦除操作中, 一组连续的页在单独操作下被擦除。
2、备用单元结构
NAND Flash厂商在生产制程中使用Spare area(备用区域)来标识bad block, Spare area(备用区域)内所有的字节都可以像Data area(数据存储区域)内的字节一样被用户用来存储数据。
3、Bad block (Invalid block)管理
自从NAND结构被设计用来作为低成本的多媒体存储器, 标准规范中是允许存在bad block的。只要bad block的容量小于总容量的2% 那就是允许的。一个block中如果有坏的存储区域, 那它就会被标识成bad block 。 bad block 列表可以存储在一个芯片中的一个好的block上, 也可以存储在同一系统的另外一颗芯片上。bad block列表是被要求的, 由于NAND Flash只能执行有限的读和擦除次数。由于所有的Flash存储器最终都会被磨损而且不能再使用, bad block列表需要被用来跟踪记录那些在使用中发现的bad block 。允许bad block 的存在有利于提高芯片的产量,同时也降低了成本。每个block是独立的, 而且是被bit lines隔离的, bad block 的存在并不会影响那些其他block的正常工作。
Bad block 的一般分为两种: 生产过程中产生的; 使用过程中产生的。当block被发现是bad block , 一般是在该块的前两个page (页)的第517字节处用非FF来标识。使用过程中产生的bad block 是没有被工厂标识的。
A、Skip Block method(跳过坏块方式)
先读取存储器内的所有备用区域。那些被标识成bad block的地址都被收集起来。接下来, 数据被连续的写入目标FLASH器件。当目标地址与先前收集的bad block 地址一致时, 跳过坏块, 数据被写到下一个好的块中。然后继续保留bad block 中备用区域的标识信息。所以在程序导入执行之前, 使用者的系统通过读取Spare area(备用区域)的信息能建立一个bad block 的地址列表。
B、Reserved Block Area method(保留块区域方式)
bad block 在使用者的系统中能够被好block (块)所替代。
C、Error Checking and Correction(错误检测和纠正)
使用ECC纠错机制是为了让存储的数据完整无误
三、NandFlash接口
NandFlash芯片内部有存储颗粒和内部管理接口电路,外部SoC根据NandFlash接口时序访问NandFlash芯片。S5PV210内部集成了NandFlash控制器。
NandFlash引脚功能如下:
NandFlash命令码:
NandFlash芯片内部接口电路可以接收外部SoC发送的命令,与SoC交互。外部SoC对NandFlash芯片的操作都必须按照NandFlash规定的时序进行。
三、NandFlash常见操作
1、坏块检查
NandFlash使用前需要统一擦除(按块擦除),擦除后填充1。擦除块,将块中的每个字节与0xFF比较,如果不是0xFF,是坏块。
2、页烧录(页写操作)
页烧录前需要擦除,如果页烧录之前没有擦除,烧录的数据将是错误的。烧时,SoC通过命令线、IO线依次发送烧录命令、烧录地址、烧录数据等进入NandFlash。NandFlash芯片接口电路接收页数据到缓冲区,再集中烧录到NandFlash的存储颗粒。烧录过程需要一定时间,SoC的NandFlash控制器需要等待NandFlash烧录完,等待过程中SoC的NandFlash控制器将会不断读取页烧录状态。SoC的NandFlash控制器收到正确的状态响应时,确认页烧录已经成功,如果一直未收到正确的状态,则认为烧录页所在的块是坏块。
页烧录编程流程如下:
A、发出片选信号
B、发送页烧录命令第一个周期命令0x80
C、随机写页内某个地址的值
D、发送页写命令0x85
E、写入页内偏移地址
F、写入数据
G、发送页烧录命令第二个周期命令0x10
H、等待状态
I、读取状态,页烧录成功取消片选信号,失败取消片选信号
3、块擦除
擦除操作必须指定块对齐的地址。块擦除编程流程如下:
A、获取擦除块的地址(块对齐)
B、发出片选信号
C、发送擦除命令,第一个周期发命令0x60,第二个周期发块地址,第三个周期发命令0xd0 。
D、清除状态,等待状态。
E、读取状态,擦除成功则取消片选,擦除失败取消片选。
4、页读取
页读取编程流程:
A、发出片选信号
B、发送页读取命令,第一个周期发命令0x00,第二个周期发送页地址,第三个周期发送命令0x30
C、等待状态
D、发送页读取第一个周期命令0x05
E、写入页内偏移地址
F、发送页读取第二个周期命令0xE0
G、读取数据
H、检查状态,如果读取成功,取消片选信号,读取失败取消片选信号。
五、S5PV210 NandFlash控制器
NandFlash控制器的主要特性:
支持512B,2KB,4KB,8KB页的NandFlash
软件模式:能直接访问NandFlash芯片,支持读/烧录/擦除NandFlash芯片
支持8bit的NandFlash芯片接口总线
产生、检测、指示硬件ECC
支持SLC/MLC类型NandFlash芯片
支持1/4/8/12/16位的ECC
SFR接口:支持字节、半字、字访问数据和ECC数据寄存器,字访问其他寄存器。
SoC通过控制SFR(NandFlash控制器)
NFCONF:NandFlash配置寄存器
NFCONT:NandFlash控制寄存器
NFCMMD:NandFlash命令寄存器
NFADDR:NandFlash地址寄存器
NFDATA:NandFlash数据寄存器
NFSBLK:烧录块起始地址
NFEBLK:烧录块结束地址
NFSTAT:状态寄存器
六、NandFlash编程实践
Smart210的NandFlash为512MB的SLC类型。
电路原理图查阅
查阅核心板电路原理图有关NandFlash部分,
NandFlash片选信号引脚为Xm0CSn2,在核心板电路原理图搜Xm0CSn2可知,NandFlash接在Memory Port0,对应GPIO为MP01-MP03
GPIO配置如下:
MP0_1CON = 0x22333322;
MP0_2CON = 0x00002222;
MP0_3CON = 0x22222222;
工程源代码见附件,编译后在Smart210烧录可以正常运行,可以正常的对NnandFlash进行擦除、烧录、读取等测试操作。
参考博文:
NandFlash简介(CSDN 喝醉的毛毛虫)