NandFlash数据存储规则与数据读写方法

上传人:大米 文档编号:562098905 上传时间:2023-05-14 格式:DOCX 页数:7 大小:52.04KB
返回 下载 相关 举报
NandFlash数据存储规则与数据读写方法_第1页
第1页 / 共7页
NandFlash数据存储规则与数据读写方法_第2页
第2页 / 共7页
NandFlash数据存储规则与数据读写方法_第3页
第3页 / 共7页
NandFlash数据存储规则与数据读写方法_第4页
第4页 / 共7页
NandFlash数据存储规则与数据读写方法_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《NandFlash数据存储规则与数据读写方法》由会员分享,可在线阅读,更多相关《NandFlash数据存储规则与数据读写方法(7页珍藏版)》请在金锄头文库上搜索。

1、Nand Flash 数据存储规章与数据读写方法(一)谈到 Nand Flash 的数据存储方式,关于 NAND Flash 的数据读写方法方面的文章不多,这篇文章具体表达了 Nand Flash 数据存储方式和数据读写方法,并用具体的芯片为例作了具体的解释。NAND Flash 的数据是以 bit 的方式保存在 memory cell,一般来说, 一个 cell 中只能存储一个 bit。这些 cell 以 8 个或者 16 个为单位,连成 bit line,形成所谓的 byte(x8)/word(x16),这就是 NAND Device 的位宽。这些 Line 会再组成 ,(Nand Fla

2、sh 有多种构造,我使用的 Nand Flash 是 K9F1208, 下面内容针对三星的 K9F1208U0M),每页 528Byte,每 32 个 形成一个Block, Sizeof(block)=16kByte 。1 block=16kbyte,512Mbit=64Mbyte, Numberof(block)=4096 1block=32, 1=528byte=512byte(Main Area)+16byte(Spare Area)Nand flash 以页为单位读写数据,而以块为单位擦除数据。依据这样的组织方式可以形成所谓的三类地址: -Block Address - Address

3、 -Column Address 。对于 NAND Flash 来讲,地址和命令只能在 I/O7:0上传递,数据宽度是 8 位。512byte 需要9bit 来表示,对于528byte 系列的NAND,这512byte 被分成1st half和 2nd half,各自的访问由地址指针命令来选择,A7:0就是所谓的 column address。32 个 需要 5bit 来表示,占用 A13:9,即该 在块内的相对地址。Block 的地址是由 A14 以上的 bit 来表示,例如 512Mb 的 NAND,共4096block,因此,需要 12 个 bit 来表示,即 A25:14,假设是 1G

4、bit 的528byte/ 的NAND Flash,则block address 用A26:24表示。而 address就是 blcok address| address in block NAND Flash 的地址表示为: Block Address| Address in block|half pointer|Column Address地址传送挨次是Column Address, Address,Block Address。由于地址只能在I/O7:0 上传递,因此,必需承受移位的方式进展。例如,对于 512Mbit x8 的 NAND flash, 地址范围是 00x3FF_FFFF,

5、只要是这个范围内的数值表示的地址都是有效的。以 NAND_ADDR 为例:第 1 步是传递 column address,就是 NAND_ADDR7:0,不需移位即可传递到I/O7:0上,而 half pointer 即 bit8 是由操作指令打算的,即指令打算在哪个 half 上进展读写。而真正的 bit8 的值是 don”t care 的。第 2 步就是将 NAND_ADDR 右移 9 位,将 NAND_ADDR16:9传到 I/O7:0上第 3 步将 NAND_ADDR24:17放到 I/O 上第 4 步需要将 NAND_ADDR25放到 I/O 上 因此,整个地址传递过程需要 4 步才

6、能完成,即 4-step addressing。假设 NAND Flash 的容量是 256Mbit 以下,那么,block adress 最高位只到bit24,因此寻址 只需要 3 步。 下面,就 x16 的 NAND flash 器件略微进展一下说明。 由于一个 的 main area 的容量为 256word,仍相当于 512byte。但是,这个时候没有所谓 的 1st half 和 2nd half 之分了,所以,bit8 就变得没有意义了,也就是这个时候 bit8 完全不用管,地址传递照旧和x8 器件一样。除了,这一点之外,x16 的 NAND 使用方法和 x8 的使用方法完全一样。

7、正如硬盘的盘片被分为磁道,每个磁道又分为假设干扇区,一块 nand flash 也分为假设干 block,每个block 分为如干 。一般而言,block、 之间的关系随着芯片的不同而不同,典型的安排是这样的:1block = 321 = 512bytes(datafield) + 16bytes(oob)需要留意的是,对于 flash 的读写都是以一个 开头的,但是在读写之前必需进展 flash 的擦写,而擦写则是以一个 block 为单位的。同时必需提示的是, 512bytes 理论上被分为 1st half 和 2sd half,每个 half 各占 256 个字节。我们争论的 K9F1

