TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28062 CAN通信发送信息的时候为何不能查询到成功?

小弟调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;
}
}}

 期待各位大侠能为我解惑,非常感谢。

哪位高手能不能帮下我啊?

user3917511:

1)邮箱初始化配置:首先应确定从32个邮箱中选择要配置的目标邮箱,比如配置成发送邮箱或接收邮箱,一般是成对出现的。然后是对靠近的邮箱进行ID号(标识符)的配置,数据长度,优先级的设置,是远程帧还是普通扩展数据帧等。

具体步骤总结如下:第一步在写标识符前必须将所有邮箱屏蔽掉,ECanaRegs.CANME.all=0。(第五步,最后将要用到的邮箱配置好后,使能需要用到的邮箱,比如邮箱0和邮箱16,ECanaRegs.CANME.bit.ME0=1;ECanaRegs.CANME.bit.ME16=1;)第二步:通过向寄存器CANMC的CDR位请求改变数据区,该位允许快速更新数据消息。再第五步的时候,需要将该位写0,CPU请求正常操作。第三步,设置邮箱的ID(标识符,发送邮箱对应的接收邮箱的标识符是一致的,这个需注意),数据方向寄存器配置了发送邮箱还是接收邮箱。数据长度,发送优先级的设置,以及是否有远方应答帧的请求,向邮箱RAM区写数据(这个注意:ECanaboxes.MBOXO.MDRL.all=?ECanaboxes.MBOXO.MDRH.all=?)

2)邮箱初始化之后,就可以对其进行发送或者接收操作啦!前面第一步主要是前奏,现在进入主题。

消息的发送操作,分为五步:

第一步:清除CANTRS发送请求置位寄存器—当邮箱n准备发送时,CPU将TRSn置1,启动发送。就相当于一个开关一样,当数据要被发送时,将开关TRSn闭合,则数据发送出去。上电复位,各位都被清0。接着配置发送响应寄存器CANTA,如果邮箱n中的消息已经发送成功,则相应的TAn将置位。CPU通过向TANTA中的位写1,使其复位。如果已经产生中断,向CANTA寄存器写1,则可以清除中断,向CANTA寄存器写0没有影响。上电后,寄存器所有的位都被清除。

第二步:初始化邮箱,见第一部分。

第三步:设置TRS请求发送标志,请求发送消息

第四步:等待传输响应位置位,邮箱完成发送。(由0置1才能跳出循环等待,这点是关键!!!)

第五步:复位TA和传输标志,需要向相应的寄存器位写1才能清零(这点相当重要,向该位写1才能清零,等待下一次发送!!!)。

3)消息的接收操作,分五步操作

第一步:设置局部接收屏蔽寄存器LAMn,它可以指明哪些标识符位

第二步:初始化邮箱

第三步:等待接收响应标志置位

第四步:CPU读取邮箱中的数据

第五步:复位接收消息挂起标志

小弟调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;
}
}}

 期待各位大侠能为我解惑,非常感谢。

哪位高手能不能帮下我啊?

user1944858:你的问题解决没?什么原因导致的。我今天调试也出现这个问题

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28062 CAN通信发送信息的时候为何不能查询到成功?
分享到: 更多 (0)