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