一、Flash介绍

- Nor NAND
XIP(excute in place代码可以直接运行) Yes no
性能(擦除) 非常慢(5s) 快(3ms)
性能(写)
性能(读)
可靠性 较高,位反转的比例小于NAND Flash的10% 比较低,位反转比较常见,必须有校验措施,比如TNR必须有坏块管理措施
可擦除次数 10000 ~ 100000 100000 ~ 1000000
生命周期 低于NAND Flash的10% 是Nor Flash的10倍以上
接口 与RAM接口相同 I/O接口
易用性 容易 复杂
主要用途 常用于保存代码和关键数 用于保存数据
价格

因为Nor不会坏块和位反转,Nor通常用来存放内核、文件系统这些关键性代码,出错就玩蛋那种;Nand Flash 存储一些视频文件

Nor Flash支持XIP,即代码可以直接在Nor Flash上执行,无需复制到内存中。这是由于NorF lash的接口与RAM完全相同,可以随机访问任意地址的数据。Nor Flash进行读操作的效率非常高,但是擦除和写操作的效率很低,另外,Nor Flash的容量一般比较小。NAND Flash进行擦除和写操作的效率更高,并且容量更大。一般而言,Nor Flash用于存储程序,NAND Flash用于存储数据。基于NAND Flash的设备通常也要搭配Nor Flash以存储程字。

Flash存储器件由擦除单元(也称为块)组成,当要写某个块时,需要确保这个块己经
被擦除。Nor Flash的块大小范围为64kB、128kB:NAND Flash的块大小范围为8kB,64kB,擦/写一个Nor Flash块需4s,而擦/写一个NAND Flash块仅需2ms。Nor Flash的块太大,不仅增加了擦写时间,对于给定的写操作,Nor Flash也需要更多的擦除操作——特别是小文件,比如一个文件只有IkB,但是为了保存它却需要擦除人小为64kB—128kB的Nor Flash块。

Nor Flash的接口与RAM完全相同,可以随意访问任意地址的数据。而NAND Flash的
接口仅仅包含几个I/O引脚,需要串行地访问。NAND Flash一般以512字节为单位进行读写。这使得Nor Flash适合于运行程序,而NAND Flash更适合于存储数据。

容量相同的情况下,NAND Flash的体积更小,对于空间有严格要求的系统,NAND Flash可以节省更多空间。市场上Nor Flash的容量通常为IMB~4MB(也有32MB的Nor Flash),NAND Flash的容量为8MB~512MB。容量的差别也使得Nor Flash多用于存储程序,NAND Flash多用于存储数据。

对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有Flash器件都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),而NAND Flash出现的概率远大于Nor Flash,当位反转发生在关键的代码、数据上时,有可能导致系统崩溃。当仅仅是报告位反转,重新读取即可:如果确实发生了位反转,则必须有相应的错误检测/恢复措施。在NAND Flash上发生位反转的概率史高,推荐使用EDC/ECC进行错误检测和恢复。NAND Flash上面会有坏块随机分布在使用前需要将坏块扫描出来,确保不再使用它们,否则会使产品含有严重的故障。NAND Flash每块的可擦除次数通常在100000次左右,是Nor Flash的10倍。另外,因为NAND Flash的块大小通常是NorF lash的1/8,所以NAND Flash的寿命远远超过Nor Flash。

嵌入式Linux对Nor、NAND Flash的软件支持都很成熟。在Nor Flash上常用jffs2文
件系统,而在NAND Flash常用yaffs文件系统。在更底层,有MTD驱动程序实现对它们的读、写、擦除操仵,它也实现了EDC/ECC校验。

二、使用uboot体验Nor Flash的操作

将uboot烧写到Nor上,使用Nor启动,进入uboot

MX29LV800BBTC.pdf
从原理图看,我们的Nor芯片位宽是16,所以看Word的命令。

怎么看这张表格呢?
以Read Silicon ID这行为例:
看Word这行,因为从Nor芯片的原理图看,Nor芯片位宽是16,所以看Word。
往555H写入AAH,往2AAH写入55H 往555H写入90H,从ADI读出DDI。
ADI和DDI是什么呢,在表格下方
ADI = Address of Device identifier; A1=0, A0 = 0 for manufacturer code,A1=0, A0 = 1 for device code. A2-A18=do not care.
(Refer to table 3)
DDI = Data of Device identifier : C2H for manufacture code, 22DA/DA(Top), and 225B/5B(Bottom) for device code.

1、读数据:

在u-boot上执行:md.b0

结果:

