【发布时间】: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,那么我建议您这样做。