Edit online

CAN 配置

4 Dec 2024
Read time: 2 minute(s)

驱动配置

Board options --->
    [*] Using CAN0
    [*] Using CAN1
Luban-Lite CAN 的 driver 层是基于 RT-Thread 的 CAN 驱动框架实现的,所以需要使能 RT-Thread 的 CAN 驱动框架:
RT-Thread options --->
    RT-Thread Components --->
        Device Drivers --->
            [*] Using CAN device drivers
            [*] Enable CAN hardware filter
            [ ] Enable CANFD support
注:
  1. CAN 模块不支持 CANFD

  2. 为了使用方便,选择 Using CAN0/1 后会自动选择 CAN 驱动框架

过滤器配置

如果需要接收过滤功能,可以配置 CAN 模块的硬件过滤器。CAN 支持两种过滤模式:单过滤模式和双过滤模式。 单过滤模式只有一个硬件过滤器,可以过滤某个特定的帧 ID 或某个区间范围内的帧 ID。双过滤模式有两个硬件过滤器, 可以过滤两个特定的帧 ID 或不连续的区间范围的帧 ID。

单过滤模式配置示例:
/* config can rx filter */
struct rt_can_filter_item items[1] =
{
    //Only receive standard data frame with ID 0x100~0x1FF
    RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 0, 0x700, RT_NULL, RT_NULL),
};

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

ret = rt_device_control(can_rx_dev, RT_CAN_CMD_SET_FILTER, &cfg);
双过滤模式配置示例:
/* 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);

如上所示,如果数组 structrt_can_filter_itemitems[] 中只配置一个硬件过滤器,CAN 模块默认使用单过滤模式,如果配置了两个过滤器,CAN 模块使用双过滤模式。

注:
  1. 使用双过滤模式时,两个过滤器只能同时过滤标准帧或扩展帧,而不能一个配置为过滤标准帧,另一个配置为过滤扩展帧

  2. 使用双过滤模式过滤扩展帧时,只能过滤扩展帧 ID 的 bit28~bit13。如果需要过滤扩展帧 ID 的所有 bit,必须使用单过滤模式