8、208U0B 总共有 4096 个 Blocks,故我们可以知道这块 flash 的容量为 4096 *(32 *528)= 69206016 Bytes = 66 MB ;但事实上每个 上的最终 16Bytes 是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为 4096 *(32 *512) = 67108864 Bytes = 64 MB 由 上图所示,1 个 总共由 528 Bytes 组成,这 528 个字节按挨次由上而下以列为单位进展排列1 列代表一个Byte。第0 行为第0 Byte ,第1 行为第1 Byte, 以此类推,每个行又由 8 个

9、位组成,每个位表示 1 个 Byte 里面的 1bit。这528Bytes 按功能分为两大局部,分别是Data Field 和 Spare Field,其中Spare Field 占 528Bytes 里的 16Bytes,这 16Bytes 是用于在读写操作的时候存放校验码用的,一般不用做一般数据的存储区,除去这 16Bytes,剩下的 512Bytes 便是我们用于存放数据用的 Data Field,所以一个 上虽然有 528 个 Bytes,但我们只按 512Bytes 进展容量的计算。Nand Flash 数据存储规章与数据读写方法(二)读命令有两个,分别是 Read1,Read2 其

10、中 Read1 用于读取 Data Field 的数据, 而 Read2 则是用于读取 Spare Field 的数据。对于 Nand Flash 来说,读操作的最小操作单位为 ,也就是说当我们给定了读取的起始位置后,读操作将从该位置开头,连续读取到本 的最终一个 Byte 为止可以包括 Spare Field。Nand Flash 的寻址Nand Flash 的地址存放器把一个完整的 Nand Flash 地址分解成 Column Address 与 Address.进展寻址。Column Address: 列地址。Column Address 其实就是指定 上的某个Byte,指定这个 By

11、te 其实也就是指定此页的读写起始地址。Paage Address:页地址。由于页地址总是以512Bytes 对齐的,所以它的低9 位总是 0。确定读写操作是在 Flash 上的哪个页进展的。Read1 命令当我们得到一个 Nand Flash 地址 src_addr 时我们可以这样分解出 Column Address 和 Address :column_addr=src_addr%512; / column address _address=(src_addr9); / address也可以这么认为,一个Nand Flash 地址的A0A7 是它的column_addr,A9A25是它的 A

12、ddress。(留意地址位 A8 并没有消灭,也就是 A8 被无视,在下面你将了解到这是什么缘由)Read1 命令的操作分为 4 个 Cycle,发送完读命令 00h 或 01h00h 与 01h 的区分请见下文描述之后将分 4 个 Cycle 发送参数,1st.Cycle 是 发送 Column Address。2nd.Cycle ,3rd.Cycle 和 4th.Cycle 则是指定 Address每次向地址存放器发送的数据只能是 8 位,所以 17 位的 Address 必需分成 3 次进展发送 。Read1 的命令里面消灭了两个命令选项,分别是 00h 和 01h。这里消灭了两个读命是

13、否令你意识到什么呢?是的,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,状况也与前面一样,但不知道你觉察没有,用于传递 Co

14、lumn Address 的数据线有 8 条I/O0I/O7,对应A0A7,这也是A8 为什么不消灭在我们传递的地址位中,也就是说我们能够指定的 Column Address 范围为 0255,但不要忘了,1 个 的 DataField 是由 512 个 Byte 组成的,假设现在我要指定读命令从第 256 个字节处 开头读取此页,那将会发生什么情景?我必需把 Column Address 设置为 256,但 Column Address 最大只能是 255,这就造成数据溢出。正是由于这个缘由我们才把 Data Field 分为两个半区,当要读取的起始地址Column Address在 025

15、5 内时我们用 00h 命令,当读取的起始地址是在256511 时,则使用 01h 命令.假设现在我要指定从第 256 个 byte 开 始读取此页,那么我将这样发送命令串 :column_addr=256;从 2nd NF_CMD=0x01;half 开头读取NF_ADDR=column_addr&0xff; 1st Cycle NF_ADDR=_address&0xff; 2nd.Cycle NF_ADDR=(_address8)&0xff; 3rd.Cycle NF_ADDR=(_address16)&0xff; 4th.Cycle其中 NF_CMD 和 NF_ADDR 分别是 Nand

16、Flash 的命令存放器和地址存放器的地址解引用,我一般这样定义它们:#define rNFCMD (*(volatile unsigned char *)0x4e000004) /NADD Flash command#define rNFADDR (*(volatile unsigned char *)0x4e000008) /NAND Flash address事实上,当 NF_CMD=0x01 时,地址存放器中的第 8 位A8将被设置为 1如上文分析,A8 位不在我们传递的地址中,这个位其实就是硬件电路依据 01h 或是 00h 这两个命令来置高位或是置低位,这样我们传递column_addr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号