首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【求助】MC9S12DP512扩展外部RAM能写不能读

【求助】MC9S12DP512扩展外部RAM能写不能读

建工程时设的memory model是Banked。

.prm文件添加两行:
    ……
    Addr_CPLD = READ_WRITE 0x008000 TO 0x0080C0;
    ……
    EX_CPLD INTO Addr_CPLD;
    ……
compiler for HC12设置中添加了:-CpPPAGE=RUNTIME

主程序:
#pragma DATA_SEG __PPAGE_SEG EX_CPLD
unsigned int test[8];

#pragma DATA_SEG DEFAULT
unsigned int *p;
unsigned int q;

void MMC_Init(void)
{
  MODE = 0xA8;          /* Normal expanded mode,IVIS=1 */
  EBICTL = 0x01;        /* the E clock behaves as a bus control signal */
  MISC = 0x0f;          /* Stretch=1 cycle */
  PEAR = 0x04;          /* NECLK=0,RDWE=1 */
}

void main(void) {
  MMC_Init();
  EnableInterrupts;
  for(;;)
  {
     int i;
     _FEED_COP(); /* feeds the dog */
     test[0] = 0xA5;
      p = &test;
      q = *p;
    for(i = 0; i < 1000; i++){}    /*延时*/

  } /* loop forever */
  /* please make sure that you never leave main */
}

我用示波器看读写时序,为什么只看到有写时序的波形,没有读时序的波形呢?
自己顶起啊
这样试试:
unsigned int __far *p;

可以单步走一下,看看读数时PPAGE寄存器是否改变。
海纳百川  有容乃大
本帖最后由 Hunter.Cheung 于 2010-5-10 20:23 编辑
这样试试:
unsigned int __far *p;

可以单步走一下,看看读数时PPAGE寄存器是否改变。
strongchen 发表于 2010-5-10 11:23
感谢版主的指点。按照您的办法我试了一下,发现PPAGE始终是0x20不变化,仍然没有读周期的波形。然后我猜想会不会是memory model有问题,就改成了Large,发现PPAGE可变了,在0和0x20两个值之间切换,读周期波形也出来了,而且compiler for HC12里面也不用设置-CpPPAGE=RUNTIME了。这是为什么呢?

另外经试验发现,在Large模式下,在CW4.5中,变量声明为“__far ”有写周期,否则没有;而在CW5.0中“__far ”可有可无,好奇怪。
你把memory mode改为Large后,编译器自动把所有的地址变量都当作__far地址来处理了。
海纳百川  有容乃大
哦,明白了,多谢版主!不过我在Banked模式下始终没有测到读周期,很困惑呀。好在现在Large模式下可以,就这么用了,呵呵。
BANKED MODE和LARGE MODE的区别在于,在LARGE MODE下,所有的地址都自动采用__far类型,即包含了PPAGE寄存器的处理;而在BANKED MODE下,地址是否采用__far类型,要根据用户的定义和声明来判断。
海纳百川  有容乃大
返回列表