您尚未登录。

楼主 # 2025-12-06 10:11:41

dgtg
会员
注册时间: 2017-11-08
已发帖子: 275
积分: 229.5

CAN如何配置过滤器?

请问下各位大神,匠芯创的CAN rx过滤器,如何配置啊?
官方例程看不明白,谁帮解释下?谢谢。
如下:

#if CAN_RX_FILTER_ENABLE
        /* config can rx filter */
        struct rt_can_filter_item items[2] =
        {
            //Only receive standard data frame with ID 0x100~0x1FF
            RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 0, 0x700, RT_NULL, RT_NULL),
            //Only receive standard data frame with ID 0x345
            RT_CAN_FILTER_ITEM_INIT(0x345, 0, 0, 0, 0x7FF, RT_NULL, RT_NULL),
        };

        struct rt_can_filter_config cfg = {2, 1, items};

        ret = rt_device_control(can_rx_dev, RT_CAN_CMD_SET_FILTER, &cfg);
        if (ret)
        {
            rt_kprintf("Setting can filter failed!\n");
            return ret;
        }
#endif

离线

#1 2025-12-06 11:09:30

DoraemonK
会员
注册时间: 2022-08-25
已发帖子: 11
积分: 26

Re: CAN如何配置过滤器?

一、CAN 过滤的本质规则

CAN 过滤规则:

接收到的ID 与 (过滤器ID 和 mask) 匹配:

(接收ID & mask) == (过滤器ID & mask)
  • mask 的某位=1 → 这一位必须匹配

  • mask 的某位=0 → 这一位忽略(不参与比较)

---

例子 1:

RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 0, 0x700, RT_NULL, RT_NULL)

| 参数 | 值 |
| ----- | ------- |
| 过滤 ID | 0x100 |
| 掩码 | 0x700 |

转成二进制(11-bit 标准 ID)

过滤 ID  (0x100) = 001 0000 0000
Mask      (0x700) = 111 0000 0000

| bit | 10 | 9 | 8 | 7~0 |
| ---- | ---- | ---- | ---- | --------------- |
| mask | 1 | 1 | 1 | 0 0 0 0 0 0 0 0 |
| 含义 | 必须匹配 | 必须匹配 | 必须匹配 | 无需匹配 |

规则解释:

只匹配 ID 的前三位 bits(bit10~bit8)
001 *** *****

允许通过的 ID 范围:

0x100 ~ 0x1FF

因为前三位固定为 001,后面 8 bits 任意。

---

例子 2:

RT_CAN_FILTER_ITEM_INIT(0x345, 0, 0, 0, 0x7FF, RT_NULL, RT_NULL)

| 参数 | 值 |
| ----- | ------------- |
| 过滤 ID | 0x345 |
| 掩码 | 0x7FF(全部匹配) |

二进制:

过滤 ID  (0x345) = 011 0100 0101
Mask      (0x7FF) = 111 1111 1111

| mask 每一位都=1 → 每一位必须完全匹配 |

规则解释:

接收 ID 必须 == 0x345 才能通过。

---

总结对比表

| 配置 | ID | 掩码 | 匹配范围 |
| -- | ----- | ----- | -------------------- |
| 1 | 0x100 | 0x700 | 区间 → 0x100 ~ 0x1FF |
| 2 | 0x345 | 0x7FF | 只匹配 → 0x345 |

| mask bit | 含义 |
| -------- | ----------- |
| 1 | 必须匹配 ID |
| 0 | 忽略此 bit,不关心 |

离线

楼主 #2 2025-12-06 14:28:28

dgtg
会员
注册时间: 2017-11-08
已发帖子: 275
积分: 229.5

Re: CAN如何配置过滤器?

@DoraemonK
非常感谢,看你的回复,立马明白了!学习了!
问下,你这个是从哪个文档看到的?

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发