/*author----->Armking*/

/*data----->2008年9月2*/

/*ps:本人总结,备于日后查阅,如若转载,请注明出处*/

/*QQ:382750150*/

写于篇头:

终于又开始接着学习了,只是不知道为什么JTAG又连不上目标板了,如果谁不小心看到了此文章,又凑巧知道了是什么原因,请留言赐教,不胜感激。

关于NAND FLASH很详细的内容,肯定无需在此多做说明,只要有电脑,baidu,google一天不垮台,都可以查阅到很多相关的资料。最最最权威的还是官方的手册,比如说我用的就是S3C2440这个板子,而这个板子上配的NAND是K9F1208,三星公司的,可以去它的官网下载即可。

下图为手册上的管脚图和管脚功能表,可能一开始搬这些东西出来觉得很枯涩,我也觉得这样,不过我是总结之用,无所谓了

各位看客的英语肯定比俺好,几个类似于power这样的E文,随便啃肯定没问题!

下面这个图是NAND FLASH的功能图,有点吓人的功能图

下面我先来剖析NAND FLASH的物理结构:

上图就是NAND FLASH的物理层结构,其实上图画的比较形象,比较生动

大致意思是这样的:

一个NAND FLASH存储器是由很多快组成的,很多是多少?4096块(就本人所用而言,K9F1208)

4096块中的1块又由很多页组成,多少页?32页

