NAND FLASH学习笔记之nand flash基础(三)

时间:2024-03-16 14:30:35

(4)nand flash的操作方法

1、命令字

NAND FLASH学习笔记之nand flash基础(三)

NAND Flash的读取和烧录以(page)页为基础,擦除以块为单位。那么,在NANDFlash上有三种基本的操作:读取一个页, 烧录一个页和擦除一个块,这三个基本操作有各自的命令序列。

实际上,大多数NAND Flash除提供了这三个基本操作外,还提供了很多其他的操作及操作命令序列,如:MT29F32G08CBACA就提供了Multi PlaneProgram(多层烧写)、Multi Plane Erase(多层擦除)、Copy-back Program(同层页复制)、Multi-PlaneCopy-Back Program(多层同层页复制)、Multi PlaneErase(多层擦除)、EDC Operation(ECD操作)、reset(复位)等操作。

这里涉及到了一个层的概念,什么是层?有什么特性?他的作用是啥?

层就是将芯片各块平均分配到块组,如:块编号为奇数为一组,块编号为偶数的分为一组,这样的块组就叫层。

层有这样的特性:用户可对不同层中的块同时进行擦除和烧写甚至复制。MT29F32G08CBACA中的块分成了2个层,有些NAND flash分成了4个层。

作用:分层操作能成倍提高烧写、擦除速度。


2、读页操作的分析

读页操作有两个命令序列,命令字分别为00h、30h。

1、读页流程

读页操作有两个命令序列,命令字分别为00h、30h。

NAND FLASH学习笔记之nand flash基础(三)

整个流程比较简单:

先写读页操作的第一个命令序列的命令字00h,然后写页地址;

然后写第二个命令序列的命令字30h。

再读取状态寄存器的位0,为1后就可以从NFDATA连续读出页内数据。 

· 2、读页时序分析

NAND FLASH学习笔记之nand flash基础(三)

(1)黄色竖线穿过的第一行,是CLE。将CLE置1,就说明你将要通过I/O复用端口发送进入Nand Flash的,是命令,而不是地址或者其他类型的数据。只有这样将CLE置1,

使其有效,才能去通知了内部硬件逻辑,你接下来将收到的是命令,内部硬件逻辑,才会将受到的命令,放到命令寄存器中,才能实现后面正确的操作,否则,不去将CLE置1

使其有效,硬件会无所适从,不知道你传入的到底是数据还是命令了。

(2)而第二行,是CE#,那一刻的值是0,就是片选有效。

(3)第三行是WE#,意思是写使能。因为接下来是往nand Flash里面写命令,所以,要使得WE#有效。

(4)第四行,是ALE是低电平,而ALE是高电平有效,此时意思就是使其无效。而对应地,前面介绍的,使CLE有效,因为将要数据的是命令,而不是地址。接下来的要输入地

址的时候,就要使其有效,而使CLE无效了。

(5)第五行,RE#,此时是高电平,无效。可以看到,知道后面低6阶段,才变成低电平,才有效,因为那时候,要发生读取命令,去读取数据。

(6)第六行,就是我们重点要介绍的,复用的输入输出I/O端口了,此刻,还没有输入数据,接下来,在不同的阶段,会输入或输出不同的数据/地址。

(7)第七行,R/B#,高电平,表示R(Ready)/就绪,因为到了后面的第5阶段,硬件内部,在第四阶段,接受了外界的读取命令后,把该页的数据一点点送到页寄存器中,这

段时间,属于系统在忙着干活,属于忙的阶段,所以,R/B#才变成低,表示Busy忙的状态的。


读操作过程的解释

(1) 操作准备阶段:此处是读(Read)操作,所以,先发读命令的第一个阶段的0x00,表示,让硬件先准备一

下,接下来的操作是读。

(2) 发送两个周期的列地址,即页内地址。表示要从一个页的什么位置开始读取数据。

