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 | 其他变体* |
|---|---|---|
| 1KBPS | x | |
| 5KBPS | x | |
| 10KBPS | x | |
| 12K5BPS | x | |
| 16KBPS | x | |
| 20KBPS | x | |
| 25KBPS | x | x |
| 31K25BPS | ||
| 33KBPS | ||
| 40KBPS | ||
| 50KBPS | x | x |
| 80KBPS | ||
| 83K3BPS | ||
| 95KBPS | ||
| 100KBPS | x | x |
| 125KBPS (默认) | x | x |
| 250KBPS | x | x |
| 500KBPS | x | x |
| 800KBPS | x | x |
| 1000KBPS | x | x |
其他变体:ESP32-C3、ESP32-C5、ESP32-C6、ESP32-H2、ESP32-P4、ESP32-S2、ESP32-S3
NOTE
ESP32-C2 和 ESP32-C61 没有 TWAI/CAN 硬件,不受支持。
多个 CAN 控制器
Section titled “多个 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 收发器。