2016 - 2024

感恩一路有你

Nand Flash裸机驱动程序的设计

浏览量:1125 时间:2024-01-18 17:39:09 作者:采采

每种类型的存储设备都有其缺点,NAND Flash的缺点为坏块较多,并且难以修复,由于数据,命令,地址,数据都用同一批I/O口传输,以致驱动程序较为复杂。本文根据NAND Flash的原理来介绍NAND Flash裸机驱动程序的设计。

硬件特性

Flash全名叫做flash memory,属于非易失性存储设备,与此相对应的是易失型设备(就是平常我们电脑用的内存SDRAM,断电后数据就没有了)。数据在FLASH内存单元当中是以电荷形式存储的。存储电荷的多少,取决于图中外部门(extern gate)所施加的电压,其控制了是向存储单元中冲入电荷还是使其释放电荷。

NAND Flash的寻址方式

区别于SDRAM与NOR Flash等存储设备,SDRAM与NOR Flash可以直接通过CPU地址引脚直接访问对应的数据,而NAND Flash通过IO口经过复杂的编程来实现寻址。

编程相关

  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,再看看具体传递地址的流程。

可以算出:

  1. 1st周期,A7~A0:1011 1000 0xB8
  2. 2nd周期,A11~A8:0000 0100 0x04(这里的高四位的0不是原数据中的,而是硬件要求的)
  3. 3rd周期,A19~A12:0010 0000 0x20
  4. 4th周期,A27~A20:0110 1011 0x6B
  5. 5th周期,A30~A28:0000 0011 0x03

算出地址以后,接下来就针对读操作进行细说:

  1. (1)操作准备阶段:此处是读(Read)操作,所以,先发一个图5中读命令的第一个阶段的0x00,表示,让硬件先准备一下,接下来的操作是读。
  2. (2)发送两个周期的列地址。也就是页内地址,表示,我要从一个页的什么位置开始读取数据。
  3. (3)接下来再传入三个行地址。对应的也就是页号。
  4. (4)然后再发一个读操作的第二个周期的命令0x30。接下来,就是硬件内部自己的事情了。
  5. (5)Nand Flash内部硬件逻辑,负责去按照你的要求,根据传入的地址,找到哪个块中的哪个页,然后把整个这一页的数据,都一点点搬运到页缓存中去。而在此期间,你所能做的事,也就只需要去读取状态寄存器,看看对应的位的值,也就是R/B那一位,是1还是0,0的话,就表示,系统是busy,仍在”忙“(着读取数据),如果是1,就说系统活干完了,忙清了,已经把整个页的数据都搬运到页缓存里去了,你可以接下来读取你要的数据了。
  6. 对于这里。估计有人会问了,这一个页一共2048 64字节,如果我传入的页内地址,就像上面给的1208一类的值,只是想读取1028到2011这部分数据,而不是页开始的0地址整个页的数据,那么内部硬件却读取整个页的数据出来,岂不是很浪费吗?答案是,的确很浪费,效率看起来不高,但是实际就是这么做的,而且本身读取整个页的数据,相对时间并不长,而且读出来之后,内部数据指针会定位到你刚才所制定的1208的那个位置。
  7. (6)接下来,就是你“窃取“系统忙了半天之后的劳动成果的时候了,呵呵。通过先去Nand Flash的控制器中的数据寄存器中写入你要读取多少个字节(byte)/字(word),然后就可以去Nand Flash的控制器的FIFO中,一点点读取你要的数据了。

至此,整个Nand Flash的读操作就完成了。对于其他例如写操作,可以参照DATA SHEET编写。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。