本节书摘来异步社区《嵌入式Linux软硬件开发详解——基于S5PV210处理器》一书中的第2章,第2.1节,作者:刘龙,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.3 SLC Nand Flash芯片
嵌入式Linux软硬件开发详解——基于S5PV210处理器
2.3.1 NOR Flash与NAND Flash对比
在嵌入式系统中,很多信息在系统关闭电源后不能够丢失,这些信息需要使用非易失性存储器来存储,我们可以使用NOR Flash和NAND Flash来实现。
NOR Flash和NAND Flash是现在市场上两种主要的非易失闪存技术。Intel公司于1988年首先开发出NOR Flash技术;1989年,东芝公司开发出NAND Flash技术。NAND Flash和NOR Flash的主要区别如表2-3所示。
2.3.2 SLC与MLC NAND Flash技术对比
在嵌入式设备中使用SLC和MLC这两种不同类型的NAND Flash闪存技术的设备都很常见。SLC全称为Single-Level Cell,单层单元闪存;MLC全称为Multi-Level Cell,多层单元闪存。两者的主要区别是SLC每一个单元储存一位数据,而MLC通过使用多个电压等级,每一个单元储存两位数据,数据密度比较大。
SLC生产成本较高,但在效能上大幅胜于MLC。SLC晶片可重复写入约10万次,而MLC晶片的写入次数约为1万次,目前三星采用的MLC芯片写入寿命在5000次左右。在读写速度上,相对于主流SLC芯片,MLC芯片理论速度较慢。MLC能耗大于SLC,在相同使用条件下比SLC要多15%左右的能耗,因为MLC理论写入次数上限相对较少,所以在相同使用情况下,使用寿命比SLC短。
两种闪存技术对应芯片区别如表2-4所示。
Smart210开发板无NOR Flash。采用的是SLC类型NAND Flash,容量为512MB,型号为K9F4G08UOB。
2.3.3 K9F4G08UOB引脚功能
K9F4G08UOB的引脚排列如图2-8所示,各个引脚的功能如表2-5所示。
I/O0~I/O7:地址、数据和命令输入/输出引脚。
CLE、ALE:命令锁存使能引脚和地址锁存使能引脚,用来选择I/O输入的信号是命令还是地址。
overline {{text{CE}}}、overline {{text{RE}}}、overline {{text{WE}}} :片选信号、读使能信号和写使能信号引脚。
overline {frac{{text{R}}}{{text{B}}}}:状态引脚,表示设备的状态,当数据写入、编程和随机读取时,overline {frac{{text{R}}}{{text{B}}}}处于高电平,表明芯片正忙,否则输出低电平。
K9F4G08UOB内部结构如图2-9所示。
NAND Flash设备的存储容量是以页(Page)和块(Block)为单位,1Block=64Page,1Page=2112Byte(2048Byte用于存放数据,其余64Byte用于存放其他信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等)。
容量为512MB的NAND Flash存储结构为:2048Byte×64Page×4096Blocks。
芯片(Device)、块(Block)、页(Page)之间的关系如下。
1 Device = 4,096 Blocks = 4096×64 Pages = 256K Pages
1 Block = 64 Page
1 Page = 2112 Byte = 2048 Byte + 64 Byte
用于数据存储的单元有 2048 Bytes×64 Pages×4096 Blocks = 512 MB。
用于ECC校验或其他功能的单元有64 Bytes×64 Pages×4096 Blocks = 16MB 。
NAND Flash以页为单位进行读和编程(写)操作,一页为2048Byte;以块为单位进行擦除操作,一块为2048Byte×64page=128KB。
K9F4G08UOB的内部对每一页又进行了划分,每页分成前2048Byte的Main域和64Byte的Spare域,在Main域中,分成A、B、C、D四个扇区;Spare域中,分成E、F、G、H四个扇区。每个扇区占据不同的存储空间,具体分布情况如图2-10、图2-11所示。
2.3.4 NAND Flash硬件设计
S5PV210和K9F4G08UOB的连接方式如图2-12所示。
K9F4G08UOB的访问地址、数据和控制命令只能在引脚I/O[7:0]上传递。对于不同的数据类型,S5PV210微处理器和NAND Flash之间是通过控制总线和一些命令序列来进行区分的。该NAND Flash芯片所支持的命令序列如表2-6所示。
通过表2-6我们可以看出,如果微处理器想要读NAND Flash的内容,可以在CLE和overline {{text{RE}}}引脚的配合下,通过I/O0~I/O7引脚先后发送00h与30h命令;如果想要读取NAND Flash的内部厂商内置的ID,可以在CLE和overline {{text{RE}}}引脚的配合下,发送90h命令;如果S5PV210想要对NAND Flash进行随机地址的写操作,可以在CLE和overline {{text{WE}}}引脚的配合下,首先发送85h命令,然后指定所要写的地址。
K9F4G08UOB容量为512MB,需要30根地址线确定微处理器要访问的地址,而K9F4G08UOB只有8个I/O口,所要操作的地址是在控制引脚的配合下,先后5次发送至Flash内部。发送地址时地址序列如表2-7所示。
序列中列地址为A0~A11,行地址为A12~A29,L表示在写的时候置为0。对S5PV210访问NAND Flash地址的指定,只需要分5步将地址值写入S5PV210的NAND Flash控制寄存器即可,NAND Flash控制器会自动地通过8个I/O,在控制引脚帮助下,分五次通过I/O0~I/O7完成对NAND Flash地址的写操作。