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

已经快1个月,访问外部RAM的问题仍未解决。[求助]

已经快1个月,访问外部RAM的问题仍未解决。[求助]

 摸索了快1个月,我还是不懂如何访问片外RAM地址。
  上次发贴请教时,记得strongchen 版主说过访问片外RAM与访问片内RAM方式是一样的,于是我先弄懂访问片内RAM地址的办法,编写程序访问片内RAM 0x2000-0x2005地址如下:


unsigned int *ramaddr;
unsigned int  a,b,c, x,y,z;


void main(void)
{
  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
 
  /*** End of Processor Expert internal initialization.                    ***/


  /* Write your code here */
  for(;;)
  {
    a=10;
    b=20;
    c=30;
    ramaddr=(volatile unsigned int*)(0x3000);

    *ramaddr=a;
    *ramaddr++;


    *ramaddr=b;
    *ramaddr++;


    *ramaddr=c;
    

    z=*ramaddr;
    *ramaddr--;
   
    y=*ramaddr;
    *ramaddr--;
   
    x=*ramaddr;


  }
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;){}
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/


该程序执行后x=10,y=20,z=30,成功!



接着我修改程序让它访问外部RAM:
把  ramaddr=(volatile unsigned int*)(0x3000)
改成ramaddr=(volatile unsigned int*)(0x108000)
理所当然地想这下可以访问0x10页的0x8000-0x8005了,但是执行结果失败了!


我又试着改成这个样子:
PPAGE=0x10;
ramaddr=(volatile unsigned int*)(0x8000);
单步执行时候程序跳进Start12.c中死了!


另外我还试过许许多多的其他办法,仍然失败,我实在没主意了,请各位大侠帮帮小弟我!

在摸索NE64,一头雾水
没人肯帮我吗?可能大家都觉得这是个菜鸟问题不屑于回答,可我找不到例程就是跨不过去,我不是那种不经自己思考就发问的人。求大家帮帮忙,给我几句C例程。
在摸索NE64,一头雾水
请参考AN2408中的源程序。
海纳百川  有容乃大
AN2408我看过了,是V2.1最新版本,里面没有C例程,只在文档的最末附有一段虚拟总线时序的程序。

[此贴子已经被作者于2006-3-20 15:38:49编辑过]

在摸索NE64,一头雾水
strongchen 版主,帮帮我……
在摸索NE64,一头雾水
我若这样:
ramaddr=(volatile unsigned int*)(0x108000);
ramaddr是不是就能指向片外RAM的0x108000地址了?
可是对*ramaddr赋值时,用示波器观测NE64片子的扩展地址线引脚,根本没有任何动作。
在摸索NE64,一头雾水
还有一些有关扩展总线的控制寄存器的设置必须正确。还是要仔细看一下AN2408里的设置。
海纳百川  有容乃大
所有的寄存器我用Code Warrior3.1中的处理器专家(Processor Expert)来设置的,应该不会有错。
能不能给个例程让我尽快把问题解决?我好几天没吃肉了……
在摸索NE64,一头雾水
1# 小龚0005 ramaddr=(volatile unsigned int*)(0x108000);
改成ramaddr=(volatile unsigned int*)(0x800010);试试
返回列表