Board: Waveshare ESP32-S3-Touch-LCD-4.3C (480x480, ST7701S display via MIPI RGB)
ESPHome version: 2026.4.0
ESP-IDF version: 5.5.4
Summary
The CH32V003 IO expander on this board never responds on I2C when running ESPHome. The I2C scan consistently finds no devices at any address. The original Waveshare firmware works perfectly — the display, backlight, touchscreen, and buzzer all function correctly, confirming the hardware is fine.
Symptoms
Every boot produces:
[C][i2c.idf:103]: Recovery: bus successfully recovered
[C][i2c.idf:113]: Results from bus scan:
[C][i2c.idf:115]: Found no devices
Neither the CH32V003 IO expander (0x24) nor the PCF85063 RTC (0x51) appear. Since the RTC is a completely separate chip, this suggests the I2C bus itself cannot reach any devices, not just the IO expander.
The CH32V003 component retries indefinitely in loop():
[D][waveshare_io_ch32v003:071]: Performing deferred hardware initialization...
[E][waveshare_io_ch32v003:040]: I2C Write failed for reg 0x02
[E][waveshare_io_ch32v003:040]: I2C Write failed for reg 0x03
What I’ve confirmed/tried
- I2C pins GPIO15 (SDA) and GPIO7 (SCL) confirmed correct against the Waveshare BSP header
- Checked BSP source — no ESP32 GPIO needed to enable/reset the CH32V003 before I2C
- Tried I2C frequency 400kHz and 100kHz — no change
- Tried various
setup_priorityvalues for the I2C bus — no change - Removed CANBUS (
esp32_can) component — no change - Full power cycles (not just resets) — no change
- Reflashing original Waveshare firmware restores full functionality immediately, including working touchscreen (confirming I2C hardware is fine)
- Using patched version of fuzzybear62’s waveshare_io_ch32v003 component with
get_loop_priority()removed for ESPHome 2026.4.0 compatibility
Working theory: The ESP-IDF 5.x I2C bus initialisation performs automatic bus recovery (9 SCL clock pulses) when it detects SDA stuck low. The CH32V003 may be driving SDA low during its own boot sequence, causing ESPHome to fire recovery pulses that leave the CH32V003 in a confused state before it can respond on I2C. The original Waveshare firmware appears to avoid this somehow.
Relevant YAML config
i2c:
- id: bus_a
setup_priority: 1000
sda: GPIO15
scl: GPIO7
scan: true
frequency: 100kHz
waveshare_io_ch32v003:
- id: wave_io_hub
setup_priority: 850
address: 0x24
i2c_id: bus_a
Questions
- Has anyone successfully run ESPHome on the Waveshare ESP32-S3-Touch-LCD-4.3C with a working CH32V003?
- Is there a way to disable I2C bus recovery in ESPHome/ESP-IDF 5.x to prevent it from firing during boot?
- Could the ESP-IDF 5.x I2C initialisation be briefly driving SDA/SCL low during GPIO mux setup, triggering CH32V003 into a bad state?
Any help appreciated — happy to provide more logs.
