NORFlash的原理与操作

NORFlash的原理与操作
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芯⽚,它的引脚如下图所⽰:
引脚描述表
符号管脚名功能
kumoolA0~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
a. ARM处理器在地址线An-A0上送出信号0x0;
b. 由于2440的A1连接NOR Flash A0,16-BIT FLASH在⾃⼰的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单
元输出到D15-D0上;
c. ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的⼀个BYTE的数据。
②、ARM处理器需要从地址0x1读取⼀个BYTE
a. ARM处理器在地址线An-A0上送出信号0x1;
b. 由于2440的A1连接NOR Flash A0,16-BIT FLASH在⾃⼰的地址信号An-A0上看到的地址依然是0x0,然后将地址0x0对应的16-BIT
数据单元输出到D15-D0上;
c. 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,结果符合上⾯描述。

本文发布于:2024-09-22 16:34:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/259183.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地址   数据   引脚   信号   处理器   发送   输出   设置
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议