From 87c9a8a8fa15854ce4cede7af709def2259f5885 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Sun, 17 May 2020 14:54:41 +0300 Subject: [PATCH] some i2c fixes --- cores/esp32/esp32-hal-i2c.c | 26 ++++++++++++++++++++------ libraries/Wire/src/Wire.cpp | 8 +++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/cores/esp32/esp32-hal-i2c.c b/cores/esp32/esp32-hal-i2c.c index 9ebf7261..a3ae8219 100644 --- a/cores/esp32/esp32-hal-i2c.c +++ b/cores/esp32/esp32-hal-i2c.c @@ -1792,13 +1792,25 @@ struct i2c_struct_t { i2c_port_t num; }; +static i2c_t * i2c_ports[2] = {NULL, NULL}; + i2c_t * i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t clk_speed){ - i2c_t * out = (i2c_t*)malloc(sizeof(i2c_t)); - if(out == NULL){ - log_e("malloc failed"); - return NULL; - } - out->num = (i2c_port_t)i2c_num; + if(i2c_num >= 2){ + return NULL; + } + i2c_t * out = NULL; + if(i2c_ports[i2c_num] == NULL){ + out = (i2c_t*)malloc(sizeof(i2c_t)); + if(out == NULL){ + log_e("malloc failed"); + return NULL; + } + out->num = (i2c_port_t)i2c_num; + i2c_ports[i2c_num] = out; + } else { + out = i2c_ports[i2c_num]; + i2c_driver_delete((i2c_port_t)i2c_num); + } i2c_config_t conf; conf.mode = I2C_MODE_MASTER; @@ -1811,12 +1823,14 @@ i2c_t * i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t clk_speed){ if (ret != ESP_OK) { log_e("i2c_param_config failed"); free(out); + i2c_ports[i2c_num] = NULL; return NULL; } ret = i2c_driver_install(out->num, conf.mode, 0, 0, 0); if (ret != ESP_OK) { log_e("i2c_driver_install failed"); free(out); + i2c_ports[i2c_num] = NULL; return NULL; } return out; diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 3fbd0eb0..3acea70a 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -107,7 +107,7 @@ bool TwoWire::begin(int sdaPin, int sclPin, uint32_t frequency) sda = sdaPin; scl = sclPin; - i2c = i2cInit(num, sdaPin, sclPin, frequency); + i2c = i2cInit(num, sda, scl, frequency); if(!i2c) { return false; } @@ -129,6 +129,12 @@ uint16_t TwoWire::getTimeOut() void TwoWire::setClock(uint32_t frequency) { +#if CONFIG_IDF_TARGET_ESP32S2 + i2c = i2cInit(num, sda, scl, frequency); + if(!i2c) { + return; + } +#endif i2cSetFrequency(i2c, frequency); }