longfeixue 发表于 2009-10-19 11:02:21

请各位高手给我解释一下外扩RAM读写存在的问题

我用AVR128单片机外扩了一个32K的STC62WV256 RAM芯片,地址译码电路图我粘不上来,就是把它设计成外部32K的低4K转到了高端地址的0x8000到0x8fff地址,外部RAM地址0x1100开始,加上内部4K的RAM,系统总共有36K的连续RAM空间。但是我读写外部RAM时发现存在问题,就是往指定地址空间只写一遍的数据总是在另外的地址范围被重写。我一直查不出问题所在。下面是我实验的一段程序的例子,我先定义了一个直接对地址空间读写的宏
#define ExtSramPortCeShi(A) (*(volatile unsigned char *)(0x1100+A))
   
    uint map;
    for(map=0;map<160*10;map++)
      ExtSramPortCeShi(map)=0x22;
    for(map=160*10;map<160*21;map++)
      ExtSramPortCeShi(map)=0x23;   
    for(map=160*21;map<160*32;map++)
      ExtSramPortCeShi(map)=0x24;
    for(map=160*32;map<160*43;map++)
      ExtSramPortCeShi(map)=0x25;   
运行程序后在存储器窗口查看外部RAM空间,发现结果如下:

从地址0x1100到0x2be0正常写完,但从0x3100地址开始重写一遍,并且中间有间断从0x4000地址直接跳到0x8000地址才继续写完。又从0x9100开始又重写了一遍,中间无间断,到0xabe0地址正常结束。又从0xb100地址又重写了一遍,到0xc000地址结束,这一遍没有写完。

请问有经验的能不能帮我查找一下其中的原因,谢谢!

longfeixue 发表于 2009-10-19 11:23:35

我外部XRAM接口是这样设置的,

    //MCUCR=0x80;       //外部存储器接口使能
    MCUCR=0Xc0;
    XMCRA=0x02;       //读写插入两个等待周期,输出新地址前再插入一个等待周期
    //XMCRA=0x00;       //读写插入两个等待周期,输出新地址前再插入一个等待周期
    XMCRB=0x80;       //外部存储器总线保持功能使能

machao 发表于 2009-10-19 14:36:57

先要看硬件电路。采用屏幕拷贝,然后贴图。

longfeixue 发表于 2009-10-19 15:13:09

点击此处打开 ourdev_493402.jpg(文件大小:1.60M,只有400K以内的图片才能直接显示) (原文件名:译码电路.jpg)

longfeixue 发表于 2009-10-19 15:29:09

http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_493411.JPG
(原文件名:电路图.JPG)

longfeixue 发表于 2009-10-19 15:34:58

马老师,图贴上来了,上边上传那个图片太大了不能直接打开,又从新传了一个小的。右下角那一本分是看门狗电路的一部分,与存储器的无关。

longfeixue 发表于 2009-10-20 10:41:12

有没有能给指导一下的啊?是硬件电路有问题,还是因为没有采用74AHC系列的锁存器?

machao 发表于 2009-10-20 19:26:10

原理图我没发现问题,同我M128书上的一样,但好象感觉不完整,请:

1。573的A3-A7应该连接在STC62WV256上吧
2。逐一检查硬件每根连接是否正确。
3。36K的最高地址为0x8fff,所以你只要从0X1100测试检查到0X8FFF就可以了
4。写入数据前,先写段代码,把0X1100-0X8FFF清为0,然后再写入测试的数据。
5。只要查到0X8FFF以前正确就行了。

longfeixue 发表于 2009-10-21 09:06:47

很感谢马老师的指导!!573的8根地址线都连上了,已经标了A0---A7的8个网络标号。标<<A0、<<A1、<<A2的三个连接符号是在另一个模块复用的信号。我会按你说的方法来验证的。

longfeixue 发表于 2009-10-21 12:41:31

谢谢马老师,我的问题解决了,我按你说的先仔细检查了每一根连线,问题还真是出在硬件连线上,原来A13和A15这两根线有一些虚焊,所以才总出现地址重写的问题。我原来是在外扩存储器模块的基础上调试照相机模块,通过单片机控制一个照相机拍照然后接收并存储图片数据。原先只实验了拍摄小尺寸图片,并且是定义了一个数组接收,没有直接用指针操作地址,在数据量小时并没有发现存储器读写有问题,所以我就一直以为存储器部分电路是没问题的。到后来我拍了一个大尺寸的图片试试,就发现有问题了,中间或前边接收的几包数据存储的正常位置总是被后面的数据覆盖,原来我以为是照相机程序编写有问题,就一直在这上面查找修改,但改来改去还是那个样。后来我定义指针操作地址,发现数据不但有被覆盖的而且后边地址空间总是有规律地被重写的,这时才意识到是存储器有问题。于是就专门测试存储器,但也没就想到就是硬件连线的问题,就没有一根一根仔细测完。这种硬件基础有问题,而没有查出来,只在软件层面上的修改调试最让人崩溃了。明明程序没问题就是结果不对,让人去怀疑不肯能的程序问题。总结下来还是检查错误的方法步骤不对,经验不够;再就是缺乏耐心去仔仔细细的查,太迷信程序了。
页: [1]
查看完整版本: 请各位高手给我解释一下外扩RAM读写存在的问题