您的位置:首页 > 其它

第五章、Tiny4412 U-BOOT移植五 Nand Flash原理

2014-07-07 23:20 465 查看
此篇是半写半抄来的。参考文章查看第一章说明。
Tiny4412中是没有焊接NandFlash的,取而代知的是eMMC芯片,所以这一节我也没有细细的去看,为了自己以后可能会修改这部分代码,我将网友“南山一梦”关于NandFlash基本原样的复制过来了。里面内容基本没有作太多修改。后面我会试着来分析eMMC如何操作。

一、芯片简介

虽然Tiny4412中没有焊接NandFlash,但PCB板上是有这部分电路的,原理图上所用的Flash芯片型号是:K9GAG08U0E



图5-1、Tiny4412 核心板图
查找三星芯片的命名手册,这个网上有PDF名称叫“三星_Nand_Flash_芯片型号命名规则.pdf”,查找K9GAG08U0E所代表的具体参数如下,另外说明一下有一款K9GAG08U0D,这两款的读写时序和驱动是可以互相兼容的,但是K9GAG08U0D是与4K/page的大小来进行读定的,而且其读取时间只需要64us,4位的纠错算法,相对K9GAG08U0E的8k/pag,读取时间要400us还是有很大的优势,而且它是8位纠错算法的。
芯片类型:NandFlash
Small Classification:MLCNormal
容量:2G/8bit
Technology:Normal
Organization:-Memory Cell Array : (2,076M x 110.49K) x 8bit/ - Data Register : (8K + 436) x8bit

Vcc:2.7V~3.6V
Mode:Normal
整理一下信息:NandFlash , 容量2G/8bit , 是用MLC存储(SingleLevel Cell单层存储) , 总线为8bit , 工作电压为2.7V~3.6V.
这里穿查说一下:其实,现在市场上有SLC,MLC,TLC,QLC架构的闪存芯片,大家可以自己搜搜看看。这里简单从网上COPY点内容来说一下。
什么是SLC?
SLC英文全称(SingleLevel Cell——SLC)即单层式储存。主要由三星、海力士、美光、东芝等使用。
SLC技术特点是在浮置闸极与源极之中的氧化薄膜更薄,在写入数据时通过对浮置闸极的电荷加电压,然后透过源极,即可将所储存的电荷消除,通过这样的方式,便可储存1个信息单元,这种技术能提供快速的程序编程与读取,不过此技术受限于Siliconefficiency的问题,必须要由较先进的流程强化技术(Process enhancements),才能向上提升SLC制程技术。
什么是MLC?
MLC英文全称(MultiLevel Cell——MLC)即多层式储存。主要由东芝、Renesas、三星使用。英特尔(Intel)在1997年9月最先开发成功MLC,其作用是将两个单位的信息存入一个Floating,Gate(闪存存储单元中存放电荷的部分),然后利用不同电位(Level)的电荷,通过内存储存的电压控制精准读写。MLC通过使用大量的电压等级,每个单元储存两位数据,数据密度比较大。SLC架构是0和1两个值,而MLC架构可以一次储存4个以上的值,因此,MLC架构可以有比较好的储存密度。
与SLC相比MLC有不少缺点:MLC架构有许多缺点,首先是使用寿命较短,SLC架构可以写入10万次,而MLC架构只能承受约1万次的写入。其次就是存取速度慢,在目前技术条件下,MLC芯片理论速度只能达到6MB左右。SLC架构比MLC架构要快速三倍以上。再者,MLC能耗比SLC高,在相同使用条件下比SLC要多15%左右的电流消耗。虽然与SLC相比,MLC缺点很多,但在单颗芯片容量方面,目前MLC还是占了绝对的优势。由于MLC架构和成本都具有绝对优势,能满足2GB、4GB、8GB甚至更大容量的市场需求。
关于TLC:
X3(3-bit-per-cell)架构的TLC芯片技术是MLC和TLC技术的延伸,最早期NANDFlash技术架构是SLC(Single-LevelCell),原理是在1个存储器储存单元(cell)中存放1位元(bit)的资料,直到MLC(Multi-LevelCell)技术接棒后,架构演进为1个存储器储存单元存放2位元。2009年TLC架构正式问世,代表1个存储器储存单元可存放3位元,成本进一步大幅降低。如同上一波SLC技术转MLC技术趋势般,这次也是由NANDFlash大厂东芝(Toshiba)引发战火,之后三星电子(SamsungElectronics)也赶紧加入战局,使得整个TLC技术大量被量产且应用在终端产品上。
TLC芯片虽然储存容量变大,成本低廉许多,但因为效能也大打折扣,因此仅能用在低阶的NANDFlash相关产品上,像是低速快闪记忆卡、小型记忆卡microSD或随身碟等。像是内嵌世纪液体应用、智能型手机(Smartphone)、固态硬碟(SSD)等技术门槛高,对于NANDFlash效能讲求高速且不出错等应用产品,则一定要使用SLC或MLC芯片。
2010年NANDFlash市场的主要成长驱动力是来自于智能型手机和平板计算机,都必须要使用SLC或MLC芯片,因此这两种芯片都处于缺货状态,而TLC芯片却是持续供过于求,且将整个产业的平均价格往下拉,使得市调机构iSuppli在统计2010年第2季全球NANDFlash产值时,出现罕见的市场规模缩小情况发生,从2010年第1季43亿美元下降至41亿美元,减少6.5%。
关于QLC
QLC,这是个更新的东西,他作为一个代替光盘的产品还是不错的,虽然他的是、擦写寿命有限,但是想想光盘的寿命,他已经很客观了,但是价格几多,这个就不清楚了。
SLC、MLC、TLC闪存芯片的区别:
SLC = Single-Level Cell,即1bit/cell,速度快寿命长,价格贵(约MLC3倍以上的价格),约10万次擦写寿命
MLC = Multi-Level Cell,即2bit/cell,速度一般寿命一般,价格一般,约3000---10000次擦写寿命
TLC = Trinary-Level Cell,即3bit/cell,也有Flash厂家叫8LC,速度慢寿命短,价格便宜,约500次擦写寿命,目前还没有厂家能做到1000次。
SLC速度最快,MLC速度比TLC更快。但也有资料显示,MLC是不是比TLC快要看制程的,新制程的TLC比老的MLC快多了,不过寿命的确是MLC要长点。

