CLE(COMMAND LATCH ENABLE): 命令寄存器使能指示当前数据为控制命令,CLE输入控制路径发送到命令寄存器。
ALE(ADDRESS LATCH ENABLE): 地址寄存器使能指示当前数据为地址
CE#(CHIP ENABLE):芯片使能,俗称片选信号,表示flash chip是否被系统选中为当前操作芯片,低电平表示选中
RE#(READ ENABLE): 读使能,RE是串行数据输入,低电平时读取data到I/O总线,RE下降沿时读取数据有效
WP#(WRITE PROTECT): 写保护,在电源置换过程中处于有效的低电平状态,保护flash里面的数据不受改写。 R/B#:ready/busy#指示目标的就绪和忙状态。当所有晶粒(逻辑单元)都处于工作状态则这个目标是busy 状态RDY为0,反之则target 为reday状态RDY为1。
The ready/busy# (R/B#) signal provides a hardware method of indicating whether a tar-
get is ready or busy. A target is busy when one or more of its die (LUNs) are busy
(RDY = 0). A target is ready when all of its die (LUNs) are ready (RDY = 1). Because each
die (LUN) contains a status register, it is possible to determine the independent status
of each die (LUN) by polling its status register instead of using the R/B# signal (see Sta-
tus Operations (page 56) for details regarding die (LUN) status).
This signal requires a pull-up resistor, Rp, for proper operation. R/B# is HIGH when the
target is ready, and transitions LOW when the target is busy. The signal's open-drain
2.按照时序来划分,总共下面七个信号共同协调工作,我们先来竖着看,看同一时刻的操作:
第一时刻发送第一个周期的命令0x0,在此时七个信号取值如下:
(1)第一行CLE(COMMAND LATCH ENABLE),将CLE置1,就说明你将要通过I/O复用端口发送进入Nand Flash的,是命令,而不是地址或者其他类型的数据。
(2)而第二行,是nCE(CHIP ENABLE),那一刻的值是0保证nCE为低电平也就是片选有效。
(3)第三行是nWE(WRITE ENABLE),意思是写使能。因为接下来是往nand Flash里面写命令,所以,要使得nWE有效,所以设为低电平。
(4)第四行,是ALE(ADDRESS LATCH ENABLE)是低电平,而ALE是高电平有效,此时意思就是使其无效。
(5)第五行,nRE(READ ENABLE),此时是高电平,无效。
(6)第六行,就是我们重点要介绍的,复用的输入输出I/O端口了,此刻,还没有输入数据,接下来,在不同的阶段,会输入或输出不同的数据/地址。
(7)第七行,R/nB,高电平,表示R(Ready)/就绪,因为到了后面的第5阶段,硬件内部,在第四阶段,接受了外界的读取命令后,把该页的数据一点点送到页寄存器中,这段时间,属于系统在忙着干活,属于忙的阶段,所以,R/nB才变成低,表示Busy忙的状态的。
读操作,查P7页的Command Set,1st Cycle发00,2nd Cycle发30。
3.上面介绍了初始时刻的各个信号的值,下面我们来分析一下其余时刻都干了什么。
(1) 操作准备阶段:此处是读(Read)操作,所以,先发一读命令的第一个阶段的0x00,表示,让硬件先准备一下,接下来的操作是读。
(2) 发送两个周期的列地址。也就是页内地址,表示要从一个页的什么位置开始读取数据。
(3) 接下来再传入三个行地址。对应的也就是页号。
(4) 然后再发一个读操作的第二个周期的命令0x30。接下来,就是硬件内部自己的事情了。
(5) Nand Flash内部硬件逻辑,负责去按照你的要求,根据传入的地址,找到哪个块中的哪个页,然后把整个这一页的数据,都一点点搬运到页缓存中去。而在此期间,你所能做的事,也就只需要去读取状态寄存器,看看对应的位的值,也就是R/nB那一位,是1还是0,0的话,就表示,系统是busy,仍在忙,如果是1,说明已经就绪,已经把整个页的数据都搬运到页缓存里去了,你可以接下来读取你要的数据了。
这里,这一个页一共4096+224字节,如果我传入的页内地址只是想读其中部分数据,而不是页开始的0地址整个页的数据,由于nandflash 的分页机制最小读取单位是页所以内部硬也会读取整个页的数据出来,读出来之后,内部数据指针会定位到刚才我所制定那个位置。
(6) 接下就可以去Nand Flash的控制器中的数据寄存器中写入你要读取多少个字节(byte)/字(word),然后就可以去Nand Flash的控制器的FIFO读取你要的数据了。
至此,整个Nand Flash的读操作就完成了。
对于其他操作类似以上分析,可以一点点自己去看数据手册,根据里面的时序图去分析具体的操作过程,然后对照代分析即可。
4.地址传送
比如访问地址10000
10000/4096 = 2.4所以地址在第3页
10000-2*4096= 1808,所以在第2页的第1808个地址
所以,1、2Cycle发的就是Ox710(1808),第1st Cycle发的就是0x10,2nd Cycle发的就是0x7
而3、4、5Cycle发的0x2,第3rd Cycle发的是0x2,第4th Cycle发的是0x0,第5th Cycle发的是0x0。
(Nand Flash有一个"位反转"的特性,就是在读一页的时候,有一位或某几位,可能出现原来是1,读完了以后就是0,Linux系统中,一般叫做OOB(Out Of Band),这个区域,基于Nand Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction,或者Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。这也就是每一页4K Byte旁边都有224 Byte的一个区域(空闲区域通常用其他软件开销功能和于ECC、耗损均衡(wearleveling)),这个64Byte就是OOB区域。)
nandflash 的工作原理可以参考一下文章:
http://wenku.baidu.com/link?url=Z7PCE89joFOrDU7Kw4RByiC9VXXgmH3_6ivZT2KqD1qEO2Bd4izWz9sBN391HvWyq2E0ap5U9rbYx_Dtxa9Rm0NC-jt2kBToIm6wnNLr5ny
http://blog.csdn.net/liukun321/article/details/6598921
http://blog.csdn.net/chen198746/article/details/9852053
下篇预告 《NANDFLASH配置源码分析》