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低。
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字节。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8F/wKiom1daN1WQtb1kAAGdQPXMG0M416.png" title="图片1.png" alt="wKiom1daN1WQtb1kAAGdQPXMG0M416.png" />
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8D/wKioL1daOHGAIp1ZAAF89uwMxJg829.png" title="图片2.png" alt="wKioL1daOHGAIp1ZAAF89uwMxJg829.png" />
NAND Flash的读取和烧录以页为基础, 而NORFlash以字节或字为基础。 NAND Flash的擦除操作是基于block (块)的。在NAND Flash上有三种基本的操作:读取一个页, 烧录一个页和擦除一个块。
在一个页的读取操作中, 该页内528字节的数据首先被传输到数据寄存器中, 然后再输出。在一个页的烧录中, 该页内528字节的数据首先被写进数据寄存器, 然后再存储到存储阵列中。在一个块的擦除操作中, 一组连续的页在单独操作下被擦除。
NAND Flash厂商在生产制程中使用Spare area(备用区域)来标识bad block, Spare area(备用区域)内所有的字节都可以像Data area(数据存储区域)内的字节一样被用户用来存储数据。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/82/8F/wKiom1daN6Dzxq5dAAM7LPfdNRw188.png" title="图片3.png" alt="wKiom1daN6Dzxq5dAAM7LPfdNRw188.png" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/82/8D/wKioL1daOMLhLMecAASEp4rtkRs942.png" title="图片4.png" alt="wKioL1daOMLhLMecAASEp4rtkRs942.png" />
自从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 的地址列表。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/82/8F/wKiom1daN9vydapOAAGFrm-uib0836.png" title="图片5.png" alt="wKiom1daN9vydapOAAGFrm-uib0836.png" />
B、Reserved Block Area method(保留块区域方式)
bad block 在使用者的系统中能够被好block (块)所替代。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/82/8D/wKioL1daOQSAj_BVAAIRtlVeOPU279.png" title="图片6.png" alt="wKioL1daOQSAj_BVAAIRtlVeOPU279.png" />
C、Error Checking and Correction(错误检测和纠正)
使用ECC纠错机制是为了让存储的数据完整无误
NandFlash芯片内部有存储颗粒和内部管理接口电路,外部SoC根据NandFlash接口时序访问NandFlash芯片。S5PV210内部集成了NandFlash控制器。
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/82/8D/wKioL1daOU7TYfi-AAEbyfwCzHU828.png" title="图片7.png" alt="wKioL1daOU7TYfi-AAEbyfwCzHU828.png" />
NandFlash引脚功能如下:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/82/8D/wKioL1daOW2hx0-8AAL9bE5mwVI432.png" title="图片8.png" alt="wKioL1daOW2hx0-8AAL9bE5mwVI432.png" />
NandFlash命令码:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/82/8D/wKioL1daOZOR8eAGAAExh35XACU365.png" title="图片9.png" alt="wKioL1daOZOR8eAGAAExh35XACU365.png" />
NandFlash芯片内部接口电路可以接收外部SoC发送的命令,与SoC交互。外部SoC对NandFlash芯片的操作都必须按照NandFlash规定的时序进行。
NandFlash使用前需要统一擦除(按块擦除),擦除后填充1。擦除块,将块中的每个字节与0xFF比较,如果不是0xFF,是坏块。
页烧录前需要擦除,如果页烧录之前没有擦除,烧录的数据将是错误的。烧时,SoC通过命令线、IO线依次发送烧录命令、烧录地址、烧录数据等进入NandFlash。NandFlash芯片接口电路接收页数据到缓冲区,再集中烧录到NandFlash的存储颗粒。烧录过程需要一定时间,SoC的NandFlash控制器需要等待NandFlash烧录完,等待过程中SoC的NandFlash控制器将会不断读取页烧录状态。SoC的NandFlash控制器收到正确的状态响应时,确认页烧录已经成功,如果一直未收到正确的状态,则认为烧录页所在的块是坏块。
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/82/8F/wKiom1daOLbhoWJ5AACkirgxuC0773.png" title="图片10.png" alt="wKiom1daOLbhoWJ5AACkirgxuC0773.png" />
页烧录编程流程如下:
A、发出片选信号
B、发送页烧录命令第一个周期命令0x80
C、随机写页内某个地址的值
D、发送页写命令0x85
E、写入页内偏移地址
F、写入数据
G、发送页烧录命令第二个周期命令0x10
H、等待状态
I、读取状态,页烧录成功取消片选信号,失败取消片选信号
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/82/8E/wKioL1daOfOy1-lrAACmzqCZa10270.png" title="图片11.png" alt="wKioL1daOfOy1-lrAACmzqCZa10270.png" />
擦除操作必须指定块对齐的地址。块擦除编程流程如下:
A、获取擦除块的地址(块对齐)
B、发出片选信号
C、发送擦除命令,第一个周期发命令0x60,第二个周期发块地址,第三个周期发命令0xd0 。
D、清除状态,等待状态。
E、读取状态,擦除成功则取消片选,擦除失败取消片选。
页读取编程流程:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/82/8F/wKiom1daOQqjEMroAACLGBLnSZQ395.png" title="图片12.png" alt="wKiom1daOQqjEMroAACLGBLnSZQ395.png" />
A、发出片选信号
B、发送页读取命令,第一个周期发命令0x00,第二个周期发送页地址,第三个周期发送命令0x30
C、等待状态
D、发送页读取第一个周期命令0x05
E、写入页内偏移地址
F、发送页读取第二个周期命令0xE0
G、读取数据
H、检查状态,如果读取成功,取消片选信号,读取失败取消片选信号。
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控制器)
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/82/8F/wKiom1daOTbgxbGHAAC8A5AaDoI081.png" title="图片13.png" alt="wKiom1daOTbgxbGHAAC8A5AaDoI081.png" />
NFCONF:NandFlash配置寄存器
NFCONT:NandFlash控制寄存器
NFCMMD:NandFlash命令寄存器
NFADDR:NandFlash地址寄存器
NFDATA:NandFlash数据寄存器
NFSBLK:烧录块起始地址
NFEBLK:烧录块结束地址
NFSTAT:状态寄存器
Smart210的NandFlash为512MB的SLC类型。
电路原理图查阅
查阅核心板电路原理图有关NandFlash部分,
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/82/8E/wKioL1daOmHimBMeAAFRLvxo7fc281.png" title="图片14.png" alt="wKioL1daOmHimBMeAAFRLvxo7fc281.png" />
NandFlash片选信号引脚为Xm0CSn2,在核心板电路原理图搜Xm0CSn2可知,NandFlash接在Memory Port0,对应GPIO为MP01-MP03
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/82/8F/wKiom1daOXPixvAoAADT_iqXxOk399.png" title="图片15.png" alt="wKiom1daOXPixvAoAADT_iqXxOk399.png" />
GPIO配置如下:
MP0_1CON = 0x22333322;
MP0_2CON = 0x00002222;
MP0_3CON = 0x22222222;
工程源代码见附件,编译后在Smart210烧录可以正常运行,可以正常的对NnandFlash进行擦除、烧录、读取等测试操作。
参考博文:
NandFlash简介 (CSDN 喝醉的毛毛虫)
本文出自 “生命不息,奋斗不止” 博客,请务必保留此出处http://9291927.blog.51cto.com/9281927/1787752