(3) 接下来再传入三个行地址,即页号。

(4) 再发一个读操作第二个周期的命令0x30。接下来,就是硬件内部自己的事情了。

(5) Nand Flash内部硬件逻辑,负责去按照你的要求,根据传入的地址,找到哪个块中的哪个页,然后把整个这

一页的数据,都一点点搬运到页缓存中去。而在此期间,你所

能做的事,也就只需要去读取状态寄存器,看看对应的位的值,也就是R/B#那一位,是1还是0,0的话,就表示,

系统是busy,仍在”忙“(着读取数据),如果是1,就说系统

活干完了,忙清了,已经把整个页的数据都搬运到页缓存里去了,你可以接下来读取你要的数据了。

对于这里。估计有人会问了,这一个页一共4096+224字节,如果我传入的页内地址,就像上面给的1028一类的

值,只是想读取1028到2011这部分数据,而不是页开始的0

地址整个页的数据,那么内部硬件却读取整个页的数据出来,岂不是很浪费吗?答案是,的确很浪费,效率看起来

不高,但是实际就是这么做的,而且本身读取整个页的数据,

相对时间并不长,而且读出来之后,内部数据指针会定位到你刚才所制定的1208的那个位置。

(6) 接下来,就是你“窃取”系统忙了半天之后的劳动成果的时候了。通过先去Nand Flash的控制器中的数据寄存

器中写入你要读取多少个字节(byte)/字(word),然后就可以去

Nand Flash的控制器的FIFO中,一点点读取你要的数据了。

至此,整个Nand Flash的读操作就完成了。


3、读ID

读设备ID只有一个命令字90h,先向命令寄存器写入90h再向地址寄存器写入00h可启动读ID操作,后续连续5次读取数据寄存器操作可以读出5个包含了全部id内容的数据。这5

个数据内容如下:

NAND FLASH学习笔记之nand flash基础(三)

下面对几个重要的id内容做一个简单的介绍:

NAND FLASH学习笔记之nand flash基础(三)

NAND FLASH学习笔记之nand flash基础(三)

NAND FLASH学习笔记之nand flash基础(三)

(5)nand flash的其他一些补充

1、NAND FLASH控制器

NAND FLASH学习笔记之nand flash基础(三)

地址空间:只写空间,用来写入控制器将要写到nand flash中的地址

命令空间:只写空间,用来写入控制器将要发送给nand flash的命令

数据空间:读写,用来写入将要发送给nand flash的数据,或是存放从nand flash中读取到的数据

注:这就体现出了控制器的作用了。

A、若没有控制器,对于写命令 “80h”这一操作,你就须要做很多事情:Set pin CLE high, set pin WE# low,等等,可能你还要以配置GPIO的形式让相应的数据在线出现 “80h”。

B、有了控制器,你只需 REG32(0xBA400000) = 80h, 剩下的事情就让控制器去做


2、BCH控制器

我们将以读写的例子进行说明:

Nand_read_page

在读操作中, NAND Flash控制器首先执行页读取(Page read)操作,从目标 Nand Flash读出一整页数据,然后交由给BCH译码模块执行译码(BCH_decoding),译码完毕后,

可能通过软件(驱动程序)判断有没有数据坏块,如果有的话,在软件中要执行一个 “correct()”函数来纠正其中的错误。之后 ,由CPU或者DMA将译码后的数据写入Memory的一

个buffer中。

Nand_program_page

在写操作中,CPU或者DMA先是把一个buffer的数据交给BCH编译模块去执行编码(BCH_encoding), 编码完毕后,再由CPU或者DMA将编码后相关的数据(包括data区和oob区)

写入到Nand Flash中。

kernel/arch/mips/xburst/soc-4780/common/


到这里我们已经对nand flash有了一个大体的认识,下面我们开始看mtd 下的nand flash 驱动程序了,以及我调试时遇到的问题!!!!!!!!!!!!!!!