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_rate | 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 收发器。