lvgl i2c bus contention management
Posted: Tue May 06, 2025 8:38 pm
I have a pair of SSD1306 displays and a BME680 sensor on the same i2c bus on an esp32-c6 breakout board (specifically the Waveshare ESP32-C6-DEV-KIT-N8). I am using the SSD1306's with the lvgl library adapted from the esp-idf example called i2c-oled while I'm using the bme680 using basic i2c-master API calls. If I comment out the code for the displays, the bme680 sensor works and if I comment out the code for sensor, the displays work just fine. I believe version-wise, my lvgl is 8.3.0 and esp-idf is 5.4.1.
I'm pretty certain the issue is with the communication to the display being active on the i2c bus at the time a transaction is attempted on the bme680 sensor because the error is a timeout error. Is there a correct way to manage this contention using mutex's? With lvgl being very abstracted, I don't know what functions specifically generate i2c bus access. So, I'm not sure what lvgl functions to use the mutex with.
I am able to get both devices working simultaneously if I put the displays on one i2c bus and the sensor on the separate lp i2c bus, but I'd like to save the pins in case I need them for something else.
I'm pretty certain the issue is with the communication to the display being active on the i2c bus at the time a transaction is attempted on the bme680 sensor because the error is a timeout error. Is there a correct way to manage this contention using mutex's? With lvgl being very abstracted, I don't know what functions specifically generate i2c bus access. So, I'm not sure what lvgl functions to use the mutex with.
I am able to get both devices working simultaneously if I put the displays on one i2c bus and the sensor on the separate lp i2c bus, but I'd like to save the pins in case I need them for something else.