Nand flash 结构以及读写分析

   Nand Flash的数据是以bit的方式保存在memory cell,一般来说一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是Nand Device的位宽,这些Line会再组成Page。(Nand Flash有多种结构,下面内容针对三星的K9F1208U0M):其中一共有4096block,1block=32page,1page=528byte=512byte(Main Area)+16byte(Spare Area) 。

Nand flash 结构以及读写分析_第1张图片

 

 

   Nand flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:

--Block Address -- Page Address --Column Address

  对于Nand Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,各自的访问由地址指针命令来选择,A[7:0]就是所谓的column address。32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址。Block的地址是由A14 以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A[25:14],如果是1Gbit的528byte/page的NAND Flash,则block address用A[26:24]表示。而page address就是blcok address|page address in block。

 

NAND Flash 的地址表示为:

Block Address|Page Address in block|halfpage pointer|Column Address

  地址传送顺序是Column Address,Page Address,Block Address。由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 例如,对于512Mbitx8的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。以NAND_ADDR为例:

第1步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上,而halfpage pointer,即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写。而真正的bit8 的值是don't care的。第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:9]传到I/O[7:0]上。

第3步将NAND_ADDR[24:17]放到I/O上。第4步需要将NAND_ADDR[25]放到I/O上。因此,整个地址传递过程需要4步才能完成,即4-step addressing。如果NAND Flash的容量是256Mbit以下,那么block adress最高位只到bit24,因此寻址只需要3步。

  下面,就x16的NAND flash器件稍微进行一下说明。 由于一个page的main area的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage 和2nd halfpage之分了,所以,bit8就变得没有意义了,也就是这个时候bit8完全不用管,地址传递仍然和x8器件相同。除了,这一点之外,x16的NAND使用方法和x8的使用方法完全相同。

  正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:1block = 32page,1page = 512bytes(datafield) + 16bytes(oob)。需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash的擦写,而擦写则是以一个block为单位的。同时必须提醒的是,512bytes理论上被分为1st half 和2sd half,每个half各占256个字节。我们讨论的K9F1208U0B总共有4096个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes =66MB,但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes =64MB,1个Page总共由528Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。第0行为第0Byte,第1行为第1Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。这528Bytes按功能分为两大部分,分别是Data Field和Spare Field,其中Spare Field占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的Data Field,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。

   读命令有两个,分别是Read1,Read2。其中Read1用于读取Data Field的数据,而Read2则是用于读取Spare Field的数据。对于Nand Flash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个Byte为止(可以包括Spare Field)

Nand Flash的寻址

   Nand Flash的地址寄存器把一个完整的Nand Flash地址分解成Column Address与Page Address进行寻址。Column Address: 列地址。Column Address其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。Paage Address:页地址。由于页地址总是以512Bytes对齐的,所以它的低9位总是0。确定读写操作是在Flash上的哪个页进行的。

  Read1命令 

       当我们得到一个Nand Flash地址src_addr时我们可以这样分解出Column Address和Page Address。olumn_addr=src_addr%512;page_address=(src_addr>>9);也可以这么认为,一个Nand Flash地址的A0~A7是它的column_addr,A9~A25是它的Page Address。(注意地址位A8并没有出现,也就是A8被忽略,在下面你将了解到这是什么原因)。

    Read1 命令的操作分为4个Cycle,发送完读命令00h或01h(00h与01h的区别请见下文描述)之后将分4个Cycle发送参数,1st.Cycle是发送Column Address。2nd.Cycle ,3rd.Cycle和4th.Cycle则是指定Page Address(每次向地址寄存器发送的数据只能是8位,所以17位的Page Address必须分成3次进行发送。Read1的命令里面出现了两个命令选项,分别是00h和01h。这里出现了两个读命是否令你意识到什么呢?是的,00h是用于读写1st half的命令,而01h是用于读取2nd half的命令现在我可以结合上图给你说明为什么K9F1208U0B的DataField被分为2个half了。如上文我所提及的,Read1的1st.Cycle是发送Column Address,假设我现在指定的Column Address是0,那么读操作将从此页的第0号Byte开始一直读取到此页的最后一个Byte(包括Spare Field),如果我指定的Column Address是127,情况也与前面一样,但不知道你发现没有,用于传递Column Address的数据线有8条(I/O0~I/O7,对应A0~A7,这也是A8为什么不出现在我们传递的地址位中),也就是说我们能够指定的 Column Address范围为0~255,但不要忘了,1个Page的DataField是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?

 

参考:http://www.91linux.com/html/article/qianrushiyingyong/20090131/15574.html

 

你可能感兴趣的:(Flash,存储,三星,byte)