




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NAND的资料整理(通俗易懂)K9F2G08U0A的一页为(2K64)字节(加号前面的2K表示的是main区容量,加号后面的64表示的是spare区容量),它的一块为64页,而整个设备包括了2048个块。这样算下来一共有2112M位容量,如果只算main区容量则有256M字节(即256M8位)。要实现用8个IO口来要访问这么大的容量,K9F2G08U0A规定了用5个周期来实现。第一个周期访问的地址为A0A7;第二个周期访问的地址为A8A11,它作用在IO0IO3上,而此时IO4IO7必须为低电平;第三个周期访问的地址为A12A19;第四个周期访问的地址为A20A27;第五个周期访问的地址为A28,它作用在IO0上,而此时IO1IO7必须为低电平。前两个周期传输的是列地址,后三个周期传输的是行地址。通过分析可知,列地址是用于寻址页内空间,行地址用于寻址页,如果要直接访问块,则需要从地址A18开始。(2的12次方是4096,并不是2048,这是为什么?个人理解:为了兼容以后更大的NAND,NAND的地址序列可以把“列地址的长度”预留出来,虽说送的是A0-A7,A8-A11,实际取得是A0-A7,A8-A10;(页内地址空间)一共是2048*64=131072页,2的17次方 由于所有的命令、地址和数据全部从8位IO口传输,所以nandflash定义了一个命令集来完成各种操作。有的操作只需要一个命令(即一个周期)即可,而有的操作则需要两个命令(即两个周期)来实现。下面的宏定义为K9F2G08U0A的常用命令:#define CMD_READ1 0x00 /页读命令周期1#define CMD_READ2 0x30 /页读命令周期2#define CMD_READID 0x90 /读ID命令#define CMD_WRITE1 0x80 /页写命令周期1#define CMD_WRITE2 0x10 /页写命令周期2#define CMD_ERASE1 0x60 /块擦除命令周期1#define CMD_ERASE2 0xd0 /块擦除命令周期2#define CMD_STATUS 0x70 /读状态命令#define CMD_RESET 0xff /复位#define CMD_RANDOMREAD1 0x05 /随意读命令周期1#define CMD_RANDOMREAD2 0xE0 /随意读命令周期2#define CMD_RANDOMWRITE 0x85 /随意写命令在这里,随意读命令和随意写命令可以实现在一页内任意地址地读写。读状态命令可以实现读取设备内的状态寄存器,通过该命令可以获知写操作或擦除操作是否完成(判断第6位),以及是否成功完成(判断第0位)。在网上找了一些资料,又结合自己的经历谈一下我对NAND Flash 的了解。S3C2440 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2440 CPU)和Nand Flash 存储芯片(K9F1208U0B)两大部分组成。当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。所以, Nand Flash相当于S3C2440的一个外设,而不位于它的内存地址区.NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 会再组成Page.NandFlash有多种结构,我使用的NandFlash是K9F1208,下面内容针对三星的K9F1208U0M,数据存储容量为64MB,采用块页式存储管理。一共有4096个block(块),每个block有32个page(页),每个page有528Byte。1block=32page,1page=528byte=512byte(MainArea)+16byte(SpareArea)Nandflash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:-BlockAddress-PageAddress-ColumnAddress对于NANDFlash来讲,8个I/O引脚充当数据、地址、命令的复用端口。地址和命令只能在I/O7:0上传递,数据宽度是8位。512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1sthalf和2ndhalf,最后16个字节(又称OOB)用于NandFlash命令执行完后设置状态用,各自的访问由地址指针命令来选择,A7:0就是所谓的columnaddress。32个page需要5bit来表示,占用A13:9,即该page在块内的相对地址。Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A25:14,如果是1Gbit的528byte/page的NANDFlash,则blockaddress用A26:14表示。NANDFlash的地址表示为:BlockAddress|PageAddressinblock|halfpagepointer|ColumnAddress地址传送顺序是ColumnAddress,PageAddress,BlockAddress。由于地址只能在I/O7:0上传递,因此,必须传递多次。例如,对于512Mbitx8的NANDflash,地址范围是0-0x3FFFFFF,只要是这个范围内的数值表示的地址都是有效的。以NAND_ADDR为例:第1步是传递columnaddress,就是NAND_ADDR7:0给相应的寄存器,即可传递到I/O7:0上,而halfpagepointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写。而真正的bit8的值是dontcare的。第2步就是将NAND_ADDR16:9传到I/O7:0上。第3步将NAND_ADDR24:17放到I/O上。第4步需要将NAND_ADDR25放到I/O上因此,整个地址传递过程需要4步才能完成,即4-stepaddressing。如果NANDFlash的容量是256Mbit以下,那么,blockadress最高位只到bit24,因此寻址只需要3步。下面,就x16(16位)的NANDflash器件稍微进行一下说明。由于一个page的mainarea的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1sthalfpage和2ndhalfpage之分了,所以,bit8就变得没有意义了,也就是这个时候bit8完全不用管,地址传递仍然和x8器件相同。除了,这一点之外,x16的NAND使用方法和x8的使用方法完全相同。正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nandflash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block=32page1page=512bytes(datafield)+16bytes(oob)需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash的擦写,而擦写则是以一个block为单位的。同时必须提醒的是,512bytes理论上被分为1sthalf和2sdhalf,每个half各占256个字节。我们讨论的K9F1208U0B总共有4096个Blocks,故我们可以知道这块flash的容量为4096*(32*528)=69206016Bytes=66MB。但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096*(32*512)=67108864Bytes=64MB。由上图所示,1个Page总共由528Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。第0行为第0Byte,第1行为第1Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。这528Bytes按功能分为两大部分,分别是DataField和SpareField,其中SpareField占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的DataField,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。读命令有两个,分别是Read1,Read2其中Read1用于读取DataField的数据,而Read2则是用于读取SpareField的数据。对于NandFlash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个Byte为止(可以包括SpareField)NandFlash的寻址NandFlash的地址寄存器把一个完整的NandFlash地址分解成ColumnAddress与PageAddress.进行寻址。ColumnAddress:列地址。ColumnAddress其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。PaageAddress:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。确定读写操作是在Flash上的哪个页进行的。Read1命令当我们得到一个NandFlash地址addr时我们可以这样分解出ColumnAddress和PageAddresscolumn_addr=src_addrQ2;/columnaddresspage_address=(src_addr9);/pageaddress也可以这么认为,一个NandFlash地址的src_addr7,0是它的column_addr,addr25,9是它的PageAddress。(注意地址位src_addr8并没有出现,也就是addr8被忽略,在下面你将了解到这是什么原因)Read1命令的操作发送完读命令00h或01h(00h与01h的区别请见下文描述)之后将分4个Cycle发送参数,1st.Cycle是发送ColumnAddress。2nd.Cycle,3rd.Cycle和4th.Cycle则是指定PageAddress(每次向地址寄存器发送的数据只能是8位,所以17位的PageAddress必须分成3次进行发送。Read1的命令里面出现了两个命令选项,分别是00h和01h。这里出现了两个读命是否令你意识到什么呢?是的,00h是用于读写1sthalf的命令,而01h是用于读取2ndhalf的命令。现在我可以结合上图给你说明为什么K9F1208U0B的DataField被分为2个half了。如上文我所提及的,Read1的1st.Cycle是发送ColumnAddress,假设我现在指定的ColumnAddress是0,那么读操作将从此页的第0号Byte开始一直读取到此页的最后一个Byte(包括SpareField),如果我指定的ColumnAddress是127,情况也与前面一样,但不知道你发现没有,用于传递ColumnAddress的数据线有8条(I/O0-I/O7,对应addr7,0,这也是addr8为什么不出现在我们传递的地址位中),也就是说我们能够指定的ColumnAddress范围为0-255,但不要忘了,1个Page的DataField是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?我必须把ColumnAddress设置为256,但ColumnAddress最大只能是255,这就造成数据溢出。正是因为这个原因我们才把DataField分为两个半区,当要读取的起始地址(ColumnAddress)在0-255内时我们用00h命令,当读取的起始地址是在256-511时,则使用01h命令.假设现在我要指定从第256个byte开始读取此页,那么我将这样发送命令串。column_addr=256;NF_CMD=0x01;从2ndhalf开始读取NF_ADDR=column_addr&0xff;1stCycleNF_ADDR=page_address&0xff;2nd.CycleNF_ADDR=(page_address8)&0xff;3rd.CycleNF_ADDR=(page_address16)&0xff;4th.CycleNF_CMD=0x30;事实上,当NF_CMD=0x01时,NANDFlash地址寄存器中的第8位(A8)将被设置为1(如上文分析,A8位不在我们传递的地址中,这个位其实就是硬件电路根据01h或是00h这两个命令来置高位或是置低位),这样我们传递column_addr的值256随然由于数据溢出变为1,但A8位已经由于NF_CMD=0x01的关系被置为1了。这8个位所表示的正好是256,这样读操作将从此页的第256号byte(2ndhalf的第0号byte)开始读取数据。在对NANDFlash进行任何操作之前,NANDFlash必须被初始化。向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.我用下面的代码进行数据的读取.for(i=column_addr;i512;i+)*buf+=NF_RDDATA();每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).存储操作特点:1.擦除操作的最小单位是块。2.NandFlash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).3.OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。4.除OOB第六字节外,通常至少把OOB的前3个字节存放NandFlash硬件ECC码(关于硬件ECC码请参看Nandflash控制器一节).重要芯片引脚功能I/O0-I/O7:复用引脚。可以通过它向nandflash芯片输入数据、地址、nandflash命令以及输出数据和操作状态信息。CLE(CommandLatchEnable):命令锁存允许ALE(AddressLactchEnable):地址锁存允许-CE:芯片选择-RE:读允许-WE:写允许-WP:在写或擦除期间,提供写保护R/-B:读/忙输出NandFlash控制器中的硬件ECC介绍ECC产生方法ECC是用于对存储器之间传送数据正确进行校验的一种算法,分硬件ECC和软件ECC算法两种,在S3C2440的NandFlash控制器中实现了由硬件电路(ECC生成器)实现的硬件ECC。ECC生成器工作过程当写入数据到Nandflash存储空间时,ECC生成器会在写入数据完毕后自动生成ECC码,将其放入到ECC0ECC2。当读出数据时NandFlash同样会在读数据完毕后,自动生成ECC码将其放到ECC0ECC2当中。ECC的运用当写入数据时,可以在每页写完数据后将产生的ECC码放入到OOB指定的位置(Byte6)去,这样就完成了ECC码的存储。这样当读出该页数据时,将所需数据以及整个OOB读出,然后将指定位置的ECC码与读出数据后在ECC0ECC1的实际产生的ECC码进行对比,如果相等则读出正确,若不相等则读取错误需要进行重读。操作命令字介绍操作NANDFLASH时,先传输命令,接着输出地址,最后读/写数据,期间还要检查FLASH的状态。具体的命令字见下表。1、Read命令字为00h,30h。如上图,当发出00h命令后,接着4个字节的地址序列,然后再发出30h命令,接着,就可以读出数据了,当发送完30h后,可以检测R/B引脚看是否准备好了,如果准备好,就可以读出数据。2、Reset命令字:FFh当向芯片发送FFh命令时,可以复位芯片,如果芯片正在处于读、写、擦除状态,复位命令会终止这些命令。3、Page Program命令字:80h,10h.NANDFLASH的写操作一般是以页为单位进行的,因此才会叫Page Program,但是也支持一个字以上的(包括一个字)连续写操作。开始发出80h命令,接着发送5个字节的地址序列,然后向FLASH发送数据,最大为一页大小,最后发送10h命令启动烧写,此时FLASH内部会自动完成写、校验操作。发送10h后,可以通过读状态命令70h(见下文)获知写操作是否完成,是否成功。4、Copy-Back Program命令字:00h、8Ah、10h.此命令用于将一页复制到同一层的另外一页,它省去了读出数据、将数据重新载入FLASH的过程,使得效率大大提高。关于层:NANDFLASH有层的概念,K9F2G08分为两层,每层包括了1024个块,如下图,因此上面的命令表中才会有two-plane的命令,这些命令可以使得在两个层间完成操作,这样程序员就很方便的使用一个命令完成更多的操作,其命令格式和单层操作的类似,详见手册。但K9F2G08R0A不支持两层命令。上图清晰的告诉我们,开始发送00h和源地址,当发送35h之后,芯片将一页大小的数据读入到内部寄存器,接着,我们发送85h和目的地址序列,最后发送10h启动。最后,我们可以使用70h/7Bh检测是否完成,是否成功。5、Block Erase命令字:60h、D0h擦除操作是以块为单位的,也就是128K。开始发出60h,然后发出3个地址序列仅行地址,最好发出D0h。具体操作,如下图。6、ReadStatus 命令字:70h 读状态命令可以读出芯片的状态寄存器,查看是否读、写操作是否完成、是否成功。具体的状态见下图。S3C2440的NANDFLASH控制器介绍看了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铸管备品工职业技能考核试卷及答案
- 颗粒剂工标准化作业考核试卷及答案
- 空气潜水员成本预算考核试卷及答案
- 注水泵工新员工考核试卷及答案
- 人才激励与绩效管理-洞察及研究
- 动车组装调师三级安全教育(车间级)考核试卷及答案
- 2025年船用锚链行业研究报告及未来行业发展趋势预测
- 国际团队沟通障碍突破-洞察及研究
- 重冶制团制粒工综合考核试卷及答案
- 2025年IT服务管理行业研究报告及未来行业发展趋势预测
- 1.1《土壤里面有什么》课件 2025-2026学年苏教版科学三年级上册
- 汽修厂污染防治知识培训课件
- 海运销售入门培训
- 租房托管班合同(标准版)
- 2025-2026学年苏教版(2024)小学数学二年级上册(全册)教学设计(附目录P226)
- 2025年甘南事业单位笔试试题(含答案)
- 2025年浪浪山小妖怪开学第一课
- 2025-2026秋学生国旗下演讲稿:第1周让我们接过历史的接力棒-抗战胜利纪念日
- 2025年幼儿园食堂从业人员培训测试题(含答案)
- 企业员工职业道德培训教材及案例
- 2025年北师大版新教材数学一年级上册教学计划(含进度表)
评论
0/150
提交评论