Skip to content

Commit 31d5120

Browse files
committed
some i2c fixes
1 parent d111001 commit 31d5120

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

cores/esp32/esp32-hal-i2c.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1784,13 +1784,25 @@ struct i2c_struct_t {
17841784
i2c_port_t num;
17851785
};
17861786

1787+
static i2c_t * i2c_ports[2] = {NULL, NULL};
1788+
17871789
i2c_t * i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t clk_speed){
1788-
i2c_t * out = (i2c_t*)malloc(sizeof(i2c_t));
1789-
if(out == NULL){
1790-
log_e("malloc failed");
1791-
return NULL;
1792-
}
1793-
out->num = (i2c_port_t)i2c_num;
1790+
if(i2c_num >= 2){
1791+
return NULL;
1792+
}
1793+
i2c_t * out = NULL;
1794+
if(i2c_ports[i2c_num] == NULL){
1795+
out = (i2c_t*)malloc(sizeof(i2c_t));
1796+
if(out == NULL){
1797+
log_e("malloc failed");
1798+
return NULL;
1799+
}
1800+
out->num = (i2c_port_t)i2c_num;
1801+
i2c_ports[i2c_num] = out;
1802+
} else {
1803+
out = i2c_ports[i2c_num];
1804+
i2c_driver_delete((i2c_port_t)i2c_num);
1805+
}
17941806

17951807
i2c_config_t conf;
17961808
conf.mode = I2C_MODE_MASTER;
@@ -1803,12 +1815,14 @@ i2c_t * i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t clk_speed){
18031815
if (ret != ESP_OK) {
18041816
log_e("i2c_param_config failed");
18051817
free(out);
1818+
i2c_ports[i2c_num] = NULL;
18061819
return NULL;
18071820
}
18081821
ret = i2c_driver_install(out->num, conf.mode, 0, 0, 0);
18091822
if (ret != ESP_OK) {
18101823
log_e("i2c_driver_install failed");
18111824
free(out);
1825+
i2c_ports[i2c_num] = NULL;
18121826
return NULL;
18131827
}
18141828
return out;

libraries/Wire/src/Wire.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ bool TwoWire::begin(int sdaPin, int sclPin, uint32_t frequency)
9696

9797
sda = sdaPin;
9898
scl = sclPin;
99-
i2c = i2cInit(num, sdaPin, sclPin, frequency);
99+
i2c = i2cInit(num, sda, scl, frequency);
100100
if(!i2c) {
101101
return false;
102102
}
@@ -118,6 +118,12 @@ uint16_t TwoWire::getTimeOut()
118118

119119
void TwoWire::setClock(uint32_t frequency)
120120
{
121+
#if CONFIG_IDF_TARGET_ESP32S2
122+
i2c = i2cInit(num, sda, scl, frequency);
123+
if(!i2c) {
124+
return;
125+
}
126+
#endif
121127
i2cSetFrequency(i2c, frequency);
122128
}
123129

0 commit comments

Comments
 (0)