加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Nor flash 以及nandflash原理总结

发布时间:2020-12-15 06:12:59 所属栏目:百科 来源:网络整理
导读:?一、NOR FLASH ?1.???? NOR FLASH的简单介绍?? ??? ???????? NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失。NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行。这点和NAND FLASH不一样。因此,在嵌入是系统中,NOR FLASH很适合作为启动

?一、NOR FLASH

?1.???? NOR FLASH的简单介绍?????

???????? NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失。NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行。这点和NAND FLASH不一样。因此,在嵌入是系统中,NOR FLASH很适合作为启动程序的存储介质。NOR FLASH的读取和RAM很类似,但不可以直接进行写操作。对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。

???????? 从支持的最小访问单元来看,NOR FLASH一般分为8位的和16位的(当然,也有很多NOR FLASH芯片同时支持8位模式和是16位模式,具体的工作模式通过特定的管脚进行选择)。对8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据。例如一块8-BIT的NOR FLASH,假设容量为4个BYTE。那芯片应该有8个数据信号D7-D0和2个地址信号,A1-A0。地址0x0对应第0个BYTE,地址0x1对应于第1BYTE,地址0x2对应于第2个BYTE,而地址0x3则对应于第3个BYTE。.
对16位的NOR FLASH芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据。例如,一块16-BIT的NOR FLASH,假设其容量为4个BYTE。那芯片应该有16个数据信号线D15-D0和1个地址信号A0。地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORD。

FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元。对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR。FLASH的擦除操作一般都是以SECTOR,BANK或是整片FLASH为单位的。

2.处理器和NOR FLASH的硬件连接

??????? 从前面的介绍,我们知道从处理器的角度来看,每个地址对应的是一个BYTE的数据单元。而,NOR FLASH的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元。所以在硬件设计中,连接ARM处理器和NOR FLASH时,必须根据实际情况对地址信号做特别的处理。
如果ARM处理器外部扩展的是8-BIT的NOR FLASH,数据线和地址线的连接应该如图1所示。从图中我们可以看到,处理器的数据信号D0-D7和FLASH的数据信号D0-D7是一一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An也是一一对应连接的。

?????? 如果ARM处理器外部扩展的是16-BIT的NOR FLASH,地址线必须要错位连接。图2给了一个ARM处理器和16-BIT NOR FLASH的连接示意图。如图2所示,ARM处理器的数据信号D0-D15和FLASH的数据信号D0-D15是一一对应的。而ARM处理器的地址信号和NOR FLASH的地址信号是错位连接的,ARM的A0悬空,ARM的A1连接FLASH的A0,ARM的A2连接FLASH的A1,依次类推。需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE的数据单元,而16-BIT的FLASH的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元。为了保持匹配,所以必须错位连接。这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了。

上面的描述可能比较抽象,下面让我们来看2个ARM处理器访问16-BIT FLASH的例子:
例子1:ARM处理器需要从地址0x0读取一个BYTE
1 - ARM处理器在地址线An-A0上送出信号0x0;
2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,
然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
3 – ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据;
例子2:ARM处理器需要从地址0x1读取一个BYTE
1 - ARM处理器在地址线An-A0上送出信号0x1;
2 – 16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0
,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;
3 –ARM处理器知道访问的是16-BIT的FLASH,从D15-D8上读取所需要的一个BYTE的数据;

在上一个小节里,我们简单了解了ARM处理器和FLASH的硬件连接。在这个小节里面,我们从软件的角度来理解ARM处理器和FLASH的连接。对于8-BIT的FLASH的连接,很好理解,因为ARM处理器和8-BIT FLASH的每个地址对应的都是一个BYTE的数据单元。所以地址连接毫无疑问是一一对应的。如果ARM处理器连接的是16-BIT的处理器,因为ARM处理器的每个地址对应的是一个BYTE的数据单元,而16-BIT FLASH的每个地址对应的是一个HALF-WORD的16-BIT的数据单元。所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的。在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:
1 – ARM处理器访问8-BIT FLASH的时候,地址是一一对应的;
2 – ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的。这一点对理解后面的例子会很有帮助。

3.从软件角度来看ARM处理器和NOR FLASH的连接

在本节后面的描述中,我们使用了下面的2个定义:
U32sysbase; //该变量用来表示FLASH的起始地址
#define SysAddr16(sysbase,offset) ((volatile U16*)(sysbase)+(offset)) //用来方便对指定的FALSH地址进行操作
SysAddr16(sysbase,offset)首先定义了一个16-BIT HALF-WORD的指针,指针的地址为sysbase,然后根据offset做个偏移操作。因为HALF-WORD指针的地址是2个BYTE对齐的,所以每个偏移操作会使得地址加2。 最终,SysAddr16(sysbase,offset)相当于定义了一个HALF-WORD的指针,其最终地址为(sysbase + 2*offset)。在使用SysAddr16的时候,将sysbase设置成FLASH的起始地址,offset则可以理解为相对于FLASH起始地址的HALF-WORD偏移量或是偏移地址。假设FLASH的起始地址为0x10000000,SysAddr16(0x10000000,0)指向16-BIT FLASH的第0个HALF-WORD,SysAddr16(0x10000000,1)指向16-BIT FLASH的第1个HALF-WORD。依次类推。如果要将0xABCD分别写到FLASH的第0个和第1个HALF-WORD中去,可以用下面的代码:
*SysAddr16(0x10000000,0x0) = 0xABCD;
*SysAddr16(0x10000000,0x1) = 0xABCD;

二、NAND FLASH

1.NAND Flash 地址分类

NAND flash 以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成
所谓的三类地址:
Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8

Page Address :页地址
Block Address :块地址
对于NAND Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。

2、NAND Flash 地址的表示


512byte 需要9bit 来表示,对于528byte 系列的NAND,这512byte 被分成1st half Page Register 和2nd half Page Register,各自的访问由地址指针命令来选择,A[7:0]就是所
谓的column address(列地址),在进行擦除操作时不需要它,why?因为以块为单位擦除。32 个page 需要5bit 来表示,占用A[13:9],即该page 在块内的相对地址。A8 这一位地址被用来设置512byte 的1st half page 还是2nd half page,0 表示1st,1 表示2nd。Block的地址是由A14 以上的bit 来表示。例如64MB(512Mb)的NAND flash(实际中由于存在spare area,故都大于这个值),共4096block,因此,需要12 个bit 来表示,即A[25:14],如果是128MB(1Gbit) 的528byte/page的NAND Flash,则block address 用A[26:14]表示。而page address 就是blcok address|pageaddress in block NAND Flash 的地址表示为: Block Address|Page Address inblock|halfpage pointer|Column Address 地址传送顺序是Column Address,PageAddress,Block Address。由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。 例如,对于512Mbit x8的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。

以NAND_ADDR 为例: 第1 步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上, 而halfpage pointer 即A8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读 写,而真正的A8 的值是不需程序员关心的。 第2 步就是将NAND_ADDR 右移9 位,将NAND_ADDR[16:9]传到I/O[7:0]上; 第3 步将NAND_ADDR[24:17]放到I/O 上; 第4 步需要将NAND_ADDR[25]放到I/O 上; 因此,整个地址传递过程需要4 步才能完成,即4-step addressing。 如果NAND Flash 的 容量是32MB(256Mbit)以下,那么,block adress 最高位只到bit24,因此寻址只需要3 步。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读