【问题标题】:How to configure my CAN filter in list mode?如何在列表模式下配置我的 CAN 过滤器?
【发布时间】: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


【解决方案1】:

我猜你正在混合过滤器和掩码: 过滤器掩码用于确定接收帧的标识符中的哪些位与过滤器进行比较

如果掩码位设置为零,则无论过滤位的值如何,都会自动接受相应的 ID 位。

如果掩码位设置为1,则对应的ID位将与过滤位的值进行比较;如果匹配则接受,否则拒绝该帧。

【讨论】:

  • 这不是蒙版模式吗?那么List模式和mask模式有什么区别呢? RM0090 说:“在标识符列表模式中,掩码寄存器用作标识符寄存器。因此,不是定义标识符和掩码,而是指定两个标识符,使单个标识符的数量加倍。传入标识符的所有位必须与位匹配在过滤器寄存器中指定。”我还没有真正理解这意味着什么,也找不到更好的文档。
  • 我对 RM0090 不熟悉,但我想您需要一份所有来电 ID 的完整列表。不是从 IDx 到 IDy 的范围。
猜你喜欢
  • 2017-07-12
  • 2011-10-17
  • 2022-07-27
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2015-11-02
相关资源
最近更新 更多