学习目标:

1、了解nor flash存储芯片的概念和特性

2、掌握使用s3c2440芯片对外挂的nor flash进行读写擦除操作


1、NOR Flash的简单介绍

NOR Flash最早是由Intel公司于1988年开发出的,是现在市场上两种主要的非易失性存储器之一,它的出现彻底改变了存储器市场上由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。NOR Flash最大特点是支持XIP(Execute On Chip),既程序可以直接在NOR flash的片内执行,在NOR Flash中的代码运行时不需要重定位复制到RAM内。NOR Flash的地址线和数据线分开,数据的读取和RAM很类似,只要能够提供数据地址,数据总线就能正确给出数据。不过不能直接对它进行写操作,执行写操作之前需要先发送固定的命令序列,然后发送写操作的地址和数据。

NOR Flash存储器的最小访问单元一般分为8位和16位的,也有一些NOR Flash器件同时支持8位和16位模式,这种Flash的位宽可以在设计硬件时选择,当芯片的BYTE#引脚接为高电平,芯片工作在位宽16位模式,BYTE#引脚设为低电平时,芯片工作在位宽8位模式。

NOR Flash一般有多个扇区,扇区是NOR Flash擦除的最小单位,Nor Flash中每个扇区的大小也不是固定的,扇区的排放一般分为两种模式Top Boot part 和Bottom Boot part 。这两种形式的区别是小块的扇区在NOR Flash芯片中放置的位置不同,Bottom Boot类型的NOR Flash小块地址位于芯片0地址,而Top Boot part类型的NOR Flash小块地址位于芯片的高地址上。

2、NOR Flash引脚介绍(以MX29LV60DBTI芯片为例)

MX29LV60DBTI是16M-BIT的NOR Flash芯片,它的引脚如下图所示:

引脚描述表

符号 管脚名 功能
A0~A19 地址输入 地址信号,表示要读写数据的地址信息
Q0~Q15 数据输入/输出 数据输入/输出引脚,读周期内输出数据,写周期内输入数据
CE# 芯片使能 CE#为低电平时,芯片被选中,后续执行的操作才会有效
WE# 写使能 配合CE#和OE#以及地址引脚和数据引脚一起使用,当CE#低电平,OE#高电平,WE#为低电平时,Q0~Q15上数据被写入到A0~A19表示地址中
BYTE# 字或字节选择输入 当其为高电平时,数据输出为16bit模式;低电平时,数据输出为8bit模式
RESET# 硬件复位/扇区保护解锁引脚 硬件复位引脚,当输入信号为低电平时,芯片复位
OE# 输出使能 配合CE#和WE#以及地址引脚和数据引脚一起使用,当CE#低电平,WE#高电平,OE#为低电平时,将地址A0~A19内存中的数据传送到Q0~A15上
RY/BY#  RY/BY#输出引脚 用于输出Ready和Busy信号,实际用时可以不接,可以用命令查询NOR Flash状态代替
VCC 电源供应引脚(2.7v~3.6v) 芯片供电电源
GND 地引脚 芯片电源地
WP#/ACC 硬件写保护/加速引脚 硬件写保护引脚,低电平有效
NC 不连接内部引脚 不用连接

3、NOR Flash于S3C2440连接图

NOR Flash的数据宽度是16位的,与2440处理器的连接时,地址线必须错位进行连接。s3c2440的地址线A0悬空,A1连接NOR Flash的地址线A0,A2连接NOR Flash的地址线A1,依次排序。需要错位连接的原因是:2440处理器的每个地址对应的是一个BYTE 的数据单元,而 16-BIT 的 NOR FLASH 的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元。为了保持匹配,所以必须错位连接。这样,从2440处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了。

上面的描述过程太过抽象了,下面通过画图来解释错位连接的原因:

①、ARM处理器需要从地址0x0读取一个BYTE

  1. ARM处理器在地址线An-A0上送出信号0x0;
  2. 由于2440的A1连接NOR Flash A0,16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
  3. ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据。

②、ARM处理器需要从地址0x1读取一个BYTE

  1. ARM处理器在地址线An-A0上送出信号0x1;
  2. 由于2440的A1连接NOR Flash A0,16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
  3. ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据。

注意:有些ARM处理器内部可以设置地址的错位。对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上不需要把地址线错位。在设计的时候,应该参考芯片的数据手册,以手册为准,以免造成不必要的麻烦(如stm32连接是A0~A0)。

4、S3C2440驱动NOR Flash时序配置

s2c2440内存控制器接读NOR Flash时序图

上图为s3c2440操作NOR Flash的读时序,Tacs表示片选使能前地址信号的设置时间(既地址信号需要设置多久,才能使能片选信号),Tcos表示OE#信号使能前片选使能的设置时间,Tacc表示数据的访问周期,Tcoh表示OE#信号释放后片选信号的保持时间,Tcah表示片选信号释放后地址信号的保持时间。由于s3c2440为通用性能的处理器,他的外部可能接不同公司生成的不同型号的NOR Flash,所以这些参数值要根据所接型号的NOR Flash的时序图进行设置。

