多语言展示
当前在线:1364今日阅读:39今日分享:10

Nand flash裸机驱动程序的设计

每种类型的存储设备都有其缺点,NAND FLASH其缺点为坏块较多,并且难以修复,由于数据,命令,地址,数据都用同一批I/O口传输,以致驱动程序较为复杂。本文根据NAND FLASH的原理来介绍NAND FLASH 裸机驱动程序的设计。  1.硬件特性:  Flash全名叫做flash memory,属于非易失性存储设备,与此相对应的是易失型设备(就是平常我们电脑用的内存SDRAM,断电后数据就没有了)。  数据在FLASH内存单元当中是以电荷形式存储的。存储电荷的多少,取决于图中外部门(extern gate)所施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。  2.NAND FLASH的寻址方式  区别于SDRAM与NOR FLASH等存储设备,SDRAM与NOR FLASH可以直接通过CPU地址引脚直接访问对应的数据,而NAND FLASH通过IO口经过复杂的编程来实现寻址。  3.编程相关  1)从DATASHEET里面,看出,配置NFCONF时需要设置一个叫做MLCFLASH的参数,这个参数的作用是选择闪存类型的。  (1)SLC:单个存储单元,只存储一个数据。  (2)MLC:单个存储单元可以存储多个位。  如何识别SLC还是MLC:NAND FLASH设计中,有个命令叫做ReadID,读取ID,意思是读取芯片ID,还有比如NAND FLASH内部是多少个片(chip)组成的,每个chip包含了几个片(plane),每一片中的页大小,块大小,等等。  2)比如我我们要访问其中的第7000个块中的第25页中的1208字节处的地址,计算出具体地址为:  物理地址=块大小*块号+页大小*页号+页内地址=7000*128k+64*2k+1208=0x36B204b8,再看看具体传递地址的流程。  可以算出:  1st周期,A7~A0 :1011 1000=0x B8  2nd周期,A11~A8 :0000 0100 = 0x04(这里的高四位的0不是原数据中的,而是硬件要求的)  3rd周期,A19~A12 :0010 0000 = 0x20  4th周期,A27~A20 :0110 1011 = 0x6B  5th周期,A30~A28 :0000 0011 = 0x03  算出地址以后,接下来就针对读操作进行细说:  (1) 操作准备阶段:此处是读(Read)操作,所以,先发一个图5中读命令的第一个阶段的0x00,表示,让硬件先准备一下,接下来的操作是读。  (2) 发送两个周期的列地址。也就是页内地址,表示,我要从一个页的什么位置开始读取数据。  (3) 接下来再传入三个行地址。对应的也就是页号。  (4) 然后再发一个读操作的第二个周期的命令0x30。接下来,就是硬件内部自己的事情了。  (5) Nand Flash内部硬件逻辑,负责去按照你的要求,根据传入的地址,找到哪个块中的哪个页,然后把整个这一页的数据,都一点点搬运到页缓存中去。而在此期间,你所能做的事,也就只需要去读取状态寄存器,看看对应的位的值,也就是R/B#那一位,是1还是0,0的话,就表示,系统是busy,仍在”忙“(着读取数据),如果是1,就说系统活干完了,忙清了,已经把整个页的数据都搬运到页缓存里去了,你可以接下来读取你要的数据了。  对于这里。估计有人会问了,这一个页一共2048+64字节,如果我传入的页内地址,就像上面给的1208一类的值,只是想读取1028到2011这部分数据,而不是页开始的0地址整个页的数据,那么内部硬件却读取整个页的数据出来,岂不是很浪费吗?答案是,的确很浪费,效率看起来不高,但是实际就是这么做的,而且本身读取整个页的数据,相对时间并不长,而且读出来之后,内部数据指针会定位到你刚才所制定的1208的那个位置。  (6) 接下来,就是你“窃取“系统忙了半天之后的劳动成果的时候了,呵呵。通过先去Nand Flash的控制器中的数据寄存器中写入你要读取多少个字节(byte)/字(word),然后就可以去Nand Flash的控制器的FIFO中,一点点读取你要的数据了。  至此,整个Nand Flash的读操作就完成了。  对于其他例如写操作,可以参照DATA SHEET编写。
推荐信息