【发布时间】:2019-03-03 12:05:51
【问题描述】:
我编写了一些代码来传输/接收 CAN 消息,但我的过滤器出现了一些问题。首先,我要说的是我了解掩码模式,并已设法使其与以下配置一起工作:
uint16_t id = 0x12; // 0001 0010
uint16_t mask = 0xFC; // 1111 1100
sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh=id<<5;
sFilterConfig.FilterIdLow=0;
sFilterConfig.FilterMaskIdHigh=mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;
HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
这接受 ID 为 0x1X 的消息,其中 X 为 0 到 3。我不太了解 ID 的最后 2 位的用途,因为它们与掩码无关,我的想法是否正确?无论如何,这不是主要问题。
现在已经阅读了 RM0090,我正在尝试构建一个过滤器,该过滤器将使用以下代码接受 ID 为 0x120 到 0x1FA 的消息:
uint16_t id = 0x120; // 0001 0010 0000
uint16_t mask = 0x1FA; // 0001 1111 1010
sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDLIST;
sFilterConfig.FilterScale=CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh=mask<<5;
sFilterConfig.FilterIdLow=id<<5;
sFilterConfig.FilterMaskIdHigh=0;//mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;
HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
它没有按预期工作,它似乎只接受 ID 0x120 和 0x00,是我对列表模式的理解不正确还是我的过滤器实现?或两者?
编辑:
我对 Mask/List 模式的理解是错误的。我了解如何使用掩码,但我认为列表模式可用于创建一系列可接受的 ID,但似乎您只能使用列表模式来捕获几个特定的 ID。我发现this page 很有帮助。
正如我上面链接的页面所说,您只能获得 2^N - (2^(N-1) - 1) 形式的范围。
我的问题现在变成了 Mask 低/高和 filterID 低/高的意义何在?最初我认为它可能是 32 位寄存器的低/高 16 位,但每个低/高变量已经是 uint32,所以这个想法对我来说没有意义。任何清晰将不胜感激。
干杯!
【问题讨论】:
-
我不能代表这个特定的 CAN 控制器,但通常你有一个 标识符接受过滤器,它是传入标识符必须匹配的位序列,以及一个 标识符掩码 告诉过滤器中的哪个位适用。然后,各种控制器具有各种或多或少复杂的方式来组合接受和屏蔽寄存器。大多数情况下,使用这些寄存器产生的问题远远多于它们解决的问题。一个更好的解决方案是找到一个具有“邮箱”功能的 CAN 控制器,这在当今很常见。
标签: arm embedded stm32 can-bus stm32f4