32页中的1页又由什么组成呢?就是由512+16字节组成(为什么要写成512+16

其实说白了就是528字节,但是是由512的主数据区和16的额外数据区组成的,所以如是。

那我掰开手指算算容量有多大?

1个NAND FLASH容量=4096(块)*32(页)*528(字节)*8(位)=528Mbit(以位为单位算的)

既然是FLASH肯定要与外界交流,如何交流,看上图,发现有IO 0~IO7,不错,就是用这8位来交流的。

刚才算的容量是528Mbit,也就是有64M的空间了,也就是说需要26位地址传送了,可是只有8根IO怎么办啊

这样就形成了NAND FLASH交流的独特性,不管你要干什么,首先发送命令,当然命令也是通过IO传送的,命令传送完毕了,再发送4个地址序列(为什么是4个?,26位要IO来传,分4次才行啊),最后才是必要的校验。

看到上面图是不是有2个方块,下面那个,用E文写着:page regsiter,这又是干什么的啊?

其实NAND访问并非直接通过里面的存储物理层,而是有一个专门的页寄存器来管理,不管你是读,是写,都要首先通过page regsiter,这回我晕晕的脑袋稍微好些了。

上面讲到过需要26位才能寻址到64M啊,我的妈亚,我的家家亚,这么多,叫IO0~IO7怎么吃得消啊,所以说才有地址序列的说法啊,但是地址序列又是如何对应的呢?由于NAND FLASH的结构分的很细,又有什么块啊,页啊,字节啊,所以说这个26位地址的本质就是如何区分这个的!

因此就有了A0~A7是页内寻址,也叫列寻址,也就是528字节寻址,我寻啊寻啊,不对劲啊,A0~A7才8位,匝地就能寻528啊,不是只能寻256吗?貌似有道理,请往下看.....

A9~A25是用来进行页寻址的,也叫行寻址,刚不是算了,4096块*32页=131072页,用A9~A25就可以搞定这么多页了,不信你算算。

客官看出来了没?发现A8怎么溜了?难道生气不干了?没这回事,它在偷偷的工作,默默无为的那种,象俺

A8是由里面的某个硬件电路根据相关的命令而置为1或者0,这不用我们操心,但我们要理解

比如说我喊话了说要寻址0~255字节,敢情好啊,这样的话8位IO肯定搞定了,对头!这时候我们聪明的硬件电路就会把A8置为0,不需要它了。

又比如说我喊话了要寻址第484字节啊,这么多啊,8位抗不住啊,对,这时候硬件电路就会把A8叫上,一起协助你,完成所谓的第484个字节寻址.484的二进制是111100100,需要9为才行,其实A8此时就充当第9位,其余8位还是由IO完成的,这样就可以完成528字节内的任何寻址了!

基于以上可知,A9~A25是进行多达上万页寻址的,其实还可以细分的,A9~A13是块内的32页寻址,正好5位,2的5次方=32,一块由32页组成,多好啊。

A14~A25是用于寻块的,前面说了,4096块,自己掰开手指算算吧。

其实A14~A25还可以细分,不过必须先了解个概念才行,知道什么是plane吗?

NO!我说的不是飞机!

其实NAND FLASH还被组织成一种形式,就是把整个NAND FLASH分成四个层(plane),每层1024块,每层里还有个528字节的页寄存器,组织形式看下图:

所以说的话,A14~A15是用于plane寻址的,正好4种情况。其余的用于1024块寻址。

对于基本的物理结构就是如上的,其实是总结之用,请勿嘲笑,欲知详细,请查阅文档,OK?

以下是基于程序分析的

本次实验的思路是将一些启动代码,初始化代码放在NAND 0~4K的空间内,把主函数放在4096字节后,那些启动代码,初始化代码负责将4096后的主函数copy到0x30000000的地址空间,然后跳转执行主函数即可。

程序在此就不必写出来了,重在整理思路

在head.S里主要需要关掉watch_dog,调用sdram初始化函数,调用nand初始化函数,调用nand的复制函数(也就是读函数,复制到0x30000000),最后跳转到0x30000000处

nand在使用前,需要进行简单的配置,比如说设置时序,2440在NFCONF里面设置,ECC初始化,片选,控制器使能,在NFCONT设置,最后再复位下nand flash即可。

nand的读需要注意,只用到了低8位,而且读的时候,需要注意控制字节数,因为如果从A区或者C区读取,它会一直的紧接着从下一页的A区或者C区读取,如果是B区,就会在下一页从A区开始读取了,一定要记得判断是否准备好,检测状态。

ARM9之NAND FLASH总结相关推荐

  1. PXA270-基于ARM9内核Processor外部NAND FLASH的控制实现

    于ARM9内核Processor外部NAND FLASH的控制实现 夏 涛 (上海交通大学微电子学院 上海 200030) 1 NAND FLASH NAND写回速度快.芯片面积小,特别是大容量使其优 ...

  2. ARM9 2410移植之Nand flash 驱动的编写与移植

    1 Nand flash 工作原理 S3C2410 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2410 CPU)和Nand Flash 存储 芯片(K9F1 ...

  3. [转]ARM9 2410移植之Nand flash 驱动的编写与移植

    1 Nand flash 工作原理 S3C2410 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2410 CPU)和Nand Flash 存储 芯片(K9F1 ...

  4. 从Nand Flash启动U-BOOT的基本原理

    从Nand Flash启动U-BOOT的基本原理 前4K的问题  如果S3C2410被配置成从Nand Flash启动(配置由硬件工程师在电路板设置), S3C2410的Nand Flash控制器有一 ...

  5. jflash烧录教程_Jlink烧录nand flash操作(步骤一)

    一.将内存初始化程序下载至SRAM并运行 1.打开J-Link Commander,将micro开发板拨至nand flash启动. 2.以下是常用命令: speed 12000:设置下载速率为12M ...

  6. 关于Nand Flash和Nor Flash的XIP

    XIP - eXecute In Place,中文常译为,就地执行.指代码可以在当前(存储器中)执行 关于Nor Flash的XIP : NAND and NOR and XIP "NOR的 ...

  7. NAND FLASH

    NAND Flash 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用. 1. 概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输.地址 ...

  8. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...

    关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题 主要是设置struct mtd_partition中的mask_flags标志位 具体含义为: 1 ...

  9. linux读取nand的文件,Linux Kernel 之AP读写Nand Flash上的Yaffs2文件的全过程浅析

    1.1 用top-down的方法分析AP读一个Nand Flash上的file的全过程 我先简单看一个例子,看User Application如何打开一个Yaffs2 file并读写之: int ma ...

最新文章

  1. Spartan-6的SelectIO资源
  2. 全球的weex资源都在这里
  3. IIS发布网页的基本操作
  4. Scala消息通信之akka,akka案例
  5. cisco router修改mac
  6. .sql文件如何执行_随手记 02 日志系统:一条SQL更新语句是如何执行的?
  7. 走进 Cake for .NET
  8. vue 字典_【开源】基于Vue的前端组件库HeyUI
  9. linux安装yum的脚本,lnmp一键安装脚本yum方式快速安装
  10. java GC 参数
  11. java 镶嵌创建线程_请教一个 Java 多线程嵌套使用的问题
  12. OpenCasCade——将鼠标点的位置转换为基于OCC三维坐标系中在某一面上的坐标
  13. 运筹学笔记 整数规划
  14. Qt MDI及其使用方法
  15. 关于Java的与操作和或操作
  16. Javascript使用三大家族和事件来DIY动画效果相关笔记(六)
  17. 李飞飞:我更像物理学界的科学家,而不是工程师|深度学习崛起十年
  18. IE 凉了?怎么可能!
  19. Android 模拟器中的menu键
  20. 我国知识共享数学生态圈的发端历程

热门文章

  1. sql的子查询超级慢-子查询酿的祸
  2. margin和padding的区别
  3. 关于win32与win64的兼容性问题
  4. Rabbitmq如何设置优先级队列?如何限流?如何重试?如何处理幂等性?
  5. php zip下载损坏,php – 从zip中提取时损坏图像
  6. linux空文件夹大小,[转载]linux 查看文件和文件夹大小
  7. (JAVA)红黑树之自然顺序排序和自定义排序方式
  8. web----epoll实现原理
  9. Python之编写登陆接口
  10. 【Python笔记】异常处理