2.存储原理
打开K9GAG08U0E芯片手册的P6页,可看到下面信息:



由芯片手册上可知,这款NANDFLASH,页大小8K,块大小1MB,意思就是读写操作,每次最小为8K,擦除操作每次最小为1M。什么原理呢,继续向下看。



图5-2、Flash内部说明图
由上图5-2可知:1page= 8K, 1 block = 1M, 1Block=128Page, 芯片有2G。
现在开始计算:
1 Block = 128*8 = 1024K=1M
那么我们FLASH的容量就1M* 2076K = 2076M。
这里就有一个问题,为啥要设计成这样?
因为NandFlash是用于设计成嵌入式系统的内存,程序进行内存的寻址时,为了提高速度,所以,将线性的内存在逻辑上进行分块,分页,形成逻辑上的立体结构,这样,寻址就会方便,先找到是哪一块,再找到是哪一页,最后找到是这一页的哪个位置,这要比起从头到尾遍历,就要快很多了。
到这里,存储原理基本弄清楚了,NandFlash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将一个block,常见的块的大小是128KB/256KB,全部擦除为1,也就是里面的内容全部都是0xFF了。这里就有了一个新问题,为什么擦除是写1,而不是写0呢?这和我们正常的逻辑怎么是个反的?
所谓1和0的介定,在存储器中,是通过向存储单元中施加电压来控制向里面是充电荷还是释放电荷。所以,本质上来说,数据0和1的表示,就是存储单元上的电压否超过一个特定的电压值,通常叫阈值,超过了这个阈值,就是1,没超过,就是0。所以说,全部擦除为1,也就意味着对整个block进行一次全部的充电。那这里,我们又有新问题了,那为什么不把擦除做成统一放电呢?
关于这个,我也没找到资料,书上也没有查到相关的,如果有人知道,麻烦也一并指点下我。我个人的理解是放电是时时刻刻存在的,放电比充电容易。就像我们的这些存储芯片,你充了一次电以后,是不是就一直为1了?不可能,能量是会衰减的,所以,你充一次电以后,隔了一段时间,不管你愿意不愿意,电荷必然会慢慢释放掉,那么,如果你要保证你的数据的正解性,仍然为1,不会被认为是0,你还得再充一次电,这个时间大概是多少,目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。在书没有查到,至于是不是,我也不清楚,希望高手能考证一下,所以,反正是要隔一段时间还得再充电一下。那么,现在我们再来理解一下,SRAM和DRAM的区别,百度百科里查一下SRAM的介绍:SRAM不需要刷新电路即能保存它内部存储的数据,而DRAM(DynamicRandom
Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能。但是SRAM也有它的缺点,即它的集成度较低,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积,且功耗较大。
到这里,大家是不是有点明白了,为什么SRAM不需要刷新电路,你不需要刷新电路,那你怎么解决电荷释放的问题?这世上没有天上掉馅饼的事儿,别人不给你,那就自己带一个呗,所以SRAM是自己带有刷新电路的,所以,它体积大,所以它容量做不上去。所以,SRAM和DRAM的区别,就非常好理解了,一个带充电电路,一个不带,而DRAM的充电是由内存控制器隔一段时间去充电的。
所以,到这里,我理解的NandFlash为什么擦除是擦为1,就是因为放电比充电容易,你控制每个存储单元去放电,肯定比控制每一个存储单元去充电要容易的多,硬件实现也要简单的多吧。这里再次声明一下,这属于自己的推断,没有经过论证,如果有高手,在哪本书上有介绍,希望能指点或论证一下。

二、原理图和引脚分析



图5-3Flash 引脚分布图
上图5-3是芯片封装图,也就是实际的Pin脚位置图,N.C表示未连接,48pin,TSOP1封装,软件工程师,可以主要和原理图对比一下,看实际各个pin脚的位置,不过,其实,不看也没关系,看下图4-4电路原理图吧。



图5-4、电路原理图
看NandFlash的芯片手册对各个pin脚的描述(K9GAG08U0E.pdf—P8)有芯片引脚的定义说明,如下表4-1所示:
表5-1、Flash引脚定义说明图



I/O0 ~ I/O7:
I/O pin用于输入command,addresss和data,以及在读操作时输出数据。当芯片没有被选中或无法正常输出数据时,处于高阻态(high-z即高阻态,相当于隔断状态,当处于高阻抗状态时,其输出相当于断开状态,没有任何逻辑控制功能)
CLE(COMMAND LATCH ENABLE): 指示当前数据为控制命令CLE输入控制路径发送到命令寄存器。
ALE(ADDRESS LATCH ENABLE): 指示当前数据为地址
CE#(CHIP ENABLE):芯片使能,俗称片选信号,表示flashchip是否被系统选中为当前操作芯片,低电平表示选中
RE#(READ ENABLE): 读使能,RE是串行数据输入,低电平时读取data到I/O总线,RE下降沿时读取数据有效,同时internalcolumn address counter(内部列地址计数器)加1
WE#(WRITE ENABLE): 写使能,低电平时向I/O中写入Command,address和data,在上升沿时操作完成。
WP#(WRITE PROTECT): 写保护,在电源置换过程中处于有效的低电平状态,保护flash里面的数据不受改写。当WP低电平有效时,高电平产生复位
R/B#(READY/BUSY OUTPUT): 读/忙状态输出,表示芯片是处于Read还是Busy状态,低电平表示Busy,返回高电平时表示处理完成。当芯片未被选中或无法输出数据时不会处于high-z状态,仍可用于检测芯片的闲忙状态
Vcc/Vss/N.C(POWER/GROUND/NOCONNECTION):Vcc是供电电压,Vss接地,N.C没定义

为什么要有CLE和ALE?
为什么要命令锁存使能(CommandLatch Enable,CLE)和地址锁存使能(AddressLatch Enable,ALE),那是因为,NandFlash就8个I/O,而且是复用的,也就是,可以传数据,也可以传地址,也可以传命令,为了区分你当前传入的到底是啥,所以,先要用发一个CLE(或ALE)命令,告诉nandFlash的控制器一声,我下面要传的是命令(或地址),这样,里面才能根据传入的内容,进行对应的动作。否则,nandflash内部,怎么知道你传入的是数据,还是地址,还是命令啊,也就无法实现正确的操作了。那么,为什么不多几个I/O呢?

NandFlash为什么只设计8个I/O引脚,有什么好外?
1) 减少外围引脚:相对于并口(Parellel)的NorFlash的48或52个引脚来说,的确是大大减小了引脚数目,这样封装后的芯片体积就小很多。现在芯片在向体积更小,功能更强,功耗更低发展,减小芯片体积,就是很大的优势。同时,减少芯片接口,也意味着使用此芯片的相关的外围电路会更简化,避免了繁琐的硬件连线。
2) 提高系统的可扩展性,因为没有像其他设备一样用物理大小对应的完全数目的addr引脚,在芯片内部换了芯片的大小等的改动,对于用全部的地址addr的引脚,那么就会引起这些引脚数目的增加,比如容量扩大一倍,地址空间/寻址空间扩大一倍,所以,地址线数目/addr引脚数目,就要多加一个,而对于统一用8个I/O的引脚的NandFlash,由于对外提供的都是统一的8个引脚,内部的芯片大小的变化或者其他的变化,对于外部使用者(比如编写nandflash驱动的人)来说,不需要关心,只是保证新的芯片,还是遵循同样的接口,同样的时序,同样的命令,就可以了。这样就提高了系统的扩展性。