下面根据NOR Flash芯片MX29LV60DBTI时序图来配置上述参数,MX29LV60DBTI的时序图如下图所示:

NOR Flash芯片MX29LV60DBTI读操作内部时序图

NOR Flash芯片MX29LV60DBTI时序图各参数具体值

Tce:片选信号使能后多久输出数据有效,最大值为70ns

Toe:读信号发出后多久输出数据有效,最大值为30ns

Taa:地址信号发出后数据有效,最大值为70ns

Trc:读周期时间,最小70ns

Tdf:OE#或CE#高时,数据引脚浮空时间,最大30ns(可以忽略设置,当读取数据结束后,新的读取信号发出,要过70ns,数据线上数据有效,这段引脚浮空时间无影响)

上述最大值表示发出该信号后,间隔最大值的时间后,数据引脚的信号一定是有效的,在这个范围之内,数据信号的引脚可能有效。

为简单,我们一般设置2440的CE#、OE#、ADD控制信号同时发出,保持70ns后进行读取数据引脚的数据。NOR Flash连接s3c2440的Bank0地址,配置时序的寄存器为BANKCON0,该寄存器的各个位如下图所示:

内存控制器的时钟信号由HCLK时钟信号提供,假设设置的HCLK的值为100M,1clock = 10ns。根据前面分析,Tacs、Tcos寄存器位设置为0,Tacc寄存器的为设置为101 = 8clocks。

5、NOR Flash的读操作

NOR Flash是类似于内存类的接口,读操作和内存的读取一样,直接发送相应的地址便能获取相应数据

unsigned int nor_read_word(unsigned int base, unsigned int offset)
{
volatile unsigned short *p = (volatile unsigned short *)(base + offset);
return *p;
} unsigned int nor_dat(unsigned int offset)
{
return nor_read_word(NOR_FLASH_BASE, offset);
}

6、NOR Flash的扇区擦除

擦除NOR Flash扇区时,应先发送相应的命令,发送命令的顺序如下:

第1个总线周期:往555地址中写入AA

第2个总线周期:往2AA地址中写入55

第3个总线周期:往555地址中写入80

第4个总线周期:往555地址中写入AA

第5个总线周期:往2AA地址中写入55

第6个总线周期:往要擦除的扇区写入30

void nor_write_word(unsigned int base, unsigned int offset, unsigned int val)
{
volatile unsigned short *p = (volatile unsigned short *)(base + offset);
*p = val;
} /* offset是基于cpu的角度看到 */
void nor_cmd(unsigned int offset, unsigned int cmd)
{
nor_write_word(NOR_FLASH_BASE, offset, cmd);
} /* 等待烧写完成 : 读数据, Q6无变化时表示结束 */
void wait_ready(unsigned int addr)
{
    unsigned int val;
    unsigned int pre;     pre = nor_dat(addr);
    val = nor_dat(addr);
    while ((val & (1<<6)) != (pre & (1<<6)))
    {
        pre = val;
        val = nor_dat(addr);        
    }
}
void erase_nor_flash_sector(unsigned int addr)
{
printf("erasing ...\n\r");
nor_cmd(0x555<<1, 0xaa); /* 解锁 */
nor_cmd(0x2aa<<1, 0x55);
nor_cmd(0x555<<1, 0x80); /* erase sector */ nor_cmd(0x555<<1, 0xaa); /* 解锁 */
nor_cmd(0x2aa<<1, 0x55);
nor_cmd(addr, 0x30); /* 发出扇区地址 */
wait_ready(addr);  /* 等待操作完成 */
}

CPU外接NOR Flash,实际上就是将NOR Flash地址映射为CPU的统一编址。由于nor_cmd函数的offset是基于CPU的角度看到地址,而芯片手册上NOR Flash写入命令的地址从NOR Flash的实际物理地址,NOR Flash是16位的,它的0地址应该对应CPU的0地址和1地址。因此,NOR Flash的物理地址从CPU的角度来看,地址值应该是NOR Flash角度来看的两倍,所以在向某地址写入命令时,要将NOR Flash角度来看的地址右移一位。

7、NOR Flash的写操作

向NOR Flash地址中写入数据时,也应先发送相应的命令,发送命令的顺序如下:

第1个总线周期:往555地址中写入AA

第2个总线周期:往2AA地址中写入55

第3个总线周期:往555地址中写入A0

第4个总线周期:往要目标地址写入数据

void write_nor_flash(unsigned int addr,unsigned int val)
{
/* 烧写 */
nor_cmd(0x555<<1, 0xaa); /* 解锁 */
nor_cmd(0x2aa<<1, 0x55);
nor_cmd(0x555<<1, 0xa0); /* program */
nor_cmd(addr, val);
/* 等待烧写完成 : 读数据, Q6无变化时表示结束 */
wait_ready(addr);
}

写操作时值得注意的是,只有写入的目标的地址内容为0xff时,数据才能正确的写入,因此,一般情况下NOR Flash在写入时要对扇区进行擦除操作。NOR Flash在写入数据时只能将地址中的某位由1变0,而不能将某位由0变1。

