s3c2440的Memory Controller与外设地址线错位连接分析

扶醉桌前 提交于 2019-12-01 06:56:54

 在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开始才变化。

 

文章引用自各路高手的博文,在此一并感谢,谢谢诸位的知识共享。
该博文不是我的原创,我只是搬运工!
如果发布内容有侵权行为,请与我联系,我核实以后将删除所有侵权内容,谢谢!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!