我参考参考手册(bxCAN)中的信息写作。
我正在尝试了解CAN
过滤器配置的工作原理,需要您的帮助来检查我是否正确理解它。
特别是过滤器ID和过滤器掩码ID的配置。
在我看一下stdPeriphLib
和参考之后。手册,我认为在了解会发生什么,但我不确定。
FilterIdHigh /低:
FilterIdHigh / Low是二元AND与CAN Controller
之后FilterIdMask
的比较值吗?
e.g: 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,否则它将丢弃该消息。
不是吗?
非常感谢。
答案 0 :(得分:1)
首先接收到的ID与掩码进行AND运算,以删除不需要的位,然后与ID进行比较。如果匹配,则只接受消息。
if((CAN_RX_ID & CAN_FILTER_MASK) == (CAN_FILTER_ID & CAN_FILTER_MASK))
{
Copy Data in Buffer
}
else
{
Discard the message
}
请注意,只比较Mask中设置的那些位。
假设您只想接受一个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)
将接受消息。