三、Nand原理分析

1、时序说明

Nand Flash是一个典型的串口通信的芯片,我们知道,总线的三大元素地址、命令、数据。先看一个NORFLASH的原理图,如下图5-5所示。



图5-5、NORFlash电路原理图

上5-5图中,地址线,数据线,命令线,三者清清楚楚,再来看我们的NANDFLASH的原理图,如下图5-6所示,只有8根Data线,大部分线都是NC,未连接状态。



图5-6、NANDFlash电路原理图
1、NandFlash原理图上只有8根线Data0-Data7,是典型的串口通信,因为只有8根线,所以地址线、数据线肯定是复用的。
2、NandFlash K9F2G08UOB容量为2076M * 8bit,由于一页的大小是8K,所以需要13位地址来进行寻址。而且容量是2076M,所于行地址应该有33位,原理图上只有数据位只有Data0-Data7,所以需要发出多次地址信号,下图5-7是地址时序图,A0-A33,一共要发送五次,每次发8bit。



图5-7、NANDFlash地址时序图
3、NandFlash不能像内存一样直接读写,要先发命令,再发地址,再读写数据,如下表5-2所示:
表5-2、NANDFlash 命令表


很容易看出,我们要读取数据,要用到Read命令,该命令需要2个周期,第一个周期发0x00,第二个周期发0x30。在这个过程,你发了一个命令,对方能否立刻变接收到,并做出反应呢,肯定不行,所以,这得需要一个维持时间,这样才能保证你的数据的有效性。
表5-2、NANDFlash 时序表



