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