假设NOR Flash某地址中存放字符a(0x61),如果未进行擦除前向该地址中写入字符G(0x47),最后该地址内容为A(0x41)。原因如下:

  字符a化为二进制--->1100001

  字符G化为二进制--->1000111

由于写入时数据位只能由0变为1,最终结果100001,相当于执行原始数据和新写入数据进行&操作

向NOR Flash执行上述步骤,验证上述过程

①、向0x80000地址写入a字符

②、未进行擦除扇区向0x80000地址写入G字符,接着读取这个地址里的数据,实际读取内容为0x41,不是0x47,结果符合上面描述。

v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

Normal
0
false

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

NOR Flash的原理与操作的更多相关文章

  1. Flash硬件原理

    1.2.1. 什么是Flash Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory ...

  2. flash存储原理

    norflash 带有 SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容每一字节:nandflash器件使用复杂的IO口串行的存取数据,读写操作采用512字节的块(也就是读/写某个字节,必 ...

  3. Spring_day02--AOP概念、原理、操作术语

    AOP概念 hibernate要手动进行事务操作,在spring中通过配置文件来配置事务 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2  AOP采取横向抽取机制,取代了传统纵向继承体 ...

  4. 【Mybatis源码解析】- JDBC连接数据库的原理和操作

    JDBC连接数据库的原理和操作 JDBC即Java DataBase Connectivity,java数据库连接:JDBC 提供的API可以让JAVA通过API方式访问关系型数据库,执行SQL语句, ...

  5. 【接口时序】5、QSPI Flash的原理与QSPI时序的Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 4.Matlab版本:Matlab2014b/ ...

  6. flash存储器原理及作用是什么?

    flash存储器的工作原理 flash存储器又称闪存(快闪存储器),是一种电可擦可编程只读存储器的形式,是可以在操作中被多次擦或写,EEPROM与高速RAM成为当前最常用且发展最快的两种存储技术.计算 ...

  7. Hadoop入门进阶课程5--MapReduce原理及操作

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  8. Hadoop入门进阶课程4--HDFS原理及操作

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  9. Hadoop学习记录(4)|MapReduce原理|API操作使用

    MapReduce概念 MapReduce是一种分布式计算模型,由谷歌提出,主要用于搜索领域,解决海量数据计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce( ...

随机推荐

  1. 连接到 Azure 上的 SQL Server 虚拟机(经典部署)

    概述 本主题介绍如何连接到运行于 Azure 虚拟机的 SQL Server 实例. 它介绍了一些常规连接方案,并提供了在 Azure VM 中配置 SQL Server 连接的详细步骤. Impor ...

  2. Azure 虚拟机上的 SQL Server 常见问题

    本主题提供有关运行 Azure 虚拟机中的 SQL Server 时出现的一些最常见问题的解答. 如果本文未解决你的 Azure 问题,请访问 MSDN 和 CSDN 上的 Azure 论坛. 你可以 ...

  3. python面向对象编程(1)——基本概念,术语,self,构造器

    1  python面向对象命名规范 类名通常由大写字母打头.这是惯例标准. 数据值应该使用名词作为名字,方法使用动词加对象的方式,若使用混合记法,则方法名的第一个字母首字母小写,后面的单词的首字母大写 ...

  4. System.Buffer 以字节数组(Byte[])操作基元类型数据

    1. Buffer.ByteLength:计算基元类型数组累计有多少字节组成. 该方法结果等于"基元类型字节长度 * 数组长度" , , }; , , }; , , }; Cons ...

  5. Hdfs&MapReduce测试

    Hdfs&MapReduce测试 测试 上传文件到hdfs 随意打开一个文件夹传一个文件试试(把javafx-src.zip传到hdfs的/根目录下):hadoop fs -put javaf ...

  6. 《java编程思想》有必要买吗

    <java编程思想>有必要买吗 1.看到过好多个这样的提问,其实我一般真的不那么容易分享自己的这点心得的,这是第一次回答这样的“推荐书籍”方面的问题. 我买编程方面的书籍,有一个非常清晰. ...

  7. eclipse git 解决冲突

    1,team->synchronize workspace 2, merge tool 合并本地版本 3,add to git index 4,commit 5,push

  8. 设置python的默认编码方式为utf-8

    在python的Lib\site-packages文件夹下新建一个sitecustomize.py,然后通过sys.getdefaultencoding()获取当前的默认编码 内容为:

  9. Java List详解,面试中应该如何解答关于List的问题

    对于面试,我们在介绍Java的List的时候,一般需要介绍到,什么是List?List包括什么?各自在用法上有什么区别,在存储上有什么区别?List需要注意什么?把这些问题串起来,我们可以这样介绍: ...

  10. [SQL注入] 逗号拦截绕过

    在SQL注入时,在确定了注入点后,一般都需要使用联合查询猜表的列数,也就是常见的order by n,n从大到小,直到返回正常,就确定了当前查询的列的个数. 然后再使用 UNION SELECT 1, ...