STM32F4xx CAN 滤波器配置

STM32F4xx CAN Filter Configuration

我是参考参考手册(bxCAN)中的信息写的。

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

特别是filter ID和filter mask ID的配置。

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

FilterIdHigh/Low:

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

例如: CAN 控制器接收消息 --> CAN_Rx_

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

CAN Controller 将结果与 FilterId 进行比较。

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

不是吗?

谢谢。

首先收到的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 的一帧。在这种情况下,您会将 Filter ID 设置为 0x18EBFAB0,将 Mask 设置为 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)

消息将被接受。