【转】深度分析NandFlash—物理结构及地址传送(以TQ2440开发板上的K9F2G08U0A为例)
K9F2G08U0A是三星公司生产的总容量为256M的NandFlash,常用于手持设备等消费电子产品。还是那句话,搞底层就得会看datasheet,我们就从它的datasheet看起。
这就是 K9F2G08U0A的内部结构,具体的各个部件的介绍,就不详细介绍了,想了解的话可以参考伟东山的《嵌入式linux应用开发完全手册》。
现在就看一下重点的,NandFlash的存储单元的组织结构,K9F2G08U0A的存储单元的组织结构如下:
结合上面的图,我们现在来分析一下:
NandFlash的存储单元是由Block组成的,Block又是由Page组成的,数据就是存储在Page上。
K9F2G08U0A的总容量是256M,由图可以看出,它一共有2048块,每一块有64页,每一页有(2K+64)Bytes。每一页又分为main区和spare区,2K就是指main区,64就是指spare区。
2K是指每一页上存放数据的有效空间,64是指每一页附加的空间,它不能用来存放我们写入的数据,它主要是用来存放ECC校验和坏块标记的信息数据。
还有一个比较重要的知识就是对NandFlash的访问,你不会访问它,那你肯定不会用它!
首先要明白NandFlash是以页(Page)为最小单位进行读写的,以块(Block)为最小单位进行擦除的,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个 Byte为止(可以包括Spare Field)。
在弄清楚怎么读写NandFlash之前,还有一个准备工作要做,那就是我们要告诉NandFlash,我要读写哪个地方的数据,如果我们不告诉它地址,那它就不知道我们到读哪些数据。那如何计算我们要传入的地址呢?以一个例子来说明
以K9F2G08U0A为例,此nand flash,一共有2048个块,每个块内有64页,每个页是2K+64 Bytes,假设,我们要访问其中的第1500个块中的第25页中的1208字节处的地址,此时,我们就要先把具体的地址算出来:
物理地址=块大小×块号+页大小×页号+页内地址=1500×128K+25×2K+1208=0xBB8CCB8(196660408),接下来,我们就看看,怎么才能把这个实际的物理地址,转化为nand Flash所要求的格式。在解释地址组成之前,先要来看看其datasheet中关于地址周期的介绍:
由上图可以看出,K9F2G08U0A是用5个周期来实现,由于NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位 ,即页内偏移地址
Page Address :页地址
Block Address :块地址
我们知道K9F2G08U0A的每一页有(2K+64)=2112Byte,2112byte 需要12bit来表示,对于2112byte系列的NAND,这2112byte被分成1st half Page Register和2nd half Page Register,各自的访问由地址指针命令来选择,A[11:0]就是所谓的column address(列地址),在进行擦除操作时不需要它,因为以块为单位擦除。64个page需要6bit来表示,占用A[17:12],即该page在块内的相对地址,也就是确定位于哪一页。A11这一位地址被用来设置2048byte的1st half page还是2nd half page,0表示1st,1表示2nd。Block的地址是由A18以上的bit来表示,也就是确定位于哪一块。用A[0:28]这29位,就可以将K9F2G08U0A这256M的数据存储空间全部访问到。
2的29次方是2GBit,256MByte=2GBit。
NAND Flash 的地址表示为: Block Address|Page Address in block|Column Address 地址传送顺序是Column Address,Page Address,Block Address。
由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 以K9F2G08U0A 为例:
第1 步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上。
第2 步就是将NAND_ADDR 右移8位,将NAND_ADDR[11:8]传到I/O[7:0]上;
第3 步将NAND_ADDR[19:12]放到I/O上;
第4步需要将NAND_ADDR[27:20]放到I/O上;
第5步需要将 NAND_ADDR[28]放到I/O上;
因此,整个地址传递过程需要5步才能完成,即5-step addressing。 如果NAND Flash 的容量是32MB(256Mbit)以下,那么,block adress最高位只到bit24,因此寻址只需要3步。
简单解释完了地址组成,那么就很容易分析上面例子中的地址了:
0xBB8CCB8 = 00001011 1011 1000 1100 1100 1011 1000,分别分配到5个地址周期就是:
B B 8 C C B 8
第一个周期:A[0:7] 也就是B8
第二个周期:A[8:11] 取四位 1100, 再添4位0,也就是0000 1100 即0C
第三个周期:A[12:19] 取八位 1000 1100 即8C
第四个周期:A[20:27] 取八位 1011 1011 即BB
第五个周期:A[28] 取一位 0,补齐八位 即 0000 0000 也就是00
再往回分析,NandFlash收到前两个周期的地址A[0:11] 也就是0CB8,即 1100 1011 1000,分析:A[10:0]= 100 1011 1000=1208, 表示第1208个Byte
收到后三个周期后,即 0000 0000 1011 1011 1000 1100,A[16:11]=011001=25,表示第25页
0000 0000 1011 1011 100 处理后为 0101 1101 1100 =1500,表示第1500块
原文地址:http://blog.csdn.net/it_114/article/details/6258509
【转】深度分析NandFlash—物理结构及地址传送(以TQ2440开发板上的K9F2G08U0A为例)的更多相关文章
- DevEco Device Tool 2.1 Beta1在Hi3861开发板上可视化分析的体验
DevEco Device Tool迎来了2.1 Beta1,新版本有很多亮点.在上次"DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验 ...
- 【Linux】(2013-7-19)配置tftp与开发板传送文件
1. 安装必须软件 sudo apt-get install -y xinetd tftp-hpa 2. 修改配置文件 vi /etc/default/tftpd-hpa # /etc/default ...
- LS1021ATWR开发板启动日志分析
一.背景 LS1021ATWR开发板运行官方的openwrt系统 二.日志分析 2.1 linux相关日志 root@OpenWrt:/# reboot 重启 root@OpenWrt:/# [ 2 ...
- RK30SDK开发板驱动分析(一):platform device 的概念与注册
做过51单片机或者ARM开发的人都知道,单片机内部都有自己的“片内外设”,比如UART,比如I2C,比如SPI等等... 写单片机程序的时候,比如对于UART的驱动,我们都是在程序中直接写一套函数,来 ...
- MapReduce深度分析(二)
MapReduce深度分析(二) 五.JobTracker分析 JobTracker是hadoop的重要的后台守护进程之一,主要的功能是管理任务调度.管理TaskTracker.监控作业执行.运行作业 ...
- AndroidService 深度分析(2)
AndroidService 深度分析(2) 上一篇文章我们Service的生命周期进行了測试及总结. 这篇文章我们介绍下绑定执行的Service的实现. 绑定执行的Service可能是仅为本应用提供 ...
- PhpStudy BackDoor2019 深度分析
笔者<Qftm>原文发布<合天>:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652852661&am ...
- 关于Java 值传递深度分析
首先说观点:java只有值传递没有引用传递 然后再来看看值传递与引用传递两者的定义 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改, ...
- 从Wannacry到WannaRen:螣龙安科带你深度分析勒索病毒原理
从Wannacry到WannaRen:螣龙安科2020年4月7日,360CERT监测发现网络上出现一款新型勒索病毒wannaRen,该勒索病毒会加密windows系统中几乎所有的文件,并且以.Wann ...
随机推荐
- 201521123002《Java程序设计》第14周学习总结
本次作业参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. MySql数据库简单操作: 库操作: 显示所有数据库: show databases; 创建数 ...
- 201521123078 《java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 创建线程:定义Thread的子类可以实现Runable接口 线程的控制:线程暂停Thread.sleep() ...
- 201521123119《Java程序设计》第10周学习总结
1. 本周学习总结 Q1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 Q1.finally 题目4-2 Q1.1 截图你的提交结 ...
- idea下使用Maven找不到类
当我们配置好pom文件的时候,准备启动Tomcat,Tomcat缺报找不到类的错误.. 可是明明我们的pom文件是没有问题的,在web.xml中也是可以ctrl+鼠标左键把类找到-为啥就报这么一个错误 ...
- Java开发中遇到的问题
head丢失 html的dtd不对 Integer数据类型 使用==比较 这个肯定错(事后才知道) sql语句处理分组的时候,在本地服务使用没问题,在服务器上出现sql异常 group by语句规范, ...
- C#ZIP根据路径读取压缩包内文件数量
/// <summary> /// 根据压缩包路径读取此压缩包内文件个数 /// </summary> /// <param name="strAimPath& ...
- 调试 ASP.NET Core 2.0 源代码
在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行 ...
- bzoj4033(树上染色)
树上染色 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两 ...
- 决策树模型组合之随机森林与GBDT
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- MySQL之常用函数
MySQL有如下常用函数需要掌握: 1.数学类函数 函数名称 作用 ABS(x) 返回x的绝对值 SQRT(x) 返回x的非负二次方根 MOD(x,Y ...