第015课 NOR Flash操作原理及裸机程序分析

2020-03-23来源: eefocus关键字:NOR  Flash操作  裸机程序

#第001节_Nor Flash原理及硬件操作 #
Nor Flash的连接线有地址线,数据线,片选信号读写信号等,Nor Flash的接口属于内存类接口,Nor Flash可以向内存一样读,但是不能像内存一样写,需要做一些特殊的操作才能进行写操作,读只需像内存一样读很简单。

Nor Flash原理图如图:

这里写图片描述

Flash介绍

常用的Flash类型有Nor Flash和NAND Flash两种。

Nor Flash由Intel公司在1988年发明,以替代当时在市场上占据主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年发明。两者的主要差别如下表:

image.png

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校验。

Nor Flash的操作##

下面我们使用u-boot来体验Nor Flash的操作(开发板设置Nor启动,进入u-boot)。

1).使用OpenJTAG烧写UBOOT到Nor Flash

那么我们怎么用u-boot来操作呢?

Nor Flash手册里会有一个命令的表格,如图:
这里写图片描述

下面简单的举一些例子:

复位(reset):往任何一个地址写入F0。

读ID(ReadSiliconID):很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte)。对于我们使用的jz2440开发板使用是位宽16bit,怎样读ID呢?

根据前面得图可知,往Nor Flash的555地址写AA,再往2AA的地址写入55,再往555的地址写入90,然后就可以读ADI地址,就可以读到DDI数据了。

实例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(参考Nor手册)

  • 往地址555H写入AAH(解锁)

  • 往地址2AAH写入55H(解锁)

  • 往地址555H写入90H(命令)

  • 读0地址得到厂家ID(C2H)

  • 读1地址得到设备ID(22DAH或225BH)

  • 退出读ID状态:给任意地址写F0H就可以了。

下图为2440和Nor Flash的简易连接图:
这里写图片描述

2440的A1接到Nor的A0所以2440发出的地址是,Nor Flash收到的地址左移一位。比如:2440发出(555H<<1)地址,Nor Flash才能收到555H这个地址。

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

image.png

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 探测,就是在内核里面事先定义一个数组,该数组里面放有不同厂家各个芯片的一些参数,探测的时候将 flash 的 ID 和数组里面的 ID 一一比较,如果发现相同的,就使用该数组的参数。
jedec 探测的优点就是简单,缺点是如果内核要支持的 flash 种类很多,这个数组就会很庞大。内核里面用 jedec 探测一个芯片时,是先通过发命令来获取 flash 的 ID,然后和数组比较,但是 flash.c 中连 ID 都是自己通过宏配置的。

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

下面对在Nor Flash上操作,2440上操作,U-BOOT上操作cfi 探测(读取芯片信息)进行比较参考芯片手册。

image.png

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

怎样把数据写进Nor Flash进去呢?

写数据之前必须保证,要写的地址是擦除的。

下面是Nor Flash的写操作,如下表:

image.png

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

数据被烧写进去,烧写成功。


总结:我们烧写时,如果上面的数据,不是0ffff,没有被擦除过,我们就要先擦出,擦除完后,才可以烧写,擦除烧写的命令可以从芯片手册里面获得。


= 第002节_Nor Flash编程_识别 =

本节实例的目的目的:识别nor flash

发送命令函数

nor_cmd函数代码如下,往NOR Flash某个地址发送指令,


16

17 /* offset是基于NOR的角度看到 */

18 void nor_cmd(unsigned int offset, unsigned int cmd)

19 {

20 nor_write_word(NOR_FLASH_BASE, offset, cmd);

21 }

读取函数


nor_read_word函数是从NOR Flash 读取两个字节(本开发板位宽16bit),读取数据的地址,是基于2440,所以读取NOR Flash某个地址上的数据时,需要把NOR Flash对应的地址左移一位(地址乘以2)。


23 unsigned int nor_read_word(unsigned int base, unsigned int offset)

24 {

25 volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));

26 return *p;

27 }

读取地址中的数据


向nor_dat函数中写入NOR Flash某个地址,返回该NOR Flash地址上的数据。


29 unsigned int nor_dat(unsigned int offset)

30 {

31 return nor_read_word(NOR_FLASH_BASE, offset);

32 }

进入NOR FLASH的CFI模式,读取各类信息


do_scan_nor_flash函数代码如下,该函数的功能:进入CFI模式读取NOR Flash中的厂家ID,设备ID,容量等信息。


50/* 进入NOR FLASH的CFI模式

51 * 读取各类信息

52 */

53 void do_scan_nor_flash(void)

