分类: LINUX
2016-05-09 12:09:17
原文地址:NOR Flash 作者:leonwang202
1.NOR Flash简介
NOR Flash 有“完备的”地址线和数据线。也就是说,
1) 地址线的条数决定了NOR Flash的大小
比如23条地址线,NOR Flash大小为 2^23 bit = 64M bit = 8M Byte
2) 数据线的条数决定了NOR Flash的“存取粒度”
比如flash大小为16bit,16条地址线,nor flash存取粒度为 16 bit,
即对于Flash来说1个地址对应着16bit,那么他只需要1条地址线就OK了。
3) 片内可执行(Execute in place,XIP)
和内存条一样,NOR Flash有独立的地址线和数据线,对于CPU来说,它和内存条没什么两样。NOR和SRAM都可以连续空间寻址,则片内可执行(指令)。
2. NOR Flash数据线
若NOR Flash的数据线多于8条,一般有管脚BYTE#来配置数据线宽度,可以选16mode,8mode
描述一块NOR Flash时:
x16 device / x16 mode,表示片子有16条地址线,经过配置,我们用全部16条。
x16 device / x8 mode,表示片子有16条地址线,经过配置,我们只用其中8条。
Flash端通过管脚BYTE# 配置地址线
CPU端通过配置寄存器,来标识所连的NOR Flash用多少条地址线,也就是所谓的 8-bit/ 16-bit Flash
(例如对于PowerPC,通过OR寄存器来标示8-bit or 16-bit Flash)
3. NOR Flash地址线
上面讲了数据线,现在该讲地址线。
对于8bit/16bit NOR Flash,地址线的接法是不一样的。
CPU的一个地址能对应多少bit数据,是由CPU硬件总线接口上地址线的条数来决定的。
但是,站在软件的角度来考虑,一个地址对应的位数是由代码确定的(char,int,long)。
比如,CPU的Local Bus上有32条地址线,我代码里把地址看成char来读数据。CPU虽然一下子拿到了32bit数据,但是只取最低的8bit,因为代码中只需要8bit(char)
以下例子中,我们都假设CPU按char来读数据的。
3.1 8-bit flash地址线接法
CPU一个地址对应8bit数据,8-bit flash的一个地址也是8bit数据,所以他们的地址线一一对应
以下是从网上找的图,8-bit flash 地址线的接法。
3.2 16-bit flash地址线接法
CPU的一个地址对应8bit数据,16-bit flash的一个地址是16bit数据,那接法就有讲究了。
CPU端的最低地址线 A0 要当空,16-bit flash的地址线要错位接,象下面一样。
实际上,CPU的地址 16-bit Flash的地址
0x0,0x1(对应的是16bit数据), 0x0 (这个地址对应有16bit数据)
0x2,0x3, 0x1
0x3,0x4, 0x2
硬件上如何实现上述地址对应呢,错位接线发挥作用了。
CPU按照char来 读取 0x0,0x1,0x2,0x3(均为CPU的地址)上的数据,则大致有如下过程。
1.CPU把0x0放到地址总线上,Flash的地址线上肯定也是全0
2.Flash把地址0x0(Flash地址)上的16bit数据放到数据线上
3.CPU取地址线的低字节数据 [D0-D7],这就0x0(CPU地址)上的数据
4.CPU把0x1放到地址总线上,Flash的地址线上还是全0(注意CPU端A0线档空了)
5.Flash把地址0x0(Flash地址)上的16bit数据放到数据线上
6.CPU取地址线的低字节数据 [D8-D15],这就0x1(CPU地址)上的数据
7.CPU把0x2放到地址总线上,Flash的地址线上是0x1 (注意CPU端A0线档空了)
8.Flash把地址0x1(Flash地址)上的16bit数据放到数据线上
9.CPU取地址线的低字节数据 [D0-D7],这就0x2(CPU地址)上的数据
10.CPU把0x3放到地址总线上,Flash的地址线上是0x1 (注意CPU端A0线档空了)
11.Flash把地址0x1(Flash地址)上的16bit数据放到数据线上
12.CPU取地址线的低字节数据 [D8-D15],这就0x3(CPU地址)上的数据
4. NOR Flash的操作
内存条可以直接读,写。
NOR Flash也可以直接读,但写就比较麻烦了。NOR Flash在Program前一定要Erase。因为Program只能把1->0,只能通过Erase把 0->1。
NOR Flash接受特殊的命令,来执行erase,program,lock,unlock等操作。
这些命令,是通过向特殊的地址写特殊的数据来实现的,有些可能需要多个cycle周期
对于Numonyx的NOR Flash,有如下命令: