在s3c2440数据手册中如图所示:
外设Flash数据位宽为8bit时,(Memory Cotroller 的地址线 )A0——A0(外设Flash 的A0);
外设Flash数据位宽为16bit时,(Memory Cotroller 的地址线 )A1——A0(外设Flash 的A0);
外设Flash数据位宽为32bit时,(Memory Cotroller 的地址线 )A2——A0(外设Flash 的A0);
原因:
CPU的地址线(LADDR0~LADDR20)对应的最小数据单元是字节,即8bit;
在实际应用中,所用到的外设Flash 通常数据位宽有8bit、16bit、32bit,CPU要按照8bit的数据位宽准确获取数据,肯定就是CPU和Flash 存在中间层解决了这个问题,就是Memory Controller 。
根据外设Flash的数据位宽,通过硬件处理,按照每个地址读取8bit的数据处理方式。如数据位宽16bit的NOR Flash,如图所示:
一、从Nor flash读取数据
1、每次获取1byte数据
a、当CPU要获取地址 0 上的数据时,Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,返回数据线(LDATA0~LDATA15)上的第一个数据给CPU的Memery Controller,Memery Controller选择其中的低8位给CPU。
b、当CPU要获取地址 1 上的数据时,Memery Controller发出地址0b00000000000000000001,NOR Flash 收到地址0b00000000000000000000,返回数据线(LDATA0~LDATA15)上的第一个数据给CPU的Memery Controller,Memery Controller选择其中的高8位给CPU。
2、每次获取2byte数据
当CPU要获取地址0,1上的数据时,Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,返回数据线(LDATA0~LDATA15)上的第一个数据给CPU的Memery Controller,Memery Controller选择这个数据给CPU。
3、每次获取4byte数据
当CPU要获取地址0 ,1 ,2 ,3上的数据时:
a、Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,返回数据线(LDATA0~LDATA15)上的第一个数据给CPU的Memery Controller,Memery Controller读入这个数据。
b、Memery Controller发出地址0b00000000000000000010,NOR Flash 收到地址0b00000000000000000001,返回数据线(LDATA0~LDATA15)上的第二个数据给CPU的Memery Controller,Memery Controller读入这个数据,并把两个16bit数据组合成一个32bit的数据返回给CPU。
二、向NOR Flash写数据
1、每次写1byte数据
a、当CPU要向地址 0 上写数据时,Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,CPU将8bit的数据传给Memery Controller,Memery Controller将数据发送给NOR Flash数据线的低8位(LDATA0~LDATA7)。
b、当CPU要向地址 1 上写数据时,Memery Controller发出地址0b00000000000000000001,NOR Flash 收到地址0b00000000000000000000,CPU将8bit的数据传给Memery Controller,Memery Controller将数据发送给NOR Flash数据线的高8位(LDATA8~LDATA15)。
2、每次写2byte数据
当CPU要向地址 0,1上写数据时,Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,CPU将16bit的数据传给Memery Controller,Memery Controller将数据发送给NOR Flash数据线(LDATA0~LDATA15)。
2、每次写4byte数据
当CPU要向地址0 ,1 ,2 ,3上写数据时:
a、Memery Controller发出地址0b00000000000000000000,NOR Flash 收到地址0b00000000000000000000,CPU将32bit的数据传给Memery Controller,Memery Controller将数据低16bit发送给NOR Flash数据线(LDATA0~LDATA15)。
b、Memery Controller发出地址0b00000000000000000010,NOR Flash 收到地址0b00000000000000000001,Memery Controller将数据高16bit发送给NOR Flash数据线(LDATA0~LDATA15)。
总结:
外设数据位宽是8bit时,CPU的LADDR0——LADDRx与外设的LDATA0——LDATAx直接相连;
外设数据位宽是16bit时,CPU的LADDR1——LADDRx与外设的LDATA0——LDATAx直接相连,不管CPU的LADDR0是0还是1,外设得到的地址都是LADDR1——LADDRx,对应同一个16bit数据,Memery Controller选择或者组合这个数据;
外设数据位宽是32bit时,CPU的LADDR2——LADDRx与外设的LDATA0——LDATAx直接相连,当CPU的LADDR0、LADDR0是 00、01、10、11时,外设得到的地址都是LADDR2——LADDRx,对应32bit数据,Memery Controller选择或者组合这个数据。
FLASH一般是8位或16位,当它接到32位的ARM上时,地址位就会错位。
ARM的A0对应8位,ARM的A1对应16位,ARM的A2对应32位,如果FLASH是32位,那么FLASH的A0接ARM的A2
32位的FLASH,FLASH的A0要接ARM的A2,因为32位地址表示4个字节,每次要跳4个字节的话,那么就是从A2开始才变化,A1 A0不变化
16位的FLASH,FLASH的A0要接ARM的A1,因为16位地址表示2个字节,每次要跳2个字节的话,那么就是从A1开始才变化,A0不变化
8位的FLASH,FLASH的A0要接ARM的A0,因为8位地址表示1个字节,每次要跳1个字节的话,那么就是从A0开始才变化。
文章引用自各路高手的博文,在此一并感谢,谢谢诸位的知识共享。
该博文不是我的原创,我只是搬运工!
如果发布内容有侵权行为,请与我联系,我核实以后将删除所有侵权内容,谢谢!