一、NorFlash概述

1、NorFlash

  Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。

  NOR的优越之处是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。

2、NandFlash和NorFlash对比

Nor/Nand Flash 的差别
  Nor  Nand
容量 1MB~32MB 16M~512MB
XIP Yes No
擦除 非常慢(5S) 快(3ms)
慢        快
可靠性 比较高,位反转的比例小于NandFlash的10% 比较低,位反转比较常见,必须有校验措施,比如TNR必须有坏块管理措施
可擦除次数 10000~100000               100000~1000000
生命周期     低于NandFlash的10%              是NorFlash的10倍以上    
接口       与RAM接口相同                    I/O接口
访问方法 随机访问 顺序访问
易用性 容易 复杂
主要用途 常用于保存代码和关键数据 用于保存数据
价格 便宜

3、CFI(Common Flash Interface)
   不同公司产的NOR Flash在 erase,program,lock,unlock等操作上有差别,即command set不一样。
   NorFlash要是支持CFI就好办多了,就不用改代码。通过CFI可以读出片子的manufacturer id,vendorid等等,在程序中就可以通过以上信息来选择正确的erase,program等操作方式。
   NorFlash的数据线和地址线都可能为32/16/8条.为了统一起见,通过CFI接口查询时, CFI接口描述的地址均为Flash芯片的地址,CFI接口查询到的数据,以低字节D7-D0上为准,高字节数据线无视就好了。

 CFI的作用是把NorFlash 的信息通过统一的方法读出来。

二、NorFlash物理结构

  以下内容皆以EN29LV160AB(word模式)为例进行说明。

1、引脚

2、NorFlash块图

3、扇区结构

  Size:  MB in  Sectors
Sector Start Addresses: 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 001A0000
001B0000 001C0000 001D0000 001E0000 001F0000

  EN29LV160AB大小为2M,总共35个扇区,上图列出了每个扇区的起始地址。

三、NorFlash与ARM接线图

  左图为EN29LV160AB与ARM的接线图,右图是SRAM与ARM的接线图,可以看到两者没多大的差别。

、NorFlash相对于RAM使用的特殊性 

NorFlash相对于RAM使用的特殊性

RAM

NorFlash

读取/写入的叫法

读取/写入

读取/编程(Program)

读取/写入的最小单位

字节(Byte)

字(Word)

擦除(Erase)操作的最小单位

字节

Sector/扇区

擦除操作的含义

将数据删除/全部写入0

将整个块都擦除成全是1,也就是里面的数据都是0xFF

对于写操作

直接写即可

在写数据之前,要先擦除,然后再写

 五、NorFlash操作

1、CFI操作

  EN29LV160AB遵循CFI接口协议,所以可以进行CFI操作方式。下表仅仅是CFI查询信息的命令表,还有其他表格,这里不再列出。下边将要阐述的操作方式不是通用性的CFI操作,而是EN29LV160AB特有命令集操作。

2、NorFlash命令表

  不利用CFI方式也可以操作,EN29LV160AB有自己的命令集,利用这个命令集可以完成需要的操作。

3、状态标志位

DQ7

Data# Polling bit,在编程过程从正在编程的地址中读出的数据的 DQ7 为要写入数据位的补码。比如写入的数据为 0x0000 ,即输入的 DQ7 为  0 ,则在编程中读出的数据为  1  ;当编程完成时读出的数据又变回输入的数据  0  。在擦除过程中 DQ7 输出为   0 ;擦除完成后输出为 1 ;注意读取的地址必须是擦除范围内的地址。RY/BY#:高电平表示‘就绪’,低电平表示‘忙’。

DQ6

轮转位 1(Toggle Bit 1 ),在编程和擦除期间,读任意地址都会导致 DQ6 的轮转(0 ,1间相互变换)。当操作完成后,DQ6停止转换。

DQ2

轮转位 2 (Toggle Bit 2 ),当某个扇区被选中擦除时,读有效地址(地址都在擦除的扇区范围内)会导致 DQ2 的轮转。 注意: DQ2 只能判断一个特定的扇区是否被选中擦除,但不能区分这个扇区是否正在擦除中或者
正处于擦除暂停状态。相比之下,DQ6 可以区分 Nor Flash 是否处于擦除中或者擦除暂停状态,但不能区分哪个扇区被选中擦除,因此需要这 2 个位来确定扇区和模式状态信息。

DQ5

