打印
[AVR单片机]

继续提问,mega64外扩ram,PC口不可控问题

[复制链接]
2035|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好,我用mega64扩展外部存储器,刚开始寄存器设置如下所示:
void main(void)
{

        INT_init();                //中断初始化

        MCUCR = 0x80;                //bit7设为‘1’,使能外部存储器接口

        XMCRA = 0x00;

        XMCRB = 0x05;       //释放PC7-PC3,作为通用I/O口引脚使用

        DDRC = 0xff;                 // PC7-PC3用于输出,(不影响PC0-PC2地址线)
   
        PORTC = 0x00;                 // PC7-PC3输出0,(不影响PC0-PC2地址线)

我用AVR Studio连接Jtag仿真器,单步仿真,不管后面指针指到哪,我的PC0口输出永远是1,万年不变,求大家帮我解释一下这个是怎么回事,多谢!

相关帖子

沙发
dqyubsh| | 2013-3-20 17:39 | 只看该作者
看着迷糊。你怎么接的SRAM,上图。

使用特权

评论回复
板凳
airwill| | 2013-3-20 18:58 | 只看该作者
MCUCR  • Bit 7 – SRE: 外部 SRAM/XMEM 使能
SRE为"1“时外部存储器接口使能。 ,引脚AD7:0,A15:8,ALE,WR和RD工作于第二功能,且自动按照要求配置端口方向寄存器。SRE清零将使外部 SRAM 无效,相关端口可以当作普通 I/O 口使用。
可见 SRAM 操作已经使能.
不管后面指针指到哪, 不知道是指到了哪?  PC0 是 A8 线, 你的指针得改变 A8 的信号.
另外, "PC0口输出永远是1,万年不变" 你是怎么测试的? 什么手段, 示波器触发设置对了吗?

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6
地板
diegolei|  楼主 | 2013-3-21 09:56 | 只看该作者
本帖最后由 diegolei 于 2013-3-21 10:07 编辑
airwill 发表于 2013-3-20 18:58
MCUCR  • Bit 7 – SRE: 外部 SRAM/XMEM 使能
SRE为"1“时外部存储器接口使能。 ,引脚AD7:0,A15:8,ALE ...

是这样的,我把外部存储器的地址设为0x8000开始,我屏蔽了A15-A11这几根地址线,让这几根地址线全都输出0,这样我读写单片机的外部地址为0x8000~0x80FF这段地址的时候,就相当于芯片的0x0000~0x00FF,可是当我开始从0x8000开始往外部ram中写数据时,用JTAG仿真单步运行,A8线始终为1,比如地址0x80xx的情况下,A8肯定是应该输出0的啊,相反PA口的数据和地址在单步运行的时候,通过示波器测试,很准确,PC口的输出情况和AVR Studio中显示的PC口输出情况不相同,真是郁闷,不能理解是什么情况,会不会PC口和别的功能有冲突呢,但是说明书上说PC口只有扩展外部ram这唯一的第二功能啊

使用特权

评论回复
5
diegolei|  楼主 | 2013-3-21 10:06 | 只看该作者
dqyubsh 发表于 2013-3-20 17:39
看着迷糊。你怎么接的SRAM,上图。


这是芯片的原理图,我和我的mega64开发板连接起来的,低位地址和数据复用连接PA口,高位地址连PC口,还有ALE,WR,RD都没错,时序我也看了没问题,关键是单片机的PC0口不听话,我比如要读写0x8000~0x80FF(PC7~PC3被释放输出0,相当于芯片的0x0000~0x00FF),按说PC0口应该输出0啊,可他一直为1,PA口倒是 数据和地址输出的非常正确。非常不解

使用特权

评论回复
6
john_lee| | 2013-3-21 11:27 | 只看该作者
换个mega64看看。

使用特权

评论回复
7
dqyubsh| | 2013-3-21 11:56 | 只看该作者
本帖最后由 dqyubsh 于 2013-3-21 12:00 编辑

你继续上图,单片机和地址译码部分。你说“低位地址和数据复用连接PA口”,我想看看是怎样复用的?
还有,地址高位和低位应该同时输出,不是你这样分别写的。你说下上面这个外设芯片是什么型号,我查查它的ALE是怎样用的。

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4
8
qin552011373| | 2013-3-21 21:54 | 只看该作者
外扩ram还真没接触过

使用特权

评论回复
9
diegolei|  楼主 | 2013-3-22 11:00 | 只看该作者
dqyubsh 发表于 2013-3-21 11:56
你继续上图,单片机和地址译码部分。你说“低位地址和数据复用连接PA口”,我想看看是怎样复用的?
还有, ...

您说的是时序吧?这款芯片叫VPC3+C 是PROFIBUS现场总线用来开发DP从站的,我发这芯片的时序图估计您就看明白了。

这里的AB10..0就是高位地址,AB10-AB8全部输出0,作为该芯片的片选信号,AB2~AB0这三位为高位地址,接单片机的PC口PC2-PC0,DB7-DB0就是数据和低位地址复用,这款芯片自带地址锁存,不用外接锁存。
麻烦高人帮我指点一下,我这到底是什么情况,跪谢了

使用特权

评论回复
10
dqyubsh| | 2013-3-22 14:43 | 只看该作者
粗略看了一下,硬件上问题不大。你查一下你的原理图,28脚右边要和其它线一起接地,我看着貌似没有打交叉点。

其它就看软件了,你写某个地址时应该用类似下列的语句:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;

一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;

或者定义宏:
#define CBYTE ((unsigned char volatile code  *) 0)
#define DBYTE ((unsigned char volatile data  *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)

#define CWORD ((unsigned int volatile code  *) 0)
#define DWORD ((unsigned int volatile data  *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)

调用方法:
char ch1 = XBYTE[ADDR1];
char ch2;
XBYTE[ADDR2] = ch2;

使用特权

评论回复
11
diegolei|  楼主 | 2013-3-22 15:36 | 只看该作者
dqyubsh 发表于 2013-3-22 14:43
粗略看了一下,硬件上问题不大。你查一下你的原理图,28脚右边要和其它线一起接地,我看着貌似没有打交叉点 ...

多谢了,硬件我挨个管脚都检查了一遍,都符合说明书上说的。不管什么方法就是写不进去,我用的还是这款芯片的开发包,只不过修改了一些比如芯片地址之类的参数,还加了一些单片机初始化的程序,但是死活都写不进去,我准备下周去找芯片代理商找点技术支持了,多谢帮忙了!

使用特权

评论回复
受到警告 12
yhhsky| | 2013-3-30 18:56 | 只看该作者

使用特权

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

本版积分规则

9

主题

43

帖子

0

粉丝