我是参考参考手册(bxCAN)中的信息而写的。
我正在尝试了解
CAN
过滤器配置的工作原理,并需要您的帮助来检查我是否理解正确。
特别是过滤器ID和过滤器掩码ID的配置。
在我看了
stdPeriphLib
和参考之后。手册,我认为可以理解会发生什么,但我不确定。
过滤器 ID 高/低:
FilterIdHigh/Low 是与
CAN Controller
进行二进制 AND 后的 FilterIdMask
的比较值吗?
例如: CAN 控制器收到消息 --> CAN_Rx_
CAN Controller makes a binary AND with the FilterIdMask -->
CAN_Rx_ArbitrationField & FilterIdMask = Result
CAN Controller
将 Result 与 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
}
请注意,仅比较 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)
留言将被接受。
你能提供一个函数来创建一个掩码来接受一定范围内的消息吗?