54 {

55 char str[4];

56 unsigned int size;

57 int regions, i;

58 int region_info_base;

59 int block_addr, blocks, block_size, j;

60 int cnt;

61

62 int vendor, device;

63

64 /* 打印厂家ID、设备ID */

65 nor_cmd(0x555, 0xaa);    /* 解锁 */

66 nor_cmd(0x2aa, 0x55); 

67 nor_cmd(0x555, 0x90);    /* read id */

68 vendor = nor_dat(0);

69 device = nor_dat(1);

70 nor_cmd(0, 0xf0);        /* reset */

71

72 nor_cmd(0x55, 0x98);  /* 进入cfi模式 */

073

74 str[0] = nor_dat(0x10);

75 str[1] = nor_dat(0x11);

76 str[

[1] [2]
关键字:NOR  Flash操作  裸机程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492330.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第014课 Jz2400_ARM异常与中断体系详解
下一篇:第016课 Nand Flash操作原理及裸机程序分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

FSMC的定义 RAM 和ROM却别 nor flash 和nondflash的区别
一FSMC的定义英文名是(Flexible Static Memory Controller)即 可变静态存储控制器。是STM32系列采用一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。利用FSMC就是发现32内存不够,或者其他原因需要外接内存,所以要用FSMC功能 外加内存。二  我发现百度词条讲的很清楚。我提出来几个 给细讲一下。FSMC技术优势①支持多种静态存储器类型。STM32通过FSMC可以与SRAM、ROM、PSRAM、NOR Flash和NANDFlash存储器的引脚直接相连。②支持丰富的存储操作方法。FSMC不仅支持多种数据宽度
发表于 2020-03-17
【ARM裸板】Nor Flash基础知识与编程示例
1.NOR与NAND的区别Flash NOR NAND接口 RAM-Like,引脚多 引脚少,复用(地址数据共用)容量 小(1-32M) 大(128M+)读 简单 复杂写 发出特定命令(慢) 发出特定命令(快)价格 贵 较便宜缺点 无位反转、坏块 位反转、坏块一般存放 bootloader(关键程序) 大文件、视频xip 可以 不可以xip(eXecute In Place),即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM.2.命令表UBOOT下读写数据2.1 读数
发表于 2020-03-05
【ARM裸板】Nor Flash基础知识与编程示例
ARM的两种启动方式 (NAND FLASH. NOR FLASH)
为什么会有两种启动方式?这就是有两种FLASH 的不同特点决定的。NAND FLASH 容量大,存储的单位比特数据的成本要低很多,但是要按照特定的时序对NAND  FLASH  进行读写,因此CPU  无法对NAND  FLASH 的数据进行直接寻址,CPU 对NAND  FLASH 中数据的读写是通过专门的  nand  flash控制器进行的,因此 NAND  FLASH 更适合于存储数据。NOR FLASH 容量小,速度快,对NOR FLASH 进行读写时,输入地址,然后给出读写信号即可从数据总线上得到数据,但是价格要比NAND  
发表于 2020-02-04
NOR Flash市场反弹,武汉新芯顺势切入可望供货5G基站客户
NOR Flash在经过去年的低谷后,今年市场快速回温。目前NOR Flash原厂及代理商去库存已至低位,产能较为吃紧,整个NOR Flash市场行情正在反弹,涨价趋势较为明显。在国内NOR Flash原厂中,武汉新芯集成电路制造有限公司(以下简称“武汉新芯”)近期宣布推出基于50nm Floating Gate工艺的SPI NOR Flash产品系列XM25QWxxC,为物联网、可穿戴设备和其它功耗敏感应用提供灵活的设计方案。该XM25QWxxC系列产品的读速在1.65V至3.6V电压范围内可达108MHz(在所有单/双/四通道和QPI模式下均支持),在电源电压下降后,时钟速度没有任何减慢。该系列产品支持SOP8和USON8封装
发表于 2019-12-27
NOR Flash市场反弹,武汉新芯顺势切入可望供货5G基站客户
赛普拉斯Semper NOR闪存助力东芝加速开发新一代ADAS
东芝最新推出的Visconti™ ADAS SoC主要针对汽车制造商的自动驾驶应用,高密度Semper NOR闪存系列为该SoC增强功能安全性日前,赛普拉斯半导体技术有限公司(NASDAQ:CY)宣布,东芝电子元件及存储装置株式会社(“东芝”)已选择将赛普拉斯Semper NOR闪存用于其面向汽车高级驾驶辅助系统(ADAS)的新一代Visconti™系列产品。Semper系列采用嵌入式处理器架构,专为要求最严苛的汽车环境而开发,同时符合高密度要求和功能安全要求。针对正在努力实现自动驾驶L2级功能的主要汽车制造商,东芝专门推出Visconti™ ADAS SoC。赛普拉斯Semper NOR闪存系列在功能安全合规方面处于业界领先地位
发表于 2019-12-19
赛普拉斯Semper NOR闪存助力东芝加速开发新一代ADAS
东芝最新推出的Visconti™ ADAS SoC主要针对汽车制造商的自动驾驶应用,高密度Semper NOR闪存系列为该SoC增强功能安全性  日前,赛普拉斯半导体技术有限公司宣布,东芝电子元件及存储装置株式会社(“东芝”)已选择将赛普拉斯Semper NOR闪存用于其面向汽车高级驾驶辅助系统(ADAS)的新一代Visconti™系列产品。Semper系列采用嵌入式处理器架构,专为要求最严苛的汽车环境而开发,同时符合高密度要求和功能安全要求。针对正在努力实现自动驾驶L2级功能的主要汽车制造商,东芝专门推出Visconti™ ADAS SoC。 赛普拉斯Semper NOR闪存系列在功能安全合规方面
发表于 2019-12-19
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved