您好!
在阅读 CAN 通信参考手册时、我对掩码的含义非常困惑。 我认为,从字面上说,"面具"是指覆盖的东西,是看不到的。 因此、如果我们将这些相应的掩码位设置为"1"、"mask"应该会生效、我们无法真正看到这些位、例如:identifier。 但是、当查看寄存器描述时、它看起来是不同的。 因此、我想知道、如果我将 ID 掩码位设置为"0"、这些 ID 是否仍用于验收滤波(比较)还是被忽略(任何内容都可以通过)? 在示例代码中、掩码设置为"0"、是否使用 ID?
谢谢、
Yi
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.
您好!
在阅读 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
我想我理解您的观点、并在示例代码中找到根据 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
Yi、
我将 在我们的文档中添加一条注释以提醒客户这一点(即、与 eCAN 模块相比、DCAN 模块中的掩码位具有相反的"极性")。
您好、Haresh、
我认为这将适合将来使用!
谢谢、
Yi