我是按照ZLGMCU网站上的“PHILIPS 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 />软件 在其基础上稍微改改,所有子程序没有改一个字符。<br />发送程序如下:<br />void main(void)<br />{ <br /> uchar status; //状态字 <br /> Delay_50us(100) ; //50us*100=5ms<br /> status=Config_SJA(); //配置sja1000<br /> InitCPU(); //初始化<br /> if(status!=0) write7279(DECODE1,status&0x0f); //配置sja1000出现错误,显示错误代码<br /> else<br /> write7279(DECODE1,0); //配置sja1000正常显示0<br /> }<br /><br /> SetSystemBuf[0]=0xaa; //简单的发送测试,送一个字节0X55<br /> SetSystemBuf[1]=0x03;<br /> SetSystemBuf[2]=0x55;<br /> if(BCAN_DATA_WRITE(SetSystemBuf)) write7279(DECODE1+1,2);<br /> else write7279(DECODE1+1,3); //写入缓冲区正常显示3,不正常显示2<br /> if(BCAN_CMD_PRG(TR_CMD)) write7279(DECODE1,2);<br /> else write7279(DECODE1,3); //启动发送正常正常显示3,不正常显示2<br /><br />loop:goto loop;<br />}<br />//以下的InitCPU和Config_SJA子程序和资料上一模一样,没改过。<br />void InitCPU(void)<br />{<br />EA =1;<br />IT0 =1;<br />EX0 =1;<br />PX0 =1; <br />//InitUart(); //初始化串口 <br />} <br />////<br />uchar Config_SJA(void)<br />{ <br /> uchar data status=0;<br /> Delay_50us(100) ;<br /> TimeOut_Start(20);<br /> BandRateBuf = ByteRate_1000k;<br /> BCAN_ENTER_RETMODEL();<br /> if(BCAN_CREATE_COMMUNATION())//<br /> {<br /> status = CAN_INTERFACE_ERR;<br /> return(status);<br /> }<br /> if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率100kbps<br /> {<br /> status = CAN_INITBTR_ERR ;<br /> return(status);<br /> }<br /> if(BCAN_SET_OBJECT(0xaa,0x00))<br /> {<br /> status =CAN_INITOBJECT_ERR;<br /> return(status);<br /> }<br /> <br /> if(BCAN_SET_OUTCLK(0xaa,0x48))<br /> {<br /> status =CAN_INITOUTCTL_ERR;<br /> return(status);<br /> }<br /> if(BCAN_QUIT_RETMODEL())<br /> {<br /> status = CAN_QUITRESET_ERR;<br /> return(status);<br /> }<br /> <br /> SJA_BCANAdr=REG_CONTROL;<br /> *SJA_BCANAdr=0X1E;<br /> <br /> return status; <br />}<br /><br />接收程序:<br />void ex0_Val(void) interrupt 0 using 1<br />{ <br /> SJA_BCANAdr=REG_INTERRUPT;<br /> CanBusFlag=*SJA_BCANAdr; //保存sja1000中断标志<br />////////////////////////////////////////////////////////////////<br />//接收测试:若有帧收到产生中断,在数码管上显示8,没有帧收到初始化正常显示0,初始化不正常显示错误代码。我的机器上一直显示0<br /> write7279(DECODE1,8);<br />loop1:goto loop1; <br />//////////////////////////////////////////////////////<br />}<br /><br /><br />void main(void)<br />{ <br /> uchar status; //状态字 <br /> Delay_50us(100) ; //50us*100=5ms<br /> status=Config_SJA(); //配置sja1000<br /> InitCPU(); //初始化<br /> if(status!=0) write7279(DECODE1,status&0x0f);//Error_disp(status); //配置sja1000出现错误<br /> else<br /> { write7279(DECODE1,0); //初始化正常显示0<br /> }<br /><br /> while(1)<br /> {if(_testbit_(CanRcv_Good)) CanRcv_Prg();//是接收中断标志<br /> if(_testbit_(CanSend_Good)) CanSend_Prg();//是发送中断标志<br /> if(_testbit_(CanErrFlag)) CanErr_Prg();//是错误中断标志<br /> if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超载中断标志<br /> if(_testbit_(CanWuiFlag)) CanWui_Prg();//是唤醒中断标志<br /> }<br />}<br />InitCPU和Config_SJA子程序和资料上一模一样,没改过。<br />我的接收节点一直显示0,表示没有进入/INT0,没有收到帧,不知为何?麻烦各位指点迷津。 |
|