请问下各位大神,匠芯创的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离线
### 一、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,不关心 |
离线
@DoraemonK
非常感谢,看你的回复,立马明白了!学习了!
问下,你这个是从哪个文档看到的?
离线