Unverified Commit c9916c46 authored by Me No Dev's avatar Me No Dev Committed by GitHub

Fix I2C clock stretching issue with ESP32 (#5910)

It was found that when I2C device is holding the clock LOW, ESP32 master is failing to wait for the clock to be released.

Fixes: #5875
Fixes: sparkfun/SparkFun_u-blox_GNSS_Arduino_Library#77
parent bd2be80b
...@@ -302,7 +302,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t ...@@ -302,7 +302,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
i2c_ll_slave_init(i2c->dev); i2c_ll_slave_init(i2c->dev);
i2c_ll_set_fifo_mode(i2c->dev, true); i2c_ll_set_fifo_mode(i2c->dev, true);
i2c_ll_set_slave_addr(i2c->dev, slaveID, false); i2c_ll_set_slave_addr(i2c->dev, slaveID, false);
i2c_ll_set_tout(i2c->dev, 32000); i2c_ll_set_tout(i2c->dev, I2C_LL_MAX_TIMEOUT);
i2c_slave_set_frequency(i2c, frequency); i2c_slave_set_frequency(i2c, frequency);
if (!i2c_slave_check_line_state(sda, scl)) { if (!i2c_slave_check_line_state(sda, scl)) {
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "soc/soc_caps.h" #include "soc/soc_caps.h"
#include "soc/i2c_periph.h" #include "soc/i2c_periph.h"
#include "hal/i2c_hal.h" #include "hal/i2c_hal.h"
#include "hal/i2c_ll.h"
#include "driver/i2c.h" #include "driver/i2c.h"
typedef volatile struct { typedef volatile struct {
...@@ -91,6 +92,8 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency){ ...@@ -91,6 +92,8 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency){
} else { } else {
bus[i2c_num].initialized = true; bus[i2c_num].initialized = true;
bus[i2c_num].frequency = frequency; bus[i2c_num].frequency = frequency;
//Clock Stretching Timeout: 20b:esp32, 5b:esp32-c3, 24b:esp32-s2
i2c_set_timeout((i2c_port_t)i2c_num, I2C_LL_MAX_TIMEOUT);
} }
} }
#if !CONFIG_DISABLE_HAL_LOCKS #if !CONFIG_DISABLE_HAL_LOCKS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment