0

我正在参考参考手册(bxCAN)中的信息写作。

我正在尝试了解CAN过滤器配置的工作原理,需要您的帮助来检查我是否理解正确。

尤其是过滤器ID和过滤器掩码ID的配置。

在我看了一下stdPeriphLib和参考之后。手册,我认为了解会发生什么,但我不确定。

FilterId 高/低:

FilterIdHigh/Low 是CAN Controller二进制 AND 之后的比较值FilterIdMask吗?

eg: CAN Controller 接收到消息 --> CAN_Rx_

CAN Controller makes a binary AND with the FilterIdMask --> 
    CAN_Rx_ArbitrationField & FilterIdMask = Result

CAN ControllerResult 与 FilterId 进行比较。

如果匹配CAN Controller,则将 CAN_Rx_ 消息放入分配的 FIFO,否则将丢弃该消息。

不是吗?

谢谢。

4

1 回答 1

4

首先接收到的 ID 与 Mask 进行 AND 运算以删除不需要的位,然后与 ID 进行比较。如果它们匹配,则只接受消息。

if((CAN_RX_ID & CAN_FILTER_MASK) == (CAN_FILTER_ID & CAN_FILTER_MASK))
{
  Copy Data in Buffer
}
else
{
  Discard the message
}

请注意,仅比较掩码中设置的那些位。

假设您只想接受 ID 为 0x18EBFAB0 的一帧。在这种情况下,您会将过滤器 ID 设置为 0x18EBFAB0,将掩码设置为 0x1FFFFFFF。当任何其他 ID 的消息到达时,将不满足要求的条件,将被忽略。如果收到 ID 为 0x18EBF9B0 的消息,

(0x18EBF9B0 & 0x1FFFFFFF) != (0x18EBFAB0 & 0x1FFFFFFF)

消息将被忽略

如果要接受 ID 0x120 到 0x127 之间的任何消息。在这种情况下,将 Mask 设置为 0x1F0,Filter ID 设置为 0x120。这样,ID 的最后 4 位将被忽略,因为它们被设置为 0。当收到 ID 为 0x123 的消息时,

(0x123 & 0x1F0) == (0x120 & 0x1F0)

消息将被接受。

于 2016-10-31T13:54:35.397 回答