zhaihua
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:917回复:4

外部寄存器的问题,送分啦!

楼主#
更多 发布于:2003-12-08 23:18
刚才怎么发帖没成功啊,只好再发一遍了.
我在EZUSB外部扩充了32K的SRAM,另外还有一个扩频芯片的80多个寄存器需要赋值,共7位地址线,我连接到A6-A0,当作外部RAM.我想建一个像EZREGS.H的文件,像USB内部寄存器一样赋值,可是老板说通过地址线扩充的寄存器不能像内部寄存器一样使用,我现在很迷惑,不知道用C51程序怎么向这些寄存器里写值?只好求救于各位大侠了.
不知我说明白没有 :cool:
谢谢,我会给你们送分的,呵呵
没钱的日子真难过! 大哥,拉兄弟一把.
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-09 14:45
既然是通过地址线扩充的寄存器,那你还是可以把它看成是一个存储器,只要分配好SRAM和扩频器的地址空间是他们不重叠就可以了,对寄存器的访问就跟对存储器的访问一样,譬如你给寄存器分配的地址为:ff00H-ff7fH。那么可以定义:unsigned int reg;
初始化:reg=ff00H,如果要访问其他的寄存器可以加个偏移量unsigned char bias。
unsigned char data;
data=*((unsigned char xdata *) (reg+bias));
zhaihua
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-09 19:36
给您10分略表心意!呵呵:)
通过您的指点知道了大概,但是还不太明白,我通过A15对RAM和扩频芯片进行选择,把32KRAM地址设为0x0000-0x7FFF,扩频芯片地址为0x8000-0x8054,我按您所说可以开是初始化
#define reg0 _at_  0x8000
#define reg1 _at_  0x8001
.....
再定义unsigned int reg0,reg1....;这样就可以给扩频芯片寄存器赋值了,对吗?
对SRAM的访问我用C51编程并没有涉及到地址啊,是不是有编译器自动分配地址?还有在EZUSB中片内自带98KRAM,这样的话岂不是外部SRAM的低8K没有用到,这不是浪费吗?
对于寄存器的使用和访问我实在是头疼!!
 :mad:
谢谢!!
没钱的日子真难过! 大哥,拉兄弟一把.
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-09 20:20
我没有怎么明白你想表达的意思,请详细的描述一下!
1。引用:
       #define reg0 _at_  0x8000
       #define reg1 _at_  0x8001
......
再定义unsigned int reg0,reg1....;
   我不明白你为什么还要预定义reg0,reg1.只要定义:unsigned int reg0,reg1就可以了.在程序的开始部分赋值为reg0=0x8000,具体要用到时,在加个偏移量unsigned char bias这样不是很好吗?不仅简单还节省存储单元。
     2。对于存储器通常我们分为外部存储器和内部存储器。你说的EZUSB片内自带的98KRAM就是内部存储器,32K的RAM就属于外部存储器。对于内部存储器通常我们可以让系统自动的为我们安排,当然我们也可以自己安排(如果采用C51编程的话,这种办法很麻烦,也没有必要,如果时A51编程的话,只能时自己安排了)。可能会有一种情况就是内部存储器的地址和外部存储器的地址会重叠,没有关系。因为对于内部存储器和外部存储器的访问是用不通的指令来实现的,因此是可以被区分开来!所以我不明白你说的低8K没有用到是什么意思!请解释一下!
zhaihua
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-09 20:54
首先谢谢!
1.关于内部外部寄存器的问题是我没表达清楚,刚才写错了,内部是8KRAM,我是想问我用C51写的程序所放的位置,是不是有编译器自动用不同的命令来分配是放在内部寄存器还是外部寄存器?
2.关于向向寄存器赋值是我没理解对您的意思,我以为加偏移量的是仅对32KRAM中的寄存器调用时使用.
还是用例子好理解,假设我要向扩频芯片中0x8001寄存器中写值ffH,是不是可以这样
unsigned int reg;
reg = 0x8000;
unsigned char bias;
unsigned char data;
bias = 1;  //因为这里是向0x8001写值
data = 0xff;
*((unsigned char xdata *) (reg+bias)) = data;
(这里bias,data类型是不是应该为int?)
谢谢!!!
没钱的日子真难过! 大哥,拉兄弟一把.
游客

返回顶部