跳转到内容

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 (必填, Pin):接收引脚。

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

  • mode (可选, enum):工作模式。可选值为:

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

  • tx_queue_len (可选, int):TX 队列的长度,设为 0 以禁用。

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

  • 包含 Canbus 的所有其他选项。

仅监听模式将 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 变体支持的波特率:

bit_rateESP32其他变体*
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 收发器。