Skip to content

Commit 87c9a8a

Browse files
committed
some i2c fixes
1 parent 90e77cd commit 87c9a8a

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
@@ -1792,13 +1792,25 @@ struct i2c_struct_t {
17921792
i2c_port_t num;
17931793
};
17941794

1795+
static i2c_t * i2c_ports[2] = {NULL, NULL};
1796+
17951797
i2c_t * i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t clk_speed){
1796-
i2c_t * out = (i2c_t*)malloc(sizeof(i2c_t));
1797-
if(out == NULL){
1798-
log_e("malloc failed");
1799-
return NULL;
1800-
}
1801-
out->num = (i2c_port_t)i2c_num;
1798+
if(i2c_num >= 2){
1799+
return NULL;
1800+
}
1801+
i2c_t * out = NULL;
1802+
if(i2c_ports[i2c_num] == NULL){
1803+
out = (i2c_t*)malloc(sizeof(i2c_t));
1804+
if(out == NULL){
1805+
log_e("malloc failed");
1806+
return NULL;
1807+
}
1808+
out->num = (i2c_port_t)i2c_num;
1809+
i2c_ports[i2c_num] = out;
1810+
} else {
1811+
out = i2c_ports[i2c_num];
1812+
i2c_driver_delete((i2c_port_t)i2c_num);
1813+
}
18021814

18031815
i2c_config_t conf;
18041816
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){
18111823
if (ret != ESP_OK) {
18121824
log_e("i2c_param_config failed");
18131825
free(out);
1826+
i2c_ports[i2c_num] = NULL;
18141827
return NULL;
18151828
}
18161829
ret = i2c_driver_install(out->num, conf.mode, 0, 0, 0);
18171830
if (ret != ESP_OK) {
18181831
log_e("i2c_driver_install failed");
18191832
free(out);
1833+
i2c_ports[i2c_num] = NULL;
18201834
return NULL;
18211835
}
18221836
return out;

libraries/Wire/src/Wire.cpp

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

108108
sda = sdaPin;
109109
scl = sclPin;
110-
i2c = i2cInit(num, sdaPin, sclPin, frequency);
110+
i2c = i2cInit(num, sda, scl, frequency);
111111
if(!i2c) {
112112
return false;
113113
}
@@ -129,6 +129,12 @@ uint16_t TwoWire::getTimeOut()
129129

130130
void TwoWire::setClock(uint32_t frequency)
131131
{
132+
#if CONFIG_IDF_TARGET_ESP32S2
133+
i2c = i2cInit(num, sda, scl, frequency);
134+
if(!i2c) {
135+
return;
136+
}
137+
#endif
132138
i2cSetFrequency(i2c, frequency);
133139
}
134140

0 commit comments

Comments
 (0)