c - 我需要以这样的方式配置 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
解决方案
您需要配置两个滤波器组:
对于 [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
是正确的价值。请参阅参考手册中的过滤器组规模配置 - 注册组织图
推荐阅读
- javascript - javascript innerhtml 显示为文本
- python - 如何在目录中的多个文件名中查找和替换两个不同的字符串?
- sql - 动态 SQL 转换文本和图像
- syntax - <> 在飞镖类扩展后的含义
- javascript - 停止 Axios 承诺链
- javascript - 用输出参数包装一个 c++ 函数,以便在 javascript/node 中使用
- woocommerce - 产品页面中的 Woo Commerce 产品图片太大。
- hibernate - JPA,休眠find()方法返回null
- kubernetes - 根据一天中的时刻自动缩放 k8s pod
- mysql - SQL - 如何将整个表中的字符替换为 100 列?