Waveshare ESP32-S3-Touch-LCD-4.3C — I2C scan finds no devices (CH32V003 IO expander not responding)

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_priority values 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

  1. Has anyone successfully run ESPHome on the Waveshare ESP32-S3-Touch-LCD-4.3C with a working CH32V003?
  2. Is there a way to disable I2C bus recovery in ESPHome/ESP-IDF 5.x to prevent it from firing during boot?
  3. 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.

Quick look at schematics indicates 8/9