STM32F4xx CAN 过滤器配置

问题描述 投票:0回答:2

我是参考参考手册(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中,否则将丢弃该消息。

不是吗?

感谢有优势。

can-bus stm32f4
2个回答
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
}

请注意,仅比较 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)

留言将被接受。


0
投票

你能提供一个函数来创建一个掩码来接受一定范围内的消息吗?

© www.soinside.com 2019 - 2024. All rights reserved.