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.

[参考译文] TMS320F28377D:"掩码标识符"到底是什么意思?

Guru**** 2028300 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/568684/tms320f28377d-what-exactly-does-mask-identifier-mean

器件型号:TMS320F28377D

您好!

在阅读 CAN 通信参考手册时、我对掩码的含义非常困惑。 我认为,从字面上说,"面具"是指覆盖的东西,是看不到的。 因此、如果我们将这些相应的掩码位设置为"1"、"mask"应该会生效、我们无法真正看到这些位、例如:identifier。 但是、当查看寄存器描述时、它看起来是不同的。 因此、我想知道、如果我将 ID 掩码位设置为"0"、这些 ID 是否仍用于验收滤波(比较)还是被忽略(任何内容都可以通过)? 在示例代码中、掩码设置为"0"、是否使用 ID?

谢谢、

Yi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您将 ID 掩码位设置为零、则地址中的 ID 位将被忽略。 该 ID 位的任一值都将被接受。

    在滤波之前、屏蔽位与 ID 位进行与运算。 在 C 语言中、滤波器如下所示:

    if ((incoming_message_id 和 mask)=(message_object_id 和 mask)
    ){
    Accept_message();
    }否则
    {
    ignore_message();
    } 

    示例代码不使用掩码--对所有 ID 位进行比较。 要使用掩码、您需要更改此行:

    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE; 

    为此:

    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    

    您还需要将 sRXCANMessage.ui32MsgIdMask 设置为非零值。




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另请注意、ui32MsgIDMask 是实际的掩码本身。 是否使用接受屏蔽由 UMASK 位决定。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Adam:

    感谢您的回复。 我知道您的想法是"掩码位与 ID 位进行与"、但我对示例代码中发生的情况感到困惑。
    由于 sRXCANMessage.ui32Flags 最终将像这样:

    //写出寄存器以编程报文对象。
    HWREGH (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16;

    HWREGH (ui32Base + CAN_O_IF1MSK)= ui32MaskReg 和 CAN_REG_WORD_MASK;
    HWREGH (ui32Base + CAN_O_IF1MSK + 2)= ui32MaskReg >> 16;

    在此之前、使用 MSG_OBJ_USE_ID_FILTER 可以:

    ui32MaskReg = 0;

    //配置屏蔽寄存器。
    if (pMsgObject->ui32Flags & MSG_OBJ_USE_ID_FILTER)

    if (bUseExtendedID)

    //设置请求的29位标识符掩码。
    ui32MaskReg = pMsgObject->ui32MsgIDMask & CAN_IF1MSK_MSK_M;

    其他


    //将11位掩码标识符放入字段的高位
    //。
    ui32MaskReg =((pMsgObject->ui32MsgIDMask << CAN_IF1ARB_STD_ID_S)&
    CAN_IF1ARB_STD_ID_M);



    如果 pMsgObject->ui32MsgIDMask = 0x0、即使它与0x1FFF000进行与运算(与此类似)、它最后仍然为0。 然后、它被提供给 HWREGH、这会导致相应屏蔽寄存器位的0。 通过这种方式、sRXCANMessage.ui32MsgIdMask = 0意味着忽略 ID 位、前提是没有这样配置:sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    我很困惑、可能是某处出错了。 您能提供一些详细的解释吗?

    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我注意到、它在示例代码中进行了编程、如下所示:
    if (pMsgObject->ui32Flags &(MSG_OBJ_USE_ID_FILTER | MSG_OBJ_USE_DIR_FILTER |
    MSG_OBJ_USE_EXT_FILTER))

    //使用屏蔽寄存器将 UMASK 位置位以启用。
    ui32MsgCtrl |= CAN_IF1MCTL_UMASK;

    //设置掩码位,以便将其传输到消息
    //对象。
    ui32CmdMaskReg |= CAN_IF1CMD_MASK;


    因此、我认为可以使用掩码。 但仍然不了解当 sRXCANMessage.ui32Flags = 0时它是如何运行的。 是否有提示?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    消息对象中有一个名为 umask 的位。 您可以在 IF1MCTL 寄存器中找到它。 该位决定了滤波的工作方式。 如果 UMASK 位为0、则所有仲裁位均用于滤波、屏蔽位将被忽略。 如果 UMASK 位为1、则仲裁位和屏蔽位均用于滤波。

    driverlib 函数查看 ui32Flags 变量以决定如何设置 umask。 如果 UMASK 变为0,则 ui32MsgIdMask 的值无关紧要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam

    我想我理解您的观点、并在示例代码中找到根据 ui32Flags 变量配置 umask 位的位置。 但我仍然不理解"ui32MsgIDMask = 0"意味着不使用掩码位、因为根据示例代码、它会在"and"之后以"1"结束数次、并以"1"结束。

    1。

    来自"外部 CAN 发送"示例代码

    //初始化用于接收 CAN 消息的接收消息对象。
    //消息对象参数:
    //消息标识符:0x5555
    //消息 ID 掩码:0x0
    //消息对象标志:接收中断
    //消息数据长度:4字节
    //消息接收数据:rxMsgData
    //
    sRXCANMessage.ui32MsgID = 0x5555;
    sRXCANMessage.ui32MsgIDMask = 0;
    sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
    sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
    sRXCANMessage.pucMsgData = rxMsgData;
    CANMessageSet (CANB_BASE、RX_MSG_OBJ_ID、sRXCANMessage、
    MSG_OBJ_TYPE_RX);

    因此、这里的所有屏蔽位都设置为"0"。

    2.

    在"CANMessageSet"函数中

    //配置屏蔽寄存器。
    if (pMsgObject->ui32Flags & MSG_OBJ_USE_ID_FILTER)

    if (bUseExtendedID)

    //设置请求的29位标识符掩码。
    ui32MaskReg = pMsgObject->ui32MsgIDMask & CAN_IF1MSK_MSK_M;

    其他

    //将11位掩码标识符放入字段的高位
    //。
    ui32MaskReg =((pMsgObject->ui32MsgIDMask << CAN_IF1ARB_STD_ID_S)&
    CAN_IF1ARB_STD_ID_M);

    在这里、 CAN_IF1MSK_MSK_M = 0x1FFFFFFF (或 CAN_IF1ARB_STD_ID_M = 0x1FFC0000)  

    ui32MaskReg = pMsgObject->ui32MsgIDMask & CAN_IF1MSK_MSK_M;

    等于    

    ui32MaskReg = 0x0 & 0x1FFFFFFF = 0x0;  "位和"之后没有任何变化、无论扩展 ID 是不是如此。

    3.

    if (pMsgObject->ui32Flags &(MSG_OBJ_USE_ID_FILTER | MSG_OBJ_USE_DIR_FILTER |
    MSG_OBJ_USE_EXT_FILTER))

    //使用屏蔽寄存器将 UMASK 位置位以启用。
    ui32MsgCtrl |= CAN_IF1MCTL_UMASK;

    //设置掩码位,以便将其传输到消息
    //对象。
    ui32CmdMaskReg |= CAN_IF1CMD_MASK;

    此处未设置 UMASK 位、因为没有过滤器标志。

    4.

    //写出寄存器以编程报文对象。
    HWREGH (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16;

    HWREGH (ui32Base + CAN_O_IF1MSK)= ui32MaskReg 和 CAN_REG_WORD_MASK;
    HWREGH (ui32Base + CAN_O_IF1MSK + 2)= ui32MaskReg >> 16;

    在这里、 ui32MaskReg 值被放入屏蔽寄存器中、根据上述过程、该寄存器的值全部为0x0。 如果 UMASK 未按本示例代码中的方式进行设置, 则屏蔽寄存器(0x0)中的 MASK 位不会计数。 但是、如果 在 ui32Flags 中设置 MSG_OBJ_USE_ID_FILTER、那么屏蔽寄存器(0x0)的相同情况将导致所有 ID 位都被接收、对吧?

    因此在本示例代码中、由于 UMASK 位未置位、因此我们可以将 sRXCANMessage.ui32MsgIDMask 设置为0;以便于简单使用。 但是、如果我们想屏蔽一些位(忽略 ID 位)、那么当设置 sRXCANMessage.ui32MsgIDMask 时、只能将这些位设置为0x0、用于滤波的所有其他位应设置为"1"。 这是我能理解的、如果是正确的、请告诉我。

    非常感谢、

    Yi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的。 将 ui32MsgIdMask 设置为0会将 IF1MSK 位设置为0。 然后、由于 UMASK=0、屏蔽被忽略。 很抱歉以前不清楚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Adam:

    非常感谢您的确认。 现在、我可以说我理解了它。 由于我之前使用的28032在 CAN 屏蔽部分中被定义为28377、我花了一段时间来确定它。 真的很感谢!!

    Yi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yi、

      我将 在我们的文档中添加一条注释以提醒客户这一点(即、与 eCAN 模块相比、DCAN 模块中的掩码位具有相反的"极性")。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Haresh、

    我认为这将适合将来使用!

    谢谢、

    Yi