00000000:170000ea14f09fe514f09fe514f09fe5…
00000010:14f09fe514f09fe514f09fe514f09fe5…
00000020:6001f833c001f8332002f8337002f833`…3…3…3…3
00000030:e002f8330004f8332004f833efbeadde…3…3…3…

和我们烧进去的数据完全一样:

可以得出结论:u-boot可以像读内存一样来读nor flash

2、读ID:

读ID(参考Nor手册 的 COMMAND DEFINITIONS表格 ):
往地址555H写入AAH(解锁)
往地址2AAH写入55H(解锁)
往地址555H写入90H(命令)
读0地址得到厂家ID(C2H)
读1地址得到设备ID(22DAH或225BH)
退出读ID状态:给任意地址写F0H就可以了。

为什么需要退出读ID状态?
因为操作完后,再md.b0读数据,读不出来,因为此时是读ID的状态。

注意,这里有12课讲的位宽设备的知识:

555H是nor认为的地址,而CPU认为的地址是555H<<1。
所以2440发出555H<<1的地址,Nor才能收到555H。

总结:

下面对在Nor Flash的操作,2440的操作,U-BOOT上的操作进行比较,如下表:

Nor Flash的操作 2440的操作 U-BOOT上的操作
往地址555H写入AAH(解锁) 往地址AAAH写入AAH(解锁) mw.waaa aa
往地址2AAH写入55H(解锁) 往地址554H写入55H(解锁) mw.w 554 55
往地址555H写入90H(命令) 往地址AAAH写入90H(命令) mw.w aaa 90
读0地址得到厂家ID(C2H) 读0地址得到厂家ID(C2H) md.w 0 1 (1:表示读一次)
读1地址得到设备ID(22DAH或225BH) 读2地址得到设备ID(22DAH或225BH) md.w 2 1 (1:表示读一次)
退出读ID状态:给任意地址写F0H就可以了 退出读ID状态:给任意地址写F0H就可以了 mw.w 0 f0

运行结果:
1).当执行过
md.w 0 1
结果(输出厂家ID):
00000000:00c2…(00c2就是厂家ID)

2).当执行过
md.w 2 1

结果(输出设备ID):
00000002:2249I"(2249就是设备ID)

3).当执行
mw.w 0 f0
就退出读ID的状态,

执行:
md.b0
结果:
00000000:17.(读到的就是Nor Flash地址·0的数据)

三、Nor Flash的两种规范

内核识别Nor Flash有两种方法:jedec cfi

jedec 探测 —— 老式的Nor

在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和数组里面的 ID 一一比较,如果发现相同的,就使用该数组的参数。

jedec 探测的优点就是简单,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。内核里面用 jedec 探测一个芯片时,是先通过发命令来获取 flash 的 ID,然后和数组比较,但是 flash.c 中连 ID 都是自己通过宏配置的。

CFI探测 —— 新式的Nor

CFI(common flash interface)探测,就是直接发各种命令来读取芯片的信息,比如 ID、容量等,芯片本身就包含了电压有多大,容量有有多少等信息。

打开Nor芯片手册,搜索”CFI“,找到Table 4-1. CFI mode: Identification Data Values
下面对在Nor Flash上操作,2440上操作,U-BOOT上操作cfi 探测(读取芯片信息)进行比较:

- Nor Flash上操作cfi 2440上操作cfi U-BOOT上操作cfi
进入cfi模式 往55H地址写入98H 往AAH地址写入98H mw.w aa 98
读数据 读地址10H得到0051 读地址20H得到0051 md.w 20 1
读数据 读地址11H得到0052 读地址22H得到0052 md.w 22 1
读数据 读地址12H得到0059 读地址24H得到0059 md.w 24 1
读数据 读地址27H得到容量 读地址4EH得到容量 md.w 4e 1

三、往Nor Flash写数据

我们在Nor Flash的10000的地址读数据, (0x10000是1M的地方)
md.w 100000 1
结果:
00100000:ffff…
在Nor flash的10000的地址写数据下0x1234,
mw.w 100000 1234
然后在这个地址读数据,
md.w 100000 1
结果:
00100000:ffff(这个地址上的数据没有被修改,写操作无效)。

3000000写就有效,因为3000000对应的是内存地址
md.w 30000000 1
结果:
30000000:5a7f .7
在Nor flash的100 00的地址写数据下0x1234,
mw.w 30000000 1234
然后在这个地址读数据,
md.w 30000000 1
结果:
00100000:1234(写操作有效)。

怎样把数据写进Nor Flash进去呢?
写数据之前必须保证,要写的地址是擦除的,就是ffff…,如果不是ffff要擦除。

看Nor手册的program命令,
下面是Nor Flash的写操作,如下表:

Nor Flash上操作写操作 2440上操作写操作 U-BOOT上操作写操作
往地址555H写AAH(解锁) 往地址AAAH写AAH(解锁) mw.w aaa aa
往地址2AAH写55H(解锁) 往地址554H写55H(解锁) mw.w 554 55
往地址555H写A0H 往地址AAAH写A0H mw.w aaa a0
往地址PA写PD 往地址0x100000写1234h mw.w 100000 1234

1).U-BOOT执行完上述指令后,0x1234,就被写到0x100000地址处,

执行:
md.w1000001
结果(1234被写进去):
00100000:1234 4
从这里可以看出来U-BOOT的操作不是很复杂。

2).我们再次往0x100000地址处,写入0x5678,执行如下命令:
mw.w aaa aa
mw.w 554 55
mw.w aaa a0
mw.w 100000 5678
查看0x100000地址处的数据
md.w 100000 1
结果:
00100000:12300.
0x100000地址处的数据不是0x5678,写操作失败,失败的原因是,原来的数据已经是0x1234不是全0xffff,再次写操作失败,(Nor Flash只有先擦出,才能烧写)。

先擦除(参考Nor Flash芯片手册)

Nor Flash操作 u-boot操作
555H AAH mw.w aaa aa
2AAH 55H mw.w 554 55
555H 80H mw.w aaa 80
555H AAH mw.w aaa aa
2AAH 55H mw.w 554 55
SA 30H//往扇区地址写入30 mw.w 100000 30

执行完上述指令后测试

执行:
md.w 100000 1
结果:
00100000:ffff…
已被擦除,这个时候再次烧写就不会有问题了。

再烧写
mw.w aaa aa
mw.w 554 55
mw.w aaa a0
mw.w 100000 5678

测试烧写结果
执行:
md.w 100000 1
结果:
00100000:5678 xV
数据被烧写进去,烧写成功。

第十五课(1)Nor FLash原理及硬件介绍相关推荐

  1. NeHe OpenGL教程 第十五课:纹理图形字

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  3. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL第二十五课:变形

    NeHe OpenGL第二十五课:变形 变形和从文件中加载3D物体: 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型.   欢迎来到这激动人心的一课,在这一课里,我们 ...

  5. 小学计算机网络信息安全教案,黑教版信息技术五年级上册第十五课《网络信息安全》教案.doc...

    黑教版信息技术五年级上册第十五课<网络信息安全>教案.doc 文档编号:535180 文档页数:2 上传时间: 2019-01-10 文档级别: 文档类型:doc 文档大小:33.00KB ...

  6. 小学五年级上册计算机教案新疆,新疆青少版信息技术五年级上册全册教案(共十五课24页).doc...

    新疆青少版信息技术五年级上册全册教案(共十五课24页).doc 文档编号:761001 文档页数:24 上传时间: 2019-10-10 文档级别:成套资源 文档类型:doc 文档大小:64.00KB ...

  7. OpenGL教程翻译 第二十五课 天空盒

    第二十五课 天空盒 背景 天空盒是用于增强场景表现力的一个常用技术,它一般通过在相机周围包裹一个纹理来实现.这个纹理通常是一些天空.山川或者摩天大楼等等,下面是游戏 Half-Life 中使用天空盒的 ...

  8. C语言笔记 第三十五课 数组参数和指针参数分析

    第三十五课 数组参数和指针参数分析 思考:为什么C语言中的数组参数会退化为指针? 退化的意义 C语言中只会以值拷贝的方式传输参数 当向函数传递数组时:(错误的,设计当初的思路) 将整个数组拷贝一份传入 ...

  9. 用OpenInventor实现的NeHe OpenGL教程-第二十五课

    用OpenInventor实现的NeHe OpenGL教程-第二十五课           NeHe教程在这节课中向我们介绍了如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型.两个模型之间 ...

最新文章

  1. SharePoint Online 创建和使用栏
  2. php 卡迪尔的秘密
  3. java 5 线程 睡眠,Java线程之线程的调度-休眠
  4. 内存泄漏(memory leak)的理解与应用
  5. linux更改445端口,windows连接非445端口(nginx转发)的samba服务卡顿
  6. Clock saver for Mac(博朗手表时钟屏保)
  7. ZHW_AI发布CSDN的模板和要求
  8. 2021年全球便携式电动车辆行业调研及趋势分析报告
  9. Collections.sort()方法为List集合内对象进行排序
  10. 【区间 dp】A005_LC_工作计划的最低难度(暴搜 / dp)
  11. PHP打开word文档
  12. 【AI基础】图解手算BatchNorm、LayerNorm和GroupNorm
  13. 计算机主机寿命多长,一般电脑的寿命是多久
  14. Qt QImage与OpenCV Mat转换
  15. [工具使用]BurpSuite
  16. 常见textarea换行问题的处理方法
  17. 【Java】从头开始学习-数组
  18. Java、JSP家庭理财系统
  19. Android驱动面阵相机,支持像移补偿功能面阵CCD相机驱动电路系统
  20. 手绘图说DFS与BFS

热门文章

  1. 睡眠纺锤波、tau和神经退行性病变
  2. 物流机器人基本认识(1)
  3. 常用的前缀(30个),词根(90个),后缀(30个)
  4. 应用层的软件服务企业将迎来黄金期
  5. Linux 创建一个文件 touch
  6. JAVA~eclipse恢复默认界面设置和恢复默认快捷键设置
  7. 在 Microsoft Edge 浏览器上安装 Vue 项目调试扩展插件 Vue-Devtools
  8. HP-UX crontab
  9. 深入理解MFCC(梅尔频率倒谱系数)
  10. Python量化交易实战-10实时获取股票的数据函数封装