微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 对S3C2440读取NAND Flash的总结

对S3C2440读取NAND Flash的总结

时间:11-09 来源:互联网 点击:
在网上找了一些资料,又结合自己的经历谈一下我对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/O[7:0]上传递,数据宽度是8位。

512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1sthalf2ndhalf,最后16个字节(又称OOB)用于NandFlash命令执行完后设置状态用,各自的访问由地址指针命令来选择,A[7:0]就是所谓的columnaddress。

32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址。Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A[25:14],如果是1Gbit的528byte/page的NANDFlash,则blockaddress用A[26:14]表示。

NANDFlash的地址表示为:

BlockAddress|PageAddressinblock|halfpagepointer|ColumnAddress

地址传送顺序是ColumnAddress,PageAddress,BlockAddress。

由于地址只能在I/O[7:0]上传递,因此,必须传递多次。例如,对于512Mbitx8的NANDflash,地址范围是0-0x3FFFFFF,只要是这个范围内的数值表示的地址都是有效的。以NAND_ADDR为例:第1步是传递columnaddress,就是NAND_ADDR[7:0]给相应的寄存器,即可传递到I/O[7:0]上,而halfpagepointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写。而真正的bit8的值是dontcare的。第2步就是将NAND_ADDR[16:9]传到I/O[7:0]上。第3步将NAND_ADDR[24:17]放到I/O上。第4步需要将NAND_ADDR[25]放到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=32page
1page=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进行容量的计算。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top