超时位(Exceeded Timing Limits) ,当编程或擦除操作超过了一个特定内部脉冲计数时 DQ5=1,表明操作失败。当编程时把 0 改为  1  就会导致 DQ5=1,因为只有擦除擦做才能把 0  改为 1 。当错误发生后需要执行复位命令才能返回到读数据状态。

DQ3

(扇区擦除计时位)Sector Erase Timer  ,只在扇区擦除指令时起作用。当擦除指令真正开始工作时 DQ3=1  ,此时输入的命令(除擦除暂停命令外)都被忽略,DQ3=0  时,可以添加附加的扇区用于多扇区擦除。

六、实现代码

1、读ID

/*******************************************************************
函数功能:显示NorFlash的“Manufacturer ID”和“Device ID”
输入参数:addr
输出参数:无
********************************************************************/
void NOR_Read_ID(void)
{
unsigned short ManuID,DevID; NOR_Rest();
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(0x555,0x90);
ManuID = NOR_RD(0x0);
DevID = NOR_RD(0x1);
printf("Manufacturer ID: %x\n",ManuID);
printf("Device ID: %x\n",DevID);
}

2、读内容并显示

/*******************************************************************
函数功能:从NorFlash给定的地址处显示256B的内容
输入参数:addr
输出参数:无
*********************************************************************/
void NOR_2K_Content(unsigned char *addr)
{ unsigned int i; printf("Show 256 Bytes content of NorFlash:\n");
for(i=; i<; i++) {
if((i%)==) printf("\n%4x: ", i);
printf("%02x ", *addr++);
}
printf("\n");
}

3、擦除

/*******************************************************************
函数功能:擦除整个芯片
输入参数:无
输出参数:无
********************************************************************/
void NOR_EraseChip(void)
{
printf("chip erasing is started!\n");
NOR_Rest();
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(0x555,0x80);
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(0x555,0x10);
printf("it may takes some seconds,plese wait......\n");
if(NOR_Wait())
{
printf("Erasing done!\n");
}
else
{
printf("Erasing error!\n");
}
} /*******************************************************************
函数功能:擦除给定的扇区
输入参数:sect 扇区号
输出参数:无
*********************************************************************/
void NOR_EraseSector(unsigned char sect)
{
unsigned int sectaddr; if(sect > )
{
printf("sect number error!\n");
return ;
} switch(sect)
{
case :
sectaddr = 0x0;
break;
case :
sectaddr = 0x2000;
break;
case :
sectaddr = 0x3000;
break;
case :
sectaddr = 0x4000;
break;
default:
sectaddr = 0x8000*(sect - );
}
printf("Sector %d erasing is started!\n",sect);
NOR_Rest();
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(0x555,0x80);
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(sectaddr,0x30);
printf("it may takes some seconds,plese wait......\n");
if(NOR_Wait())
{
printf("Erasing done!\n");
}
else
{
printf("Erasing error!\n");
}
}

4、编程

/*******************************************************************
函数功能:写一个字(2Byte)
输入参数:addr 要写入一个字的物理地址,注意第0位肯定是‘0’
data 要写入的数据
输出参数:1 成功
0 失败
********************************************************************/
static unsigned int NOR_Program(unsigned int addr,unsigned short data)
{
NOR_Rest();
NOR_WR(0x555,0xaa);
NOR_WR(0x2aa,0x55);
NOR_WR(0x555,0xa0);
NOR_WR_DAT(addr,data);
return NOR_Wait();
} /*******************************************************************
函数功能:写入多个字节
输入参数:srcaddr 源地址
desaddr 目的地址
size 大小(以Byte为单位)
输出参数:1 成功
0 失败
********************************************************************/
unsigned int NOR_Write(unsigned short *srcaddr,unsigned int desaddr,unsigned int size)
{
unsigned int i;
printf(" Write NorFlash start!\n");
for(i = ;i < size;i += ){
if( NOR_Program(desaddr,*srcaddr) != ){
printf(" Write NorFlash error!\n");
return ;
}
desaddr += ;
srcaddr++;
}
printf(" Write done.\n");
return ;
}

5、等待擦除或者编程结束

  判断当前状态,从而决定是否等待以及判断是否出错是根据状态标志位来操作的。“等待擦除或者编程结束”有不同的方法实现,这里使用的是DQ6轮转判断。

/*******************************************************************
函数功能:等待擦除或者编程结束
输入参数:无
输出参数: 1 成功
0 失败
*********************************************************************/
static unsigned int NOR_Wait(void)
{
unsigned short oldstatus,newstatus;
while()
{ oldstatus = NOR_RD(0x0);
newstatus = NOR_RD(0x0);
if( (oldstatus&0x40) == (newstatus&0x40) )
return ;
if( newstatus&0x20 )
{
oldstatus = NOR_RD(0x0);
newstatus = NOR_RD(0x0);
if( (oldstatus&0x40) == (newstatus&0x40) )
return ;
else
return ;
}
}
}

