[CAN-bus/DeviceNet] 急求帮助,非常怪的AVR单片机can通信问题!!!

[复制链接]
 楼主| xhming 发表于 2008-7-10 19:01 | 显示全部楼层 |阅读模式
我用的ATmega16单片机,sja1000的ALE、RD、WR、CS、RST分别和单片机的PD7,PD5,PD6,PC7,PC6连接。下面是一部分程序:<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_CONTROL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//内部控制寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//命令寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//状态寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_INTERRUPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中断寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_ACR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收代码寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_AMR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收屏蔽寄存器<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_BTR0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//总线定时寄存器0&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_BTR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//总线定时寄存器1&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REG_OCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出控制寄存器<br />//以address为地址,从sja1000中读取一个字节<br />uchar&nbsp;BYTEREAD(uchar&nbsp;address)<br />{<br />&nbsp;&nbsp;uchar&nbsp;mid;<br />&nbsp;&nbsp;PORTC&=~BIT(7);&nbsp;//片选信号有效<br />&nbsp;&nbsp;PORTD|=BIT(7);&nbsp;&nbsp;//置ALE为1<br />&nbsp;&nbsp;DDRA=&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置A口为输出<br />&nbsp;&nbsp;PORTA=&nbsp;address;&nbsp;&nbsp;&nbsp;&nbsp;//A口输出地址<br />&nbsp;&nbsp;PORTD&=~BIT(7);&nbsp;&nbsp;//置ALE为0<br />&nbsp;&nbsp;DDRA=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置A口为输入<br />&nbsp;&nbsp;PORTD&=~BIT(5);&nbsp;&nbsp;//读信号有效<br />&nbsp;&nbsp;mid&nbsp;=&nbsp;PINA;<br />&nbsp;&nbsp;PORTD|=BIT(5);&nbsp;&nbsp;&nbsp;//读信号置1<br />&nbsp;&nbsp;PORTC|=BIT(7);&nbsp;&nbsp;&nbsp;//片选信号置1<br />&nbsp;&nbsp;return&nbsp;mid;<br />}<br /><br />//以address为地址,向sja1000中写一个字节<br />void&nbsp;BYTEWRITE(uchar&nbsp;address,uchar&nbsp;x)<br />{<br />&nbsp;&nbsp;uchar&nbsp;mid;<br />&nbsp;&nbsp;PORTC&=~BIT(7);&nbsp;//片选信号有效<br />&nbsp;&nbsp;PORTD|=BIT(7);&nbsp;&nbsp;//置ALE为1<br />&nbsp;&nbsp;DDRA=&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置A口为输出<br />&nbsp;&nbsp;PORTA=&nbsp;address;&nbsp;&nbsp;&nbsp;//A口输出地址<br />&nbsp;&nbsp;PORTD&=~BIT(7);&nbsp;//置ALE为0<br />&nbsp;&nbsp;PORTD&=~BIT(6);&nbsp;//写信号有效<br />&nbsp;&nbsp;PORTA&nbsp;=&nbsp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//A口输出数据<br />&nbsp;&nbsp;PORTD|=BIT(6);&nbsp;&nbsp;//写信号置1<br />&nbsp;&nbsp;PORTC|=BIT(7);&nbsp;//片选信号置1&nbsp;&nbsp;<br />}<br /><br />//can总线的复位程序<br />void&nbsp;CAN_RESET(void)<br />{<br />&nbsp;&nbsp;PORTC&=~BIT(6);&nbsp;&nbsp;//CAN总线复位<br />&nbsp;PORTC|=BIT(6);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;CLI();//禁止中断<br />&nbsp;BYTEWRITE(REG_CONTROL,0x01);<br />&nbsp;&nbsp;while(((BYTEREAD(REG_CONTROL))&0x01)==0)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTEWRITE(REG_CONTROL,0x01);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;BYTEWRITE(REG_CDR,0x48);<br />&nbsp;&nbsp;BYTEWRITE(REG_COMMAND,0x0E);<br />&nbsp;&nbsp;BYTEWRITE(REG_ACR,0x01);<br />&nbsp;&nbsp;BYTEWRITE(REG_AMR,0x00);<br />&nbsp;&nbsp;BYTEWRITE(REG_OCR,0xaa);<br />&nbsp;&nbsp;BYTEWRITE(REG_BTR0,0x01);<br />&nbsp;&nbsp;BYTEWRITE(REG_BTR1,0x1c);&nbsp;//250kbps<br />&nbsp;&nbsp;BYTEWRITE(REG_CONTROL,0x1F);<br />&nbsp;&nbsp;BYTEWRITE(REG_CONTROL,0x1E);<br />&nbsp;while(((BYTEREAD(REG_CONTROL))&0x01)==1)<br />&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC&=~0x04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTEWRITE(REG_CONTROL,0x1E);//问题出在这里<br />&nbsp;&nbsp;}<br />}<br /><br />请教各位高手,现在我的问题是当我给sja1000的控制器写值0x1E(让它回到操作模式)<br />却进入了上面程序的“问题出在这里”,而且奇怪的是sja1000的复位脚的电平是高电平,那就说明回到了操作模式,可是又怎么会进入到这个里面去呢?(我怎么觉得好象sja1000的内部控制器的值一直保持为0x01没变)请问这个问题怎么解决啊,谢谢!!<br />&nbsp;<br />&nbsp;<br />&nbsp;
 楼主| xhming 发表于 2008-7-12 18:20 | 显示全部楼层

继续

我发现是我的读函数有电问题?因为它发送读取地址到总线后就没有读取到正确的数或着就没读取到数。<br />或许是can控制器的原因,它没响应我的读要求而由于忙于其他的什么操作?<br />不知各位大侠谁知道啊&nbsp;&nbsp;帮忙看看啊&nbsp;,谢谢谢谢谢谢谢谢。。。!!<br /><br />下面是sja1000的读时序图

评论

读时序中 应该最后还有个 PORTD|=BIT(7); //置ALE为1  发表于 2015-8-19 20:22
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

14

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部