跳转到内容

ESP32 CAN

ESP32 具有集成的 CAN 控制器,因此不一定需要外部控制器。 某些变体(ESP32-C5、ESP32-C6、ESP32-P4)具有多个 CAN 控制器 - 请参阅下面的 多个 CAN 控制器。 您只需要指定 RX 和 TX 引脚。任何 GPIO 都可以工作。

# 示例配置
canbus:
- platform: esp32_can
tx_pin: GPIOXX
rx_pin: GPIOXX
can_id: 4
bit_rate: 50kbps
on_frame:
...
  • rx_pin (必需, 引脚):接收引脚。

  • tx_pin (必需, 引脚):发送引脚。

  • mode (可选, 枚举):操作模式。以下之一:

    • NORMAL:正常操作,发送 ACK 信号。(默认)
    • LISTENONLY:仅接收数据,不发送 ACK 信号。
  • rx_queue_len (可选, 整数):RX 队列长度。

  • tx_queue_len (可选, 整数):TX 队列长度,0 表示禁用。

  • tx_enqueue_timeout (可选, 时间):当 TX 队列满时丢弃消息之前等待的最长时间(默认情况下,此设置为在给定波特率下发送 10 条 CAN 消息所需的时间)。

  • 来自 CAN 总线 的所有其他选项。

仅监听模式将 ESP32 的 TWAI 控制器配置为被动监控 CAN 总线流量,而不参与协议。在此模式下:

  • 控制器接收所有 CAN 帧,但不发送 ACK 信号
  • 传输被禁用(尝试传输将记录警告)

这对于以下情况特别有用:

  • BMS 监控:接入电池到逆变器的通信(例如 Pylontech、Deye)
  • CAN 总线调试:在不干扰的情况下观察流量
  • 多主场景:当 ESP32 应该观察但不参与时
# 被动 CAN 总线监控的示例配置
canbus:
- platform: esp32_can
tx_pin: GPIOXX
rx_pin: GPIOXX
bit_rate: 500kbps
mode: LISTENONLY
on_frame:
- can_id: 0x355
then:
- lambda: |-
ESP_LOGI("can", "SOC: %d%%", x[0]);

NOTE

在仅监听模式下,ESP32 不会发送 ACK 信号。这意味着总线上的其他设备将不会收到来自 ESP32 的传输确认。当监控已有其他设备处理确认的现有总线时,这是期望的行为。

TIP

即使在仅监听模式下,仍然需要 tx_pin,因为 ESP32 TWAI 驱动程序初始化需要这两个引脚。但是,在使用 LISTENONLY 模式时,此引脚上不会传输任何数据。

下表列出了 ESP32 变体支持的波特率:

波特率ESP32其他变体*
1KBPSx
5KBPSx
10KBPSx
12K5BPSx
16KBPSx
20KBPSx
25KBPSxx
31K25BPS
33KBPS
40KBPS
50KBPSxx
80KBPS
83K3BPS
95KBPS
100KBPSxx
125KBPS (默认)xx
250KBPSxx
500KBPSxx
800KBPSxx
1000KBPSxx

其他变体:ESP32-C3、ESP32-C5、ESP32-C6、ESP32-H2、ESP32-P4、ESP32-S2、ESP32-S3

NOTE

ESP32-C2 和 ESP32-C61 没有 TWAI/CAN 硬件,不受支持。

某些 ESP32 变体具有多个 CAN (TWAI) 控制器:

  • ESP32-C5:2 个控制器
  • ESP32-C6:2 个控制器
  • ESP32-P4:3 个控制器

所有其他支持的变体只有一个控制器。ESP32-C2 和 ESP32-C61 没有 CAN 硬件。

5V CAN 收发器便宜且能产生合规的电平。如果您使用 5V 为开发板供电,这是首选方案。R501 很重要,用于将 5V 逻辑电平降低到 3.3V,以避免损坏 ESP32。您也可以在此处使用分压器代替。

如果您希望只使用 3.3V 电源,可以使用特殊的 3.3V CAN 收发器。