4、CLE为高电平时,Data0-Data7发的是命令;
ALE为高电平时,Data0-Data7发的是地址;
CLE/ALE都为低电平时,Data0-Data7发的是数据,nWE,表示写,nRE,表示读。
下面以一个实际的读操作,来讲一下NandFlash的时序,如下图5-7所示



图5-7、NANDFlash时序图
在开始解释前,多罗嗦一下”使能”这个词,使能(Enable),是指使其(某个信号)有效,使其生效的意思,比如,上图5-7中的CLE线号,是高电平有效,如果此时将其设为高电平,我们就叫做将CLE使能,也就是使其生效的意思。使能,这个中文翻译有点怪怪的,有点像WDT(WatchDog Timer),中文翻译叫看门狗,这是英文直译,另一种解释叫做监视定时器,也许后一种解释会更好一点儿吧。
下面,按照时序来划分,总共有七个信号共同协调工作,我们先来竖着看,看同一时刻的操作:



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







图5-9、NANDFlash时序图
上面介绍了时刻(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)接下来,就是你“窃取“系统忙了半天之后的劳动成果的时候了,呵呵。通过先去NandFlash的控制器中的数据寄存器中写入你要读取多少个字节(byte)/字(word),然后就可以去NandFlash的控制器的FIFO中,一点点读取你要的数据了。
至此,整个NandFlash的读操作就完成了。
对于其他操作,可以根据我上面的分析,一点点自己去看datasheet,根据里面的时序图去分析具体的操作过程,然后对照代码,会更加清楚具体是如何实现的。

2、地址传送

Nand Flash有一个"位反转"的特性,就是在读一页的时候,有一位或某几位,可能出现原来是1,读完了以后就是0,Linux系统中,一般叫做OOB(OutOf Band),这个区域,基于NandFlash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(ErrorDetection Code)/ECC(ErrorCode Correction,或者Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。这也就是每一页2KByte旁边都有64Byte的一个区域,这个64Byte就是OOB区域。
比如访问地址8000
8000/2048 = 3.9,所以地址在第3页
8000-3*2048 = 1856,所以在第3页的第1856个地址
所以,1,2Cycle发的就是Ox740(1856),第1stCycle发的就是0x40,2ndCycle发的就是0x7
而3,4,5Cycle发的是3,第3rdCycle发的是0x3,第4thCycle发的是0x0,第5thCycle发的是0x0。OK,至此,NandFlash的原理分析完毕,将常用的存储原理,还有引脚功能,时序功能,和地址传送简单的讲了一些,这些对于后面分析U-Boot源码中的NandFlash的初始化代码和搬内核的代码很有用,理解了NandfFlash的基本原理,大家再冲到U-Boot内核中去对NandFlash的代码来庖丁解牛吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: