[CAN-bus/DeviceNet] 我的CAN应该行的,但总是不行,不知为何?麻烦各位帮我看

[复制链接]
3007|2
 楼主| lyons 发表于 2007-4-28 06:31 | 显示全部楼层 |阅读模式
我是按照ZLGMCU网站上的“PHILIPS&nbsp;CAN控制器SJA1000的BasicCAN控制模块”资料(http://www.zlgmcu.com/download/downs.asp?ID=668,那个资料很详细)做的CAN收发器,只是去除与PC的串行通信,改用7279在数码管上显示相关信息。电路基本上按照资料上的“图6节点接口简图”。区别只是:<br />1、不用光偶直接将TX0和RX0连到TXD和RXD;<br />2、TX1悬空,RX1连至82C250的Vref,万用表测电压2.49V;<br />3、/RESET采用RC复位,R=10K,C=10uF,书上说RC复位R=50K,C=1uF,算算时间常数应该可以。<br />软件&nbsp;在其基础上稍微改改,所有子程序没有改一个字符。<br />发送程序如下:<br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;status;&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;Delay_50us(100)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//50us*100=5ms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status=Config_SJA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//配置sja1000<br />&nbsp;&nbsp;&nbsp;&nbsp;InitCPU();&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;//初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;if(status!=0)&nbsp;write7279(DECODE1,status&0x0f);&nbsp;//配置sja1000出现错误,显示错误代码<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write7279(DECODE1,0);&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;//配置sja1000正常显示0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetSystemBuf[0]=0xaa;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//简单的发送测试,送一个字节0X55<br />&nbsp;&nbsp;&nbsp;&nbsp;SetSystemBuf[1]=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;SetSystemBuf[2]=0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(BCAN_DATA_WRITE(SetSystemBuf))&nbsp;write7279(DECODE1+1,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;write7279(DECODE1+1,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入缓冲区正常显示3,不正常显示2<br />&nbsp;&nbsp;&nbsp;&nbsp;if(BCAN_CMD_PRG(TR_CMD))&nbsp;write7279(DECODE1,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;write7279(DECODE1,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动发送正常正常显示3,不正常显示2<br /><br />loop:goto&nbsp;loop;<br />}<br />//以下的InitCPU和Config_SJA子程序和资料上一模一样,没改过。<br />void&nbsp;&nbsp;InitCPU(void)<br />{<br />EA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=1;<br />IT0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=1;<br />EX0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=1;<br />PX0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=1;&nbsp;<br />//InitUart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />////<br />uchar&nbsp;&nbsp;Config_SJA(void)<br />{&nbsp;<br />&nbsp;&nbsp;uchar&nbsp;&nbsp;data&nbsp;&nbsp;&nbsp;status=0;<br />&nbsp;&nbsp;Delay_50us(100)&nbsp;;<br />&nbsp;&nbsp;TimeOut_Start(20);<br />&nbsp;&nbsp;BandRateBuf&nbsp;=&nbsp;ByteRate_1000k;<br />&nbsp;&nbsp;BCAN_ENTER_RETMODEL();<br />&nbsp;&nbsp;if(BCAN_CREATE_COMMUNATION())//<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;CAN_INTERFACE_ERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(status);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率100kbps<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;CAN_INITBTR_ERR&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(status);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(BCAN_SET_OBJECT(0xaa,0x00))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=CAN_INITOBJECT_ERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(status);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(BCAN_SET_OUTCLK(0xaa,0x48))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=CAN_INITOUTCTL_ERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(status);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(BCAN_QUIT_RETMODEL())<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;CAN_QUITRESET_ERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(status);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;SJA_BCANAdr=REG_CONTROL;<br />&nbsp;&nbsp;*SJA_BCANAdr=0X1E;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return&nbsp;&nbsp;status;&nbsp;<br />}<br /><br />接收程序:<br />void&nbsp;&nbsp;ex0_Val(void)&nbsp;&nbsp;interrupt&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;using&nbsp;&nbsp;1<br />{&nbsp;<br />&nbsp;&nbsp;SJA_BCANAdr=REG_INTERRUPT;<br />&nbsp;&nbsp;CanBusFlag=*SJA_BCANAdr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保存sja1000中断标志<br />////////////////////////////////////////////////////////////////<br />//接收测试:若有帧收到产生中断,在数码管上显示8,没有帧收到初始化正常显示0,初始化不正常显示错误代码。我的机器上一直显示0<br />&nbsp;&nbsp;&nbsp;&nbsp;write7279(DECODE1,8);<br />loop1:goto&nbsp;loop1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//////////////////////////////////////////////////////<br />}<br /><br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//状态字&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay_50us(100)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//50us*100=5ms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status=Config_SJA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//配置sja1000<br />&nbsp;&nbsp;&nbsp;&nbsp;InitCPU();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;if(status!=0)&nbsp;write7279(DECODE1,status&0x0f);//Error_disp(status);&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;&nbsp;&nbsp;//配置sja1000出现错误<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write7279(DECODE1,0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化正常显示0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{if(_testbit_(CanRcv_Good))&nbsp;&nbsp;CanRcv_Prg();//是接收中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanSend_Good))&nbsp;CanSend_Prg();//是发送中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp;CanErr_Prg();//是错误中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超载中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanWuiFlag))&nbsp;&nbsp;&nbsp;CanWui_Prg();//是唤醒中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />InitCPU和Config_SJA子程序和资料上一模一样,没改过。<br />我的接收节点一直显示0,表示没有进入/INT0,没有收到帧,不知为何?麻烦各位指点迷津。
桂电飞天鼠 发表于 2007-4-28 12:31 | 显示全部楼层

RT

我当初刚开始的时候也遇到过这个问题,后来检查发现原因有:<br /><br />1,波特率没设好;(你用的晶振跟所用驱动的是一致的了吗?)<br /><br /><br />2,帧结构没正确赋值(就是说ID,长度等位置没有对上);<br /><br />你试试看?
 楼主| lyons 发表于 2007-4-29 21:46 | 显示全部楼层

我没有修改原来的配置文件,这些设置应该都正确吧

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

65

帖子

0

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