Tiny210(S5PV210) U-BOOT(四)----Nand Flash原理(2)

下面以一个实际的读操作,来讲一下Nand Flash的时序:

Tiny210(S5PV210) U-BOOT(四)----Nand Flash原理(2)_第1张图片

在开始解释前,多罗嗦一下”使能”这个词,使能(Enable),是指使其(某个信号)有效,使其生效的意思......比如,上面图中的CLE线号,是高电平有效,如果此时将其设为高电平,我们就叫做,将CLE使能,也就是使其生效的意思。使能,这个中文翻译有点怪怪的,有点像WDT(Watch Dog Timer),中文翻译叫看门狗,这是英文直译,另一种解释叫做监视定时器,也许后一种解释会更好一点儿吧。

按照时序来划分,总共下面七个信号共同协调工作,我们先来竖着看,看同一时刻的操作:
Tiny210(S5PV210) U-BOOT(四)----Nand Flash原理(2)_第2张图片
我们来一起看看,我在图6中的特意标注的①边上的黄色竖线。
黄色竖线所处的时刻,是在发送读操作的第一个周期的命令0x00之前的那一刻。
让我们看看,在那一刻,其所穿过好几行都对应什么值,以及进一步理解,为何要那个值。
(1)黄色竖线穿过的第一行,是CLE。还记得前面介绍命令所存使能(CLE)那个引脚吧?CLE,将CLE置1,就说明你将要通过I/O复用端口发送进入Nand Flash的,是命令,而不是地址或者其他类型的数据。只有这样将CLE置1,使其有效,才能去通知了内部硬件逻辑,你接下来将收到的是命令,内部硬件逻辑,才会将受到的命令,放到命令寄存器中,才能实现后面正确的操作,否则,不去将CLE置1使其有效,硬件会无所适从,不知道你传入的到底是数据还是命令了。
(2)而第二行,是nCE,那一刻的值是0。这个道理很简单,你既然要向Nand Flash发命令,那么先要选中它,所以,要保证nCE为低电平,使其有效,也就是片选有效。
(3)第三行是nWE,意思是写使能。因为接下来是往nand Flash里面写命令,所以,要使得nWE有效,所以设为低电平。
(4)第四行,是ALE是低电平,而ALE是高电平有效,此时意思就是使其无效。而对应地,前面介绍的,使CLE有效,因为将要数据的是命令,而不是地址。如果在其他某些场合,比如接下来的要输入地址的时候,就要使其有效,而使CLE无效了。
(5)第五行,nRE,此时是高电平,无效。可以看到,知道后面低6阶段,才变成低电平,才有效,因为那时候,要发生读取命令,去读取数据。
(6)第六行,就是我们重点要介绍的,复用的输入输出I/O端口了,此刻,还没有输入数据,接下来,在不同的阶段,会输入或输出不同的数据/地址。
(7)第七行,R/nB,高电平,表示R(Ready)/就绪,因为到了后面的第5阶段,硬件内部,在第四阶段,接受了外界的读取命令后,把该页的数据一点点送到页寄存器中,这段时间,属于系统在忙着干活,属于忙的阶段,所以,R/nB才变成低,表示Busy忙的状态的。
读操作,查P7页的Command Set,1st Cycle发00,2nd Cycle发30。


Tiny210(S5PV210) U-BOOT(四)----Nand Flash原理(2)_第3张图片
上面介绍了时刻(1)的各个信号的值,以及为何是这个值之后,相信,后面的各个时刻,对应的不同信号的各个值,下面我们来分析一下其余时刻都干了什么。

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

5.地址传送
Nand Flash有一个"位反转"的特性,就是在读一页的时候,有一位或某几位,可能出现原来是1,读完了以后就是0,Linux系统中,一般叫做OOB(Out Of Band),这个区域,基于Nand Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction,或者Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。这也就是每一页2K Byte旁边都有64 Byte的一个区域,这个64Byte就是OOB区域。

比如访问地址8000
8000/2048 = 3.9,所以地址在第3页
8000-3*2048 = 1856,所以在第3页的第1856个地址
所以,1,2Cycle发的就是Ox740(1856),第1st Cycle发的就是0x40,2nd Cycle发的就是0x7
而3,4,5Cycle发的是3,第3rd Cycle发的是0x3,第4th Cycle发的是0x0,第5th Cycle发的是0x0。OK,至此,Nand Flash的原理分析完毕,将常用的存储原理,还有引脚功能,时序功能,和地址传送简单的讲了一些,这些对于后面分析u-boot源码中的Nand Flash的初始化代码和搬内核的代码很有用,理解了Nandf Flash的基本原理,后面再分析u-boot内核中去对Nand Flash的代码来就顺手的多了

你可能感兴趣的:(Flash,u-boot,bootloader,nand,Tiny210,s5pv210)