打印
[ZLG-ARM]

关于外部RAM的访问地址问题,请教各位!

[复制链接]
2977|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sembedfish|  楼主 | 2007-1-5 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 我看了LPC2210和LPC2214的使用手册,在LPC2210的手册上,以32位宽访问32位的存储器,其地址总线为A[31:2];在LPC2214的手册上,以32位宽访问32位的存储器,其地址总线为A[31:0]. 请问是哪个数据手册编辑错误还是这两个器件有什么不一致.
2. 如果以16位数据宽度和外部RAM相连, 其对外部RAM寻址的最低位地址是否应该是为0?那么如果比如外部RAM在BANK1,基地址为0x81000000, 则地址0x81000001是访问什么? 怎么处理?

相关帖子

沙发
luky133| | 2007-1-5 15:00 | 只看该作者

我也刚搞明白的

应该是CPU的A[2:31]与片外存储器的A[0:31]连接.
如果是16位总线的话是CPU的A[1:15]与片外存储器的A[0:15]连接.
这个是根据指令来设定的,指令是按照字节来访问的,16位的话是两个字节一起访问.所以不用接A0.以此类推.
BANK0和BANK1的访问是由CS0和CS1来控制的.

使用特权

评论回复
板凳
zlgarm| | 2007-1-5 15:04 | 只看该作者

re:

   外部存储器地址使用哪些地址线往往还与具体的外部存储器相关.
  如果外部RAM为16位,一般最低位地址为0,以楼上的例子,如果有用读半字指令,读取0x81000000时,那么读取的是0x81000000和0x81000001两个字节.如果是用读取字节指令,那么只可以单独读取0x81000000和0x81000001了.LPC2200使用BLS0和BSL1引脚来告诉存储器,读取的是高字节还是低字节.

使用特权

评论回复
地板
luky133| | 2007-1-5 15:27 | 只看该作者

周工写的我不明白了,是我的理解有错吗?

我以为外部存储器的接法是由总线宽度决定的.
至于对0X81000000的访问可以直接把CS1拉低,再可根据BLS0和BLS1来控制字节访问
我这样理解对吗?

使用特权

评论回复
5
sembedfish|  楼主 | 2007-1-5 15:46 | 只看该作者

谢谢zlgarm的回答, 我用的就是EasyRam2200.

谢谢楼上的回答.

当用16位数据总线访问外部RAM时, 其访问地址是不是严格按半字对齐的.
那么, 如果我这样定义
(*((volatile unsigned short*)ETHER_BASE_ADDR+offset))
offset为偏移地址, 取值为0-1f, 好像是可以访问以基地址ETHER_BASE_ADDR后的任意地址的内容. 这怎么来解释? 
硬件采用的是EasyARM2200, ARM与RT8019的连接, RTL8019的是8位数据总线宽度, ARM是16位数据总线宽度.

使用特权

评论回复
6
db10| | 2007-1-6 22:51 | 只看该作者

呵呵

 其实不管是接成16位,还是8位的,软件上都是可以直接访问一个字节和2个字节的,例如定义一个指针,指针指向2个字节的数据,那么就可以直接读出2个字节,如果指针是指向单自己,那就读出一个字节。
 当然对于硬件上,如果接成8位的数据总线,那地址0是要接上的,这样如果读2个字节,那硬件自动完成读两次。如果接成16位数据总线方式,那地址0是不要接的,如果读两个2字节的话,硬件自动只读一次就可以了,如果这种情况下要读1个字节的,程序编译后,硬件虽然也读两2个字节,但是只取其中一个有用的。 其实这个工程是硬件出来的,更本不要关心。想读一个字节,2个字节,4个字节都是程序操作就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

0

粉丝