首页 > 解决方案 > 我需要以这样的方式配置 CAN 过滤器,即只有 ID 0x80 和 0x200 和 0x300 之间的 ID 通过,所有其他的都不允许通过

问题描述

我用这种方式试过但问题是只有200-300可以通过但80h没有通过。如果我使用 if-else 则只传递 80h 而不是 200-300h。所以,问题是我可以通过 80h 或 200h-300h。不是 80h 和 200-300h。

#define Filter_ID1  0x80

#define Filter_ID2  0x200


#if Filter_ID1

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterBank = 0;

sFilterConfig.FilterIdHigh=0x80<<5;

sFilterConfig.FilterMaskIdHigh=0xff<<5;

sFilterConfig.FilterIdLow = 0x0000;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

sFilterConfig.FilterActivation = ENABLE;

#endif


#if Filter_ID2

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterBank = 1;

sFilterConfig.FilterIdHigh=0x200<<5;

sFilterConfig.FilterMaskIdHigh=0x300<<5;

sFilterConfig.FilterIdLow = 0x0000;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;

sFilterConfig.FilterActivation = ENABLE;

#endif

标签: cfilteringstm32can-bus

解决方案


您需要配置两个滤波器组:

对于 [0x200, 0x300) 范围(0x300 除外),您需要标识符掩码模式。在这种情况下:

  • 掩码 (FxR2) = 0x300(检查位 8 和 9,忽略其他位)
  • ID (FxR1) = 0x200(位 8 和 9 需要为 0b10)

对于 0x80,您需要标识符列表模式。对于 32 位列表,一个过滤器库包含 2 个项目。为了只接受 0x80,您需要用相同的值填充它们(0x80 两次)

  • ID (FxR1) = 0x80
  • ID (FxR2) = 0x80

可以同时激活多个滤波器组。

FiRx是参考手册使用的命名约定,其中i = 0..27(滤波器组编号)和x = 1,2(寄存器编号)。我不知道您使用的库如何调用它们。

当然,我提到的值只是逻辑值。您需要移动/修改它们以适合您的硬件寄存器。我不确定左移 5 是否正确。这对我来说似乎<< 3是正确的价值。请参阅参考手册中的过滤器组规模配置 - 注册组织


推荐阅读