您尚未登录。

楼主 # 昨天 10:11:41

dgtg
会员
注册时间: 2017-11-08
已发帖子: 271
积分: 225.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 昨天 11:09:30

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

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 昨天 14:28:28

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

Re: CAN如何配置过滤器?

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

离线

页脚

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

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