【转】深度分析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 ...
随机推荐
- 201521123035 《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 题目5-1 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...
- 201521123008 《Java程序设计》 第九周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避 ...
- 201521123108《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 答: 在自己建立的数据库上执行常见SQL语句(截 ...
- Jquery第一篇【介绍Jquery、回顾JavaScript代码、JS对象与JQ对象的区别】
什么是Jquery? Jquey就是一款跨主流浏览器的JavaScript库,简化JavaScript对HTML操作 就是封装了JavaScript,能够简化我们写代码的一个JavaScript库 为 ...
- Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...
- 跨浏览器的placeholder – 原生JS版
转自来源 : http://www.ifrans.cn/placehoder/ 跨浏览器的placeholder – 原生JS版 html5为input元素新增了一个属性”placeholder”,提 ...
- C#关于通过反射PropertyType判读字符串类型方法
今天在通过反射判读实体属性来映射数据库表是否修改的时候发现,最开始我通过 p.GetValue(entity) == null && p.PropertyType.IsValueTyp ...
- AngularJS的运用
前 言 JRedu AngularJS[1] 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.A ...
- 深入浅出数据结构C语言版(21)——合并排序
在讲解合并排序之前,我们先来想一想这样一个问题如何解决: 有两个数组A和B,它们都已各自按照从小到大的顺序排好了数据,现在我们要把它们合并为一个数组C,且要求C也是按从小到大的顺序排好,请问该怎么做? ...
- mac 安装Beautiful Soup
Beautiful Soup是一个Python的一个库,主要为一些短周期项目比如屏幕抓取而设计.有三个特性使得它非常强大: 1.Beautiful Soup提供了一些简单的方法和Python术语,用于 ...