Part Number:TMS320F280025COther Parts Discussed in Thread:C2000WARE
采用DCAN 测试时发现不采用方向、仲裁位、长度等滤波功能,
实际只接收了匹配仲裁位的数据帧,不能接收任意仲裁位的数据帧,请问大家是否有遇到,问题在哪里?
Green Deng:
你好,方便上传一下DCAN部分的配置代码吗?
,
Zhang Jianhua:
您好,谢谢回复。
采用寄存器配置方式。
1.对初始化部分代码,寄存器配置为:
//CODE_START
while(CanaRegs.CAN_IF1CMD.bit.Busy == 1);
CanaRegs.CAN_IF1MSK.all= 0;
//(可见其中CAN_IF1MSK寄存器不配置滤波) CanaRegs.CAN_IF1ARB.all= CAN_IF1ARB_MSGVAL; CanaRegs.CAN_IF1MCTL.all= CAN_IF1MCTL_EOB; CanaRegs.CAN_IF1CMD.all= m_u32MsgobjectID|CAN_IF1CMD_DIR|CAN_IF1CMD_CONTROL|CAN_IF1CMD_ARB; //m_u32RxMsgobjectID为邮箱编号
//CODE_END
2.接收部分代码,寄存器配置为:
//CODE_START
CanaRegs.CAN_IF2CMD.all = m_u32RxMsgobjectID|CAN_IF2CMD_DATA_A|CAN_IF2CMD_DATA_B|CAN_IF2CMD_CONTROL|CAN_IF2CMD_ARB;
//(可见其中CAN_IF2CMD寄存器不配置MASK进行滤波)
while(CanaRegs.CAN_IF2CMD.bit.Busy == 1);
读取DATA数据 = (UINT16)(CanaRegs.CAN_IF2DATA.all&0xFF)~~~~~~
CanaRegs.CAN_IF2CMD.all = m_u32RxMsgobjectID|CAN_IF2CMD_TXRQST; //m_u32RxMsgobjectID为邮箱编号 while(CanaRegs.CAN_IF2CMD.bit.Busy == 1);
//CODE_END
可见其中寄存器不配置滤波,实际采用USBCAN盒测试发现,仲裁位不匹配帧无法接收到。
,
Green Deng:
好的,我会跟DCAN方面的专家沟通一下后回复你。
,
Green Deng:
你好,你是打算使用 ID 过滤吗?
从代码片段中,我没有看到 CAN_IF2MCTL(接收代码)中的 UMask 位被设置。我也没有看到为 ID 过滤配置 CAN_IF2MSK 和 CAN_IF2ARB 寄存器。C2000Ware 中有一个示例说明了过滤的工作原理。可以查看一下 can_ex8_mask 示例。
,
Zhang Jianhua:
您好。
是为了特意不使用滤波,所以取消 CAN_IF2MCTL中UMask 位配置等。
问题是测试发现实际依然进行了滤波。
,
Green Deng:
我昨天将你的回复转给对方工程师了,但是目前还没收到回复,还请耐心等待一下。
F280025没有寄存器形式的CAN例程,不过你也可以参考一下F2837xD的,下面路径的例程就是没有使用过滤,可以接收任意ID:
C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f2837xd\examples\cpu1\can_external_transmit\cpu01
若是使用过滤的话,在过滤之前,将屏蔽位与ID位进行“与”运算,编程类似:
if ((incoming_message_id & mask) == (message_object_id & mask)) {accept_message(); } else {ignore_message(); }
,
Zhang Jianhua:
收到,谢谢。
,
Green Deng:
你好,不知道上面那个例程是否有帮助?
如果还是有问题的话麻烦发一下Can_ IF1/IF2寄存器的dump,在不知道IFx寄存器内容的情况下,无法确定发生了什么。
,
Zhang Jianhua:
您好,基于ti\c2000\C2000Ware_4_01_00_00\device_support\f2837xd\examples\cpu1\can_external_transmit\cpu01路径(路径可见下图)的代码:
没有看到您粘贴的该可选择滤波与否的代码(如下):
if ((incoming_message_id & mask) == (message_object_id & mask)){ accept_message();} else{ ignore_message();}
请问是否为路径不对?该可选择滤波与否的代码放在哪个函数下?
,
Green Deng:
额,这段代码其实是举例了一下如果要用过滤的话,在过滤之前,可以通过将屏蔽位与ID位进行“与”运算方式来实现。所以这段代码不是例程中的,如果你要用到F280025的话可以根据这段代码来修改