Nor flash 以及nandflash原理总结

 一、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
步。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值