小弟调CAN通信多日了,配置与文档一模一样,但是CAN调试不通,
void LibCanTranData(UINT16 Channal,UINT32 FrameID,UINT8 *Data,UINT16 Length)
{
struct ECAN_REGS ECanaShadow;
switch(Channal)
{
case 0:
{
//步骤一:将CANTRS 寄存器中适当位清零
ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
ECanaShadow.CANTRR.bit.TRR0 = 1;
ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
do{
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
}while(ECanaShadow.CANTRS.bit.TRS0 != 0);
//步骤二:通过清除邮箱使能(CANME)寄存器的相应位来禁用邮箱。
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME0 = 0;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
//步骤三:加载邮箱的消息标识符(MSGID)寄存器对于正常的发送邮箱(MSGID.30=0 和MSGID.29=0),清除
ECanaMboxes.MBOX0.MSGID.all = (UINT16)(FrameID & 0x7FF);
ECanaMboxes.MBOX0.MSGID.bit.IDE = 0;//标准帧
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
//ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD0 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
//步骤四:通过设置CANME 寄存器的相应位设置邮箱启用
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME0 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
//步骤五:将消息数据写入邮箱数据字段
ECanaMboxes.MBOX0.MDL.byte.BYTE0 = (UINT16)Data[0];
ECanaMboxes.MBOX0.MDL.byte.BYTE1 = (UINT16)Data[1];
ECanaMboxes.MBOX0.MDL.byte.BYTE2 = (UINT16)Data[2];
ECanaMboxes.MBOX0.MDL.byte.BYTE3 = (UINT16)Data[3];
ECanaMboxes.MBOX0.MDH.byte.BYTE4 = (UINT16)Data[4];
ECanaMboxes.MBOX0.MDH.byte.BYTE5 = (UINT16)Data[5];
ECanaMboxes.MBOX0.MDH.byte.BYTE6 = (UINT16)Data[6];
ECanaMboxes.MBOX0.MDH.byte.BYTE7 = (UINT16)Data[7];
/*
ECanaShadow.CANMIM.all = ECanaRegs.CANMIM.all;
ECanaShadow.CANMIM.bit.MIM0 = 1;
ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all;
*/
//步骤六:在发送请求寄存器中设定相应的标志(CANTRS.1=1) 来启动的消息传输
ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
ECanaShadow.CANTRS.bit.TRS0 = 1;
ECanaRegs.CANTRS.all = ECanaShadow.CANMD.all;
do{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all; //------------------------->程序一直死在这里,我把CAN.c放在附件里面了,方便各位大侠查询。
}while(ECanaShadow.CANTA.bit.TA0 != 1);
//步骤七:为了下一个传输(从同一邮箱)发送确认必须清除
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
ECanaShadow.CANTA.bit.TA0 = 1;
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
do{
ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
}while(ECanaShadow.CANTA.bit.TA0 != 0);
break;
}
default:
{
break;
}
}}
期待各位大侠能为我解惑,非常感谢。
哪位高手能不能帮下我啊?