This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

280049 CAN MASK的配置与疑问

最近需要使用到280049的CAN mask功能,所以翻看了论坛,然后做了相关测试。

测试1:一个CAN object可以接收多个CAN ID的信息,如CAN object 14可以接收CAN ID 0x120~0x12F的信息 

测试结果:成功

使用TI函数接口
// Initialize the receive message object used for receiving CAN messages.
// Message Object Parameters:
//      Message Object ID Number: 14
//      Message Identifier: 0x123
//      Message Frame: Standard
//      Message Type: Receive
//      Message ID Mask: 0x7F0
//      Message Object Flags: CAN_MSG_OBJ_USE_ID_FILTER
//      Message Data Length: 8 Bytes
//
CAN_setupMessageObject(CANA_BASE, 14, 0x123, CAN_MSG_FRAME_STD,
                       CAN_MSG_OBJ_TYPE_RX, 0x7F0, CAN_MSG_OBJ_USE_ID_FILTER,
                       MSG_DATA_LENGTH);
关键参数:CAN_MSG_OBJ_USE_ID_FILTER
测试2:一个CAN object可以接收任意标准帧CAN ID的信息
测试结果:失败,只能接收到ID为0x123的帧
使用TI函数接口
// Initialize the receive message object used for receiving CAN messages.
// Message Object Parameters:
//      Message Object ID Number: 14
//      Message Identifier: 0x123
//      Message Frame: Standard
//      Message Type: Receive
//      Message ID Mask: 0x0
//      Message Object Flags: CAN_MSG_OBJ_NO_FLAGS
//      Message Data Length: 8 Bytes
//
CAN_setupMessageObject(CANA_BASE, 14, 0x123, CAN_MSG_FRAME_STD,
                       CAN_MSG_OBJ_TYPE_RX, 0, CAN_MSG_OBJ_NO_FLAGS,
                       MSG_DATA_LENGTH);
按照论坛里的指导,修改CAN_MSG_OBJ_NO_FLAGS为CAN_MSG_OBJ_USE_ID_FILTER后可以接收任意标准帧
问题:按照测试2的CAN配置,我理解是MASK功能不使用(可以收到任意帧),为什么只能收到一帧数据呢?
大侠们能讲讲为什么吗?谢谢。
  • 我会在测试后给您回复
  • 很高兴得到您的支持,在论坛里查看相关问题时也看到了你细致的答复。只是其他贴子里没有我关心的问题。期待你的测试结果,谢谢。
  • Aiden 说:
    按照测试2的CAN配置,我理解是MASK功能不使用(可以收到任意帧),为什么只能收到一帧数据呢?

    只能收到一帧?具体是怎样的?

    我使用下面的配置,可以正常接收

    当maskID都为“ 0”并且未设置标志CAN_MSG_OBJ_USE_ID_FILTER时,不进行任何过滤

  • 1、你的测试“当maskID都为“ 0”并且未设置标志CAN_MSG_OBJ_USE_ID_FILTER时,不进行任何过滤”这个测试结果和我的一致的。

    2、我的“按照测试2的CAN配置,我理解是MASK功能不使用(可以收到任意帧),为什么只能收到一帧数据呢?” 是指“当maskID都为“ 0”,并且设置标志CAN_MSG_OBJ_NO_FLAGS时”  只能收到ID=0x123的帧,其他的收不到。

    问题:为什么要将接口函数的flag参数设置为CAN_MSG_OBJ_USE_ID_FILTER才行呢?按照我的理解,设置为CAN_MSG_OBJ_NO_FLAGS也可以啊。

    再往细的仿真看,CAN_MSG_OBJ_USE_ID_FILTER标志会将IF1MCTL.UMask bit置1;CAN_MSG_OBJ_NO_FLAGS标志会将IF1MCTL.UMask bit置0. 当IF1MCTL.UMask=0时,mask应该忽略才对啊,为什么还是过滤了其他的帧呢?

  • 通过测试,下面的设置可以接收所有ID的消息,您可以尝试一下

        CAN_setupMessageObject(CANA_BASE, 2, 0, CAN_MSG_FRAME_STD,
                               CAN_MSG_OBJ_TYPE_RX, 0, CAN_MSG_OBJ_USE_ID_FILTER,
                               MSG_DATA_LENGTH);

  • 另外在E2E上有一些相关的讨论,您可以看一下
    e2e.ti.com/.../2885900
  • 或许是我的问题描述的不够清楚,你没有抓住我的问题点。

    我的问题:现在已经有方法实现接收多帧的目的,但是为什么要这样配置呢?这和数据手册上的描述不相符。

    为什么一定要设置CAN_MSG_OBJ_USE_DIR_FILTER标志呢? 设置CAN_MSG_OBJ_NO_FLAGS标志为什么不行呢?

    通过仿真可以看到,设置CAN_MSG_OBJ_USE_DIR_FILTER标志时,IFAMCTL.UMask位是置1的,

    设置CAN_MSG_OBJ_NO_FLAGS标志时IFAMCTL.UMask位是置0的.

    对于寄存器FAMCTL.UMask的描述,当值为0时,Mask是忽略的,应该可以收到所以ID的消息才对,但是结果是只能收到1个ID的消息。

  • 1 是否使用接受掩码由UMask位确定。如果UMask位为0,则所有仲裁位都将用于过滤,而掩码位将被忽略。如果UMask位为1,则将仲裁位和掩码位都用于过滤。

    2 ui32MsgIDMask是实际的掩码本身。如果将ID掩码位设置为零,则地址中的该ID位将被忽略。该ID位的任何值都将被接受。

    3 与eCAN模块相比,DCAN模块中的掩码位具有相反的“极性”。即如果将ID掩码位设置为零,则地址中的该ID位将被忽略。

    4 如果未使用过滤,则传输的MSGID必须逐位与配置用于接收的邮箱的MSGID匹配。也就是说,帧ID必须完全匹配。

    具体的话,请您参考文档Programming Examples and Debug Strategies for the DCAN Module

    www.ti.com.cn/.../sprace5.pdf