大家帮我看下,我设置的对吗?现在收发都出错。<br />void CANInit(void)<br />{<br /> DDRM_DDRM2=0;<br /> DDRM_DDRM3=0;<br /> DDRM_DDRM4=0;<br /> DDRM_DDRM5=0; // PM[2:5]设置为输入,即设置为通用I/O口,避免CAN0的重复<br /> CAN0CTL0=0x01;//设置为初始状态<br /> while ((CAN0CTL1 &0x01)== 0)<br /> {<br /> } //确保CAN0处于初始状态,即CAN0CTL1_INITAK=1<br /> CAN0CTL1=0x80; //MSCAN12模块使能<br /> <br /> CAN0BTR0 = CAN0BTR0V; //同步跳转宽度为1,预分频因子为5<br /> CAN0BTR1 = CAN0BTR1V; //将位速率设置成 197kbps<br /> <br /> CAN0IDAC = CAN0IDACV; //两个32位验收过滤器<br /> <br /> CAN0IDAR0 = CAN0IDAR0V; //给接收验证码寄存器0-1赋值<br /> CAN0IDAR1 = CAN0IDAR1V;<br /> CAN0IDMR0 = CAN0IDMR0V; //给接收验证屏蔽寄存器0-1赋值<br /> CAN0IDMR1 = CAN0IDMR1V;<br /> //CAN0TIER = CAN0TIERV; //设置中断方式<br /> //CAN0TIER = CAN0TIERV;<br /> <br /> CAN0CTL0=0x00;; //INITRQ=0,退出初始化模式<br /> //等待应答<br /> while ((CAN0CTL1 & 0x01) == 1)<br /> {<br /> }<br />}<br /><br />//CANSND1DFRM:CAN发送1帧数据-----------------------------------------------*<br />//功 能:CAN发送1帧数据(数据长度<=8) *<br />//参 数:ID---报文标识符 *<br />// DataBUF---报文数据区首址 *<br />// LEN---报文数据长度 *<br />//返 回:INT8U CANsnd1DFrm --- 发送成功与否标志, *<br />// =0,没有空闲发送缓冲区,发送不成功;=1,发送成功 *<br />//说明:在发送数据之前,先查询是否有空闲发送缓冲区,若无则不能发送,返回0 *<br />//-------------------------------------------------------------------------*<br />INT8U CANSND1DFRM(INT8U * DataBUF )<br />{<br /> INT8U BufferSelect;<br /> INT8U BufferFlag1;<br /> INT8U i;<br /> INT8U LEN;<br /> INT8U x_value=0;<br /> INT8U * addr; //发送缓冲区<br /> INT8U BufNum = 0xFF; //空闲的发送缓冲区号<br /> //BufNum = GetSNDBUF(); //查找空闲的发送缓冲区 <br /> while (CAN0T**==0x00)<br /> {<br /> PTH_PTH6=1;<br /> DelayXms(1000);<br /> <br /> PTH_PTH6=0;<br /> DelayXms(1000);//延时,稳定<br /> <br /> PTH_PTH6=1;<br /> DelayXms(1000);<br /> <br /> PTH_PTH6=0;<br /> <br /> } //确保有发送缓冲器为空<br /> BufferFlag1=CAN0T**;//读出发送缓冲器标志寄存器的内容<br /> CAN0TBSEL=BufferFlag1;//用以赋值发送缓冲器选择寄存器<br /> <br /> addr=(INT8U *)(&CAN0TXF); //获得发送前台缓冲区首地址 <br /> //---------------------------------------------------------------------<br /> //将报文按CAN格式进行封装并存入空闲发送缓冲区等待发送<br /> addr[0] = ascii2byte(++DataBUF); //11位报文标识符高8位<br /> addr[0] <<=4;<br /> addr[0] += ascii2byte(++DataBUF);<br /> addr[1] = ascii2byte(++DataBUF); //低3位<br /> addr[1] <<=5;<br /> addr[1] &= ~(1 << RTR); //RTR=0,数据帧<br /> addr[1] &= ~(1 << IDE); //IDE位=0 <br /> LEN= ascii2byte(++DataBUF); <br /> for(i = 0; i < LEN; i++) <br /> {<br /> DataBUF++;<br /> addr[i+4] = ascii2byte(DataBUF); //数据赋值<br /> addr[i+4]<<=4;<br /> DataBUF++;<br /> addr[i+4]+=ascii2byte(DataBUF); <br /> }<br /> addr[12] = LEN&0x0f; //数据长度<br /> <br /> //---------------------------------------------------------------------<br /> //发送缓冲区相应TXE位写1清除该位来通知MSCAN12发送数据<br /> BufferSelect=CAN0TBSEL;<br /> CAN0T**=BufferSelect;<br /> DelayXms(1000);//延时,稳定<br /> <br /> <br /> <br />}<br /> |
|