分类: 嵌入式
2013-11-11 23:25:21
Nand flash
Nand flash 是在嵌入式设备中使用比较广的一种flash芯片。比较SPI flash来说,它针对要求存储空间比较大的设备。我们可以将Nand Flash理解成一种块设备,从其中写入和读出数据都必须是成块操作,不能实现随机访问。
嵌入式设备常用的存储设备有Nand Flash、SPI Flash和Nor Flash。Nor Flash这种高端大气上档次的设备在我们开发屌似产品时基本上没有看到使用的,取而代之是SPI Flash。SPI Flash就是Nor Flash的串行版本,外部接口简单,但是速度比较慢。Nand Flash也算高富帅的东西了,至少在本屌似眼中,能用上Nand Flash在开发过程中至少可以不需要节衣缩食。不要去裁剪那些百多K的多余模块。本文首先介绍一下Nand Flash。
Nand Flash结构
一、Nand Flash是又一种叫块的结构堆叠而成,块一般写作block,块是Nand Flash中最小的擦除单位,如果需要擦除Flash,那么最小必须擦除一个Flash Block。
二、Nand Flash 中所有存储颗粒,也就是软件上对应的每一个bit,只能从1反转到0,而不能从0写为1,只有擦除操作可以将存储颗粒从0反转到1,这个特性就要求对Flash进行写操作的时候需要先对相应的区域进行擦除操作。
三、一个Flash的块是由若干个Page组成,Page是读写Nand Flash的最小单位。一般Page有两中规格,一种是512B+16B的小页形式,一种是2048B+64B的大页形式。
四、Nand Flash中可能存在坏块,坏块产生的原因有可能是出厂的时候就产生了,还有可能是在使用过程中多次擦除操作会产生坏块。
五、那么如何辨别出厂的坏块呢,有一种方法是:一般芯片原厂都会在出厂时都会将每个坏块第一个page的spare area的第6个byte标记为不等于0xff的 值。
六、坏块的管理,关于Nand Flash坏块的管理,这里必须指出两个知识点,一个是BBT,即bad block table 专门用nand做存储的,会把bbt放到block0,因为第0块一定是好 的块。但是如果nand本身被用来boot,那么第0块就要存放程序,不能放bbt了。 有的把bbt放到最后一块,当然,这一块坚决不能为坏块。 bbt的大小跟nand大小有关,nand越大,需要的bbt也就越大。
七、另外还有一种校验机制叫做ECC, NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出 错。一般使用一种比较专用的校验——ECC。ECC能纠正单比特错误和检测双比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的 错误不保证能检测。
八、ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1。(512生成两组ECC,共6字节) 当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB (out- of-band)数据区中。其位置就是eccpos[]。校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和新ECC校验 和按位异或,若结果为0,则表示不存在错(或是出现了ECC无法检测的错误);若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠 正;若3个字节异或结果中只存在1个比特位为1,表示OOB区出错;其他情况均表示出现了无法纠正的错误。
Nand Flash的硬件接口
Nand Flash的数据总线宽度有8位和16两种宽度。其它信号如下表说明。
Nand Flash读写命令和命令时序
首先我们贴出命令序列的一般格式,以及经常使用的命令
RESET操作
READ ID操作
Read id得到的4Byte对于各个厂商不同的设备定义可能不同,可以根据数据手册得到Flash芯片厂商、大小、Page Size等等比较相信的信息。
READ STATUS
Nand Flash的状态可以通过READ STATUS命令获取到。READ STATUS命令是第二个可以在Nand Device设备忙的时候执行的命令。这个命令不需要设置地址,也不需要第二个命令周期。在释放命令70H后,拉低RE#信号就能读取到1Byte的状态信息。从状态信息中不仅仅可以看到设备是不是处于忙状态,而且可以看到之前的擦除和写操作是不是执行成功了。
ERASE操作
擦除操作有两点需要注意,一就是地址只有三个周期,只在总线上释放最高位的三个地址周期。第二就是在擦除操作接受后,一般紧接着就是用READ STATUS命令来查询擦除操作是不是执行成功了。
WRITE操作
写操作需要输出5个cycle的地址,然后接着输出写入的数据,最后10h命令后开始正式写入。等待完成写入后使用READ STATUS命令来查询写入操作的结果。
READ操作
READ操作以00h命令开始,之后跟5个cycle的地址。之后使用30h命令确认读取操作开始。之后拉低RE#信号,使得Nand Device将数据传递到数据总线上面。不断反转RE#信号可以不断读出数据,直到读完整个page。
andy yixin deng
南京