【问题标题】:How to setup my CANbus message filterering acceptance code and mask?如何设置我的 CAN 总线消息过滤接受代码和掩码?
【发布时间】:2022-10-13 22:00:33
【问题描述】:

我没有成功启用 CANbus 驱动程序的过滤配置。文档就在那里(CTRL+F 接受过滤器):https://docs.espressif.com/projects/esp-idf/en/v3.3/api-reference/peripherals/can.html#configuration

我想设置过滤器,以便我只能捕获我的扩展帧,这些帧的 ID 落在 0x18000000 到 0x18FFFFFF 范围内。

但是我的代码没有捕捉到我期望的帧(又名 0x18307001)。

我可能误解了文档。

我的代码如下:


    can_general_config_t general_config = {
        .mode = 
        //CAN_MODE_NO_ACK,
        //CAN_MODE_LISTEN_ONLY,
        CAN_MODE_NORMAL,
        
        .tx_io = (gpio_num_t)TXD,
        .rx_io = (gpio_num_t)RXD,
        .clkout_io = (gpio_num_t)CAN_IO_UNUSED,
        .bus_off_io = (gpio_num_t)CAN_IO_UNUSED,
        .tx_queue_len = 100,
        .rx_queue_len = 65,

        .alerts_enabled = CAN_ALERT_NONE,
        .clkout_divider = 0
    };
    log("CAN Driver: general config done");
    can_timing_config_t timing_config = CAN_TIMING_CONFIG_500KBITS();
    log("CAN Driver: timing config done @ 500KBPS");


    can_filter_config_t filter_config = 
    {
        .acceptance_code = 0x18FFFFFF, 
        .acceptance_mask = 0x00FFFFFF, //0x18FFFFFF, 
        .single_filter = true
    };
    log("CAN Driver: filter config done");

    esp_err_t error = can_driver_install(&general_config, &timing_config, &filter_config);
    #endif

【问题讨论】:

  • 如果将位设置为 1 意味着不关心,或者是否应该设置为 0,这并不总是很明显。值得注意的是,整个掩蔽废话总是造成比解决的问题更多的麻烦,而且它太生硬,无法用于任何事情,但非常无论如何简单的CAN节点。现代 CAN 控制器(大约比 2010 年更新)用邮箱解决了这个问题,这在各个方面都更加优雅。邮箱还消除了疯狂轮询/中断检查每条消息/始终清空 Rx FIFO 的需要。如果您可以选择切换到现代 MCU,那么我建议您这样做。

标签: esp32 can-bus


【解决方案1】:

https://docs.espressif.com/projects/esp-idf/en/v3.3/api-reference/peripherals/can.html#configuration 没有说明必须如何构建掩码。 我希望从其他实现中,“无关”位必须设置为零。

所以,这应该工作:

acceptance_code = 0x18FFFFFF
acceptance_mask = 0x1F000000

【讨论】:

  • 如果你是正确的,那应该是0x1F000000。扩展 CAN 帧标识符只有 29 位长。
【解决方案2】:

我终于找到了解决方案:我必须左移 3 位

    const uint32_t acceptanceCode = 0x18000000U<<3;
    const uint32_t acceptanceMask = 0x00FFFFFFU<<3; 

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多