Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的如硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。
Flash的内部存储是金属-氧化层-半导体-场效晶体管(MOSFET),里面有个悬浮门(Floating Gate),是真正存储数据的单元。
数据在Flash内存单元中是以电荷(electrical charge) 形式存储的。存储电荷的多少,取决于图中的控制门(Control gate)所被施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。而数据的表示,以所存储的电荷的电压是否超过一个特定的阈值Vth 来表示。 1.对于NAND Flash的写入(编程),就是控制Control Gate去充电(对Control Gate加压),使得悬浮门存储的电荷够多,超过阈值Vth,就表示0。 2.对于NAND Flash的擦除(Erase),就是对悬浮门放电,低于阀值Vth,就表示1。 NAND Flash的架构:
如上图所示,这是一个8Gb 50nm的SLC颗粒内部架构。
每个page有33,792个单元,每个单元代表1bit(SLC),所以每个page就是4096Byte + 128Byte(SA)。 page是NAND Flash上最小的读/写单位(一个page上的单元共享一根字符线Word line),块是最小的擦除单位(。不同厂牌不同型号颗粒有不同的page和block大小。 下图是个8Gb 50nm的SLC颗粒。
4KB的页尺寸,256KB的块尺寸。图中4096字节用于存储数据,另外128字节用来做管理和ECC用。 SLC 和 MLC 区别:
SLC主要针对军工,企业级应用,有着高速写入,低出错率,长耐久度特性。
1.相邻的存储电荷的悬浮门间会互相干扰,造成悬浮门里的电荷不稳定出现bit错误,MLC由于阀值相比SLC更接近,造成出错几率更大。 eMLC和eSLC的耐久度提升是用牺牲了数据保存期和增加读写时间换来的。(也就是性能会更差点)
1、特性
相对于SPI FLASH(W25Q256)和SD卡等存储设备,NAND FLASH采用8位并口访问,具有访问速度快的优势
芯片操作是以块(block)为基本单位。每块又分成多个页(page),页大小一般是2048字节,读和写都是按照扇区进行的,最小擦除单位是 block
NAND FLASH的写操作具有只可以写0,不能写1的特性,所以,在写数据的时候,必须先擦除block(擦除后,block数据全部为1),才可以写入
NAND FLASH的page由2部分组成:数据存储区(data area)和备用区域(spare area),对MT29F4G08来说,数据存储区大小为2K字节,备用区域大小为64字节。我们存储的有效数据,一般都是存储在数据存储区。备用区域一般用来存放ECC(Error Checking and Correcting)校验值
2、存储单元结构
图为MT29F4G08的存储结构,由2个plane组成,每个plane有2048个block,每个block由64个page组成,每个page有2K+64字节(2112字节)的存储容量。所以,MT29F4G08的总容量为:2*2048*64*(2K+64)= 553648128字节(512MB)
3、NAND FLASH寻址
对NAND操作实际上就是对NAND的指定地址数据进行读写,NAND FLASH的地址分为三类:
块地址(Block Address)用于在一个Page内部字节寻址
页地址(Page Address)用于在一个Block内部页寻址
列地址(Column Address)用于在NAND内部块寻址
以MT29F4G08为例,这三个地址,通过5个周期发送,首先发送列地址,在发送页地址和块地址。如表所示:
CA0~CA11为列地址,MT29F4G08的一个Page为2112字节,需要12个地址线寻址;
PA0~PA5为页地址,MT29F4G08一个Block为64个Page,需要6个地址线寻址;
BA6~BA17为块地址,MT29F4G08总共有4096个Block,需要12根地址线寻址。
4、坏块管理与磨损均衡
因为NAND FLASH在出厂和使用过程中都可能会产生坏块,且每个BLOCK的擦除次数是有限制的,超过规定次数后,BLOCK将无法再擦除(即产生坏块),因此,我们首先需要能对这些坏块进行识别跟标记,然后合理的分配和使用好的块,以最大限度的延长NAND FLASH的寿命。NAND FLASH的坏块识别有几种方式:1,NAND厂家出厂的时候,会在每个Block的第一个page和第二个page的spare区的第一个字节写入非0XFF的值来表示,我们可以通过这个判断该块是否为坏块;2,通过给每个Block写入数值(0XFF/0X00),然后读取出来,判断写入的数据和读取的数据是否完全一样,来识别坏块;3,通过读取数据时,校验ECC错误,来识别坏块。
5、ECC校验
ECC,英文全称为:Error checking and Correction,是一种对传输数据的错误检测和修正的算法。NAND FLASH存储单元是串行组织的,当读取一个单元的时候,读出放大器所检测到信号强度会被这种串行存储结构削弱,这就降低了所读信号的准确性,导致读数出错(一般只有1个bit出错)。ECC就可以检测这种错误,并修正错误的数据位。
STM32的FMC模块就支持硬件ECC计算,使用的是汉明码,可以实现1bit错误的修正和2bit以上错误的检测,支持页大小按256、512、1024、2048、4096和8192字节为单位进行ECC计算。汉明码算法需要2n bit的ECC校验数据来处理2^n bit的数据包。比如,我们一般以512字节为单位来计算ECC值,只需要24bit的ECC码即可表示 2^12=4096bit=512字节,12*2=24bit
————————————————
|