[CAN-bus/DeviceNet] 请教SJA1000不能发送的问题!急!

[复制链接]
4461|3
 楼主| jackliu999 发表于 2007-9-11 20:49 | 显示全部楼层 |阅读模式
调试CAN通讯&nbsp;SJA1000+PCA82C250<br />SJA1000工作在BasicCAN模式下,可进入软件复位,读写寄存器正常,退出复位后,循环发送一帧数据,TX0没有输出信号(正常输出模式下),查询寄存器的值,发现中断寄存器IR出现0xF0值。电路按照器件文档设计,检查没有问题。<br />软件如下:<br /><br />#include&nbsp;&ltabsacc.h&gt<br />#include&nbsp;&ltreg51.h&gt<br /><br />#define&nbsp;&nbsp;CAN_CR&nbsp;&nbsp;&nbsp;XBYTE[0x4000]<br />#define&nbsp;&nbsp;CAN_CMR&nbsp;&nbsp;XBYTE[0X4001]<br />#define&nbsp;&nbsp;CAN_SR&nbsp;&nbsp;&nbsp;XBYTE[0X4002]<br /><br />#define&nbsp;&nbsp;CAN_ACR&nbsp;&nbsp;XBYTE[0X4004]<br />#define&nbsp;&nbsp;CAN_AMR&nbsp;&nbsp;XBYTE[0X4005]<br />#define&nbsp;&nbsp;CAN_BTR0&nbsp;&nbsp;XBYTE[0X4006]<br />#define&nbsp;&nbsp;CAN_BTR1&nbsp;&nbsp;XBYTE[0X4007]<br />#define&nbsp;&nbsp;CAN_OCR&nbsp;&nbsp;XBYTE[0X4008]<br /><br />#define&nbsp;&nbsp;CAN_TEST&nbsp;&nbsp;XBYTE[0X4009]<br />#define&nbsp;&nbsp;CAN_ID1&nbsp;&nbsp;XBYTE[0X400A]<br />#define&nbsp;&nbsp;CAN_ID2&nbsp;&nbsp;XBYTE[0X400B]<br />#define&nbsp;&nbsp;CAN_SENDBYTE1&nbsp;&nbsp;XBYTE[0X400C]<br />#define&nbsp;&nbsp;CAN_SENDBYTE2&nbsp;&nbsp;XBYTE[0X400D]<br />#define&nbsp;&nbsp;CAN_SENDBYTE3&nbsp;&nbsp;XBYTE[0X400E]<br />#define&nbsp;&nbsp;CAN_SENDBYTE4&nbsp;&nbsp;XBYTE[0X400F]<br />#define&nbsp;&nbsp;CAN_SENDBYTE5&nbsp;&nbsp;XBYTE[0X4010]<br />#define&nbsp;&nbsp;CAN_SENDBYTE6&nbsp;&nbsp;XBYTE[0X4011]<br />#define&nbsp;&nbsp;CAN_SENDBYTE7&nbsp;&nbsp;XBYTE[0X4012]<br />#define&nbsp;&nbsp;CAN_SENDBYTE8&nbsp;&nbsp;XBYTE[0X4013]<br /><br />#define&nbsp;&nbsp;CAN_CDR&nbsp;&nbsp;XBYTE[0X401F]<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;&nbsp;WATCHDOG&nbsp;&nbsp;=&nbsp;P1&nbsp;^&nbsp;0;<br /><br />unsigned&nbsp;char&nbsp;temp,i;<br /><br />void&nbsp;delay()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;x1,x2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(x1=0;x1&lt0xff;x1++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(x2=0;x2&lt0x5f;x2++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />/////////////////////////////////////////////<br />void&nbsp;CAN_INIT(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;delay();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;CAN_CR&nbsp;|=&nbsp;0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//enter&nbsp;reset&nbsp;mode<br />&nbsp;&nbsp;&nbsp;temp=CAN_CR;<br />&nbsp;&nbsp;&nbsp;delay();<br />&nbsp;&nbsp;&nbsp;if((temp&0x01)==0x01)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_CDR&nbsp;=&nbsp;0X40;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;basic&nbsp;can&nbsp;模式,CBP置位,外部时钟输出,2分频<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CAN_ACR&nbsp;=&nbsp;0X40;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收代码寄存器&nbsp;0100&nbsp;0000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_AMR&nbsp;=&nbsp;0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//验收屏蔽寄存器&nbsp;0000&nbsp;0000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_BTR0=&nbsp;0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//tscl=2&nbsp;x&nbsp;tclk,tsjw=&nbsp;tscl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_BTR1=&nbsp;0X18;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sam=0&nbsp;单次采样,tTseg1=9&nbsp;x&nbsp;tscl,tTseg2=2&nbsp;x&nbsp;tscl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//12MHz&nbsp;/2&nbsp;/12&nbsp;=&nbsp;500KHz&nbsp;波特率<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_OCR&nbsp;=&nbsp;0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//上拉状态,时钟输出模式<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;CAN_CR&nbsp;&=&nbsp;0XFE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//quit&nbsp;reset&nbsp;mode&nbsp;<br />&nbsp;&nbsp;&nbsp;delay();<br />}<br />//////////////////////////////////////<br /><br />void&nbsp;InitCpu(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IE&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*中断允许寄存器*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*中断优先次序寄存器*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCON&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*计时控制寄存器*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;=&nbsp;0x11;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*定时器工作模式控制寄存器&nbsp;&nbsp;计时器1和计时器0分为两个独立的8位计时器TH0&nbsp;TL0*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;TH20ms;<br />&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;TL0&nbsp;=&nbsp;TL20ms;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1&nbsp;=&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;<br />}<br /><br />///////////////////////////////////////////////////////<br />void&nbsp;SetCpu(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ET0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;允许计时器0中断&nbsp;&nbsp;IE.1*/<br />&nbsp;&nbsp;&nbsp;&nbsp;ET1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;允许计时器1中断&nbsp;&nbsp;IE.3*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;定时器0启动控制位&nbsp;&nbsp;TCON.4*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TR1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;定时器1启动控制位&nbsp;&nbsp;TCON.6*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;EX0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;允许外部INT0中断&nbsp;IE.0&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;IT0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;下降沿产生外部中断&nbsp;TCON.0*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;EX1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;允许外部INT1中断&nbsp;&nbsp;IE.2*/&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IT1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;下降沿产生外部中断&nbsp;TCON.2*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;INT0&nbsp;HIGH&nbsp;LEVEL&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;0;&nbsp;<br />}<br />///////////////////////////////////////////////////////////<br /><br />main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitCpu();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_INIT();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCpu();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_ID1&nbsp;=&nbsp;0X40;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_ID2&nbsp;=&nbsp;0X28;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE1=0X01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE2=0X02;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE3=0X03;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE4=0X04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE5=0X05;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE6=0X06;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE7=0X07;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_SENDBYTE8=0X08;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_CMR&nbsp;|=&nbsp;0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
wxj1952 发表于 2007-9-13 08:25 | 显示全部楼层

有意思!

竟然没看出错。除了主程序不用循环发送,因为CAN是自动重发的。<br />按理论,独立节点的发送,可以永远重发。<br /><br />不过这与程序错误没什么关系。改正了,也没查出哪的问题。
wxj1952 发表于 2007-9-14 10:33 | 显示全部楼层

原来问题在这!

OCR寄存器设错了。如果标准接法,TX0的OCTP0、OCTN0、OCPOL0只能设为110。
hbcjzcg 发表于 2007-9-14 14:22 | 显示全部楼层

原来问题在这

OCR寄存器设错了。如果标准接法,TX0的OCTP0、OCTN0、OCPOL0只能设为110。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

138

帖子

1

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