本人用89c51+sja1000+tja1050,89c51的p26接sja_cs,p26接sja复位。现在用自收发模式(mod.2=1)调试,初始化sja1000总是失败,下面是初始化程序,请高手指点。<br /><br />void init_sja1000(void)<br />{<br /> uchar state,ss,status;<br /> uchar ACRR[4];<br /> uchar AMRR[4];<br /><br />// 接收代码寄存器<br /> ACRR[0] = 0xff;<br /> ACRR[1] = 0xff;<br /> ACRR[2] = 0xff;<br /> ACRR[3] = 0xff; <br /><br />// 接收屏蔽寄存器,<br /> AMRR[0] = 0xff;<br /> AMRR[1] = 0Xff;<br /> AMRR[2] = 0xff;<br /> AMRR[3] = 0xff; <br /><br />// 使用do--while语句确保进入复位模式<br /> do<br /> {<br /> MODR = 0x09; // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器<br /> state = MODR; //state=0x09<br /> ss=ECC; //ss=0x2f<br /> status=MODR; //status=0x09<br /> }<br /> while( !(status & 0x01) );//<br /> status=MODR; //这条语句status=0x2f 应该是0x09这是为什么?<br /> ss=ECC; //ss=0x2f<br /> status=status & 0x01; //status=0x2f<br />if(status==0x01)<br />{<br /> state = MODR;<br /> ss=MODR;<br />// 对SJA1000部分寄存器进行初始化设置<br /> CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN<br /> BTR0 = 0x53; // 总线定时寄存器0 ;总线波特率设定<br /> BTR1 = 0x2f; // 总线定时寄存器1 ;总线波特率设定<br /> IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能<br /> OCR = 0x1a; // 配置输出控制寄存器<br /> CMR = 0x04; // 释放接收缓冲器<br /><br />// 初始化接收代码寄存器<br /> ACR0 = ACRR[0];<br /> ACR1 = ACRR[1];<br /> ACR2 = ACRR[2]; <br /> ACR3 = ACRR[3]; <br /><br /> // 初始化接收屏蔽寄存器<br /> AMR0 = AMRR[0];<br /> AMR1 = AMRR[1];<br /> AMR2 = AMRR[2];<br /> AMR3 = AMRR[3]; <br /> <br /> <br /><br /> <br /><br />// 使用do--while语句确保进入自接收模式<br /> do<br /> {<br /> MODR = 0x0c; //MOD.2=1--进入自接收模式,<br /> MODR = 0x0c;<br /> state = ECC;<br /> status=MODR;<br /> }<br /> while( !(status & 0x0c) );<br />}<br />}<br /><br /><br /> |
|