参考资料:CFI接口 

     Nor/Nand FLASH的读写

     Nor Flash 在实际应用中的读取方式

测试代码及文档资料:

     NorFlash.zip

NorFlash的更多相关文章

  1. Norflash控制器的Verilog建模之三(測試)

    前言:回校了,辦好手續就著手寫測試篇.初步的norflash控制器已經完成,通過硬件測試.目前的norflash完成扇区块擦除.单字节写.单字节读3个功能.博文最后附上源码. 总结:和之前的博文一样, ...

  2. Norflash控制器的Verilog建模之二(仿真)

    前言:经过几天修改,norflash控制器基本已经完成,通过仿真.完整的norflash包含2个模块:直接操作硬件的norflash_ctrl.v与控制ctrl模块的驱动norflash_driver ...

  3. Norflash控制器的Verilog建模之一

    摘要:今天驱动一款SPANSION公司生产的norflash——S29AL032D70,没有别的参考资料,大致了解一下norflash的内部cmos电路架构以及其用途之后,直接看手册吧. 如何看手册: ...

  4. 使用jlink直接烧norflash或者nandflash不借助uboot的猜想

    由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...

  5. 关于NOR-FLASH和NAND-fLASH的区别。——Arvin

    NANDFLASH: Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NAND flash结构.其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案.N ...

  6. 路由器 NorFlash与NandFlash区别

    在淘宝上买修改openwrt的路由器,基本上都是改的16MB flash,那么为什么不改到1GB呢? 现在U盘的价格也很便宜啊. 于是我调查了一下,发现flash分为两种,NorFlash与NandF ...

  7. 关于nandflash与norflash

    读取速度:nor > nand 写入速度:nand > nor 擦除速度:nand 4ms,nor 5s nand的擦除单元更小,相应的擦除电路更少. nand的实际应用方式比nor复杂, ...

  8. 通过NORFLASH中的uboot烧写uboot到nandFlash

    在mini2440的教程中,在构建nandflash系统的时候是首先通过supervivi借助dnw烧写uboot.bin到nand flash 第零块, 由于我使用的是64位操作系统,usb驱动没安 ...

  9. NorFlash和NandFlash区别

      Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位 ...

  10. uboot在nandflash和norflash是如何运行的

    转自:http://www.aiuxian.com/article/p-2796357.html 电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好 ...

随机推荐

  1. JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用

    1.标签 以类似于html标签的方式实现的java代码的封装. 第一:形成了开发标签的技术标准---自定义标签的技术标准. 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl, ...

  2. js模拟下载

    <a id="downFile" href="" style="display: none;"><span id=&quo ...

  3. 使用val()方法设置表单中的默认选中项

    有时候我们展示给用户的表单中的checkbox,radio,selec等标签的一些项是默认选中的.比方:当用户改动文章的时候,假设相应的栏目为下拉框的话,那么它的默认选中值应该是原来的栏目位置. 能够 ...

  4. HTML5到底能给企业带来些什么?

    一.改变企业网络广告的模式与分布 广告是企业网络营销的主要方式之一.十几年来,无论是展示还是互动,基本被Adobe Flash所主宰.然而,HTML5网页的多媒体特性.三维.图形及特效,超炫的浏览体验 ...

  5. Android TextView中有图片有文字混合排列

    Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...

  6. DS_Store

    .DS_Store (英文全称 Desktop Services Store)[1] 是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮文件夹的自定义属性,例如文件们的图标位置或 ...

  7. hdu2011java

    多项式求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. ubuntu 下编译安装 mysql php nginx 及常见错误 (持续添加)

    mysql mysql 可以使用mysql 官方提供的apt源进行安装 参见这里 php 安装前先安装一些常见库 sudo apt-get install libpng16-16 libpng16-d ...

  9. Summary: How to calculate PI? Based on Monte Carlo method

    refer to: http://www.stealthcopter.com/blog/2009/09/python-calculating-pi-using-random-numbers/ Duri ...

  10. C语言基础知识小总结(2)

    上个总结比较笼统,下面写的稍微详细点吧算是.   一.控制台屏幕打印 1.putchar();   格式: void putchar(char c);  //直接把一个字符输出到屏幕上 2.print ...