Fix ESP core 2.0.0 I2C exception

This commit is contained in:
Theo Arends 2021-10-28 15:57:24 +02:00
parent 4c65de2561
commit f8843acbde
5 changed files with 33 additions and 11 deletions

View File

@ -1997,7 +1997,24 @@ const uint8_t I2C_RETRY_COUNTER = 3;
uint32_t i2c_active[4] = { 0 };
uint32_t i2c_buffer = 0;
void I2cBegin(int sda, int scl, uint32_t frequency = 100000);
void I2cBegin(int sda, int scl, uint32_t frequency) {
#ifdef ESP8266
Wire.begin(sda, scl);
#endif
#ifdef ESP32
bool result = Wire.begin(sda, scl, frequency);
AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Begin %d"), result);
#endif
}
#ifdef ESP32
void I2c2Begin(int sda, int scl, uint32_t frequency = 100000);
void I2c2Begin(int sda, int scl, uint32_t frequency) {
bool result = Wire1.begin(sda, scl, frequency);
AddLog(LOG_LEVEL_DEBUG, PSTR("I2C: Bus 2 begin %d"), result);
}
bool I2cValidRead(uint8_t addr, uint8_t reg, uint8_t size, uint32_t bus = 0);
bool I2cValidRead(uint8_t addr, uint8_t reg, uint8_t size, uint32_t bus)
#else
@ -2007,6 +2024,7 @@ bool I2cValidRead(uint8_t addr, uint8_t reg, uint8_t size)
uint8_t retry = I2C_RETRY_COUNTER;
bool status = false;
#ifdef ESP32
if (!TasmotaGlobal.i2c_enabled_2) { bus = 0; }
TwoWire & myWire = (bus == 0) ? Wire : Wire1;
#else
TwoWire & myWire = Wire;
@ -2121,6 +2139,7 @@ bool I2cWrite(uint8_t addr, uint8_t reg, uint32_t val, uint8_t size)
uint8_t x = I2C_RETRY_COUNTER;
#ifdef ESP32
if (!TasmotaGlobal.i2c_enabled_2) { bus = 0; }
TwoWire & myWire = (bus == 0) ? Wire : Wire1;
#else
TwoWire & myWire = Wire;
@ -2191,6 +2210,7 @@ void I2cScan(uint32_t bus) {
Response_P(PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_JSON_I2CSCAN_DEVICES_FOUND_AT));
for (address = 1; address <= 127; address++) {
#ifdef ESP32
if (!TasmotaGlobal.i2c_enabled_2) { bus = 0; }
TwoWire & myWire = (bus == 0) ? Wire : Wire1;
#else
TwoWire & myWire = Wire;
@ -2269,6 +2289,7 @@ bool I2cSetDevice(uint32_t addr)
#endif
{
#ifdef ESP32
if (!TasmotaGlobal.i2c_enabled_2) { bus = 0; }
TwoWire & myWire = (bus == 0) ? Wire : Wire1;
#else
TwoWire & myWire = Wire;

View File

@ -1901,12 +1901,12 @@ void GpioInit(void)
#ifdef USE_I2C
TasmotaGlobal.i2c_enabled = (PinUsed(GPIO_I2C_SCL) && PinUsed(GPIO_I2C_SDA));
if (TasmotaGlobal.i2c_enabled) {
Wire.begin(Pin(GPIO_I2C_SDA), Pin(GPIO_I2C_SCL));
I2cBegin(Pin(GPIO_I2C_SDA), Pin(GPIO_I2C_SCL));
}
#ifdef ESP32
TasmotaGlobal.i2c_enabled_2 = (PinUsed(GPIO_I2C_SCL, 1) && PinUsed(GPIO_I2C_SDA, 1));
if (TasmotaGlobal.i2c_enabled_2) {
Wire1.begin(Pin(GPIO_I2C_SDA, 1), Pin(GPIO_I2C_SCL, 1));
I2c2Begin(Pin(GPIO_I2C_SDA, 1), Pin(GPIO_I2C_SCL, 1));
}
#endif
#endif // USE_I2C

View File

@ -31,6 +31,7 @@ TwoWire & getWire(bvm *vm) {
be_getmember(vm, 1, "bus");
int32_t bus = be_toint(vm, -1); // bus is 1 or 2
be_pop(vm, 1);
if (!TasmotaGlobal.i2c_enabled_2) { bus = 1; }
if (2 != bus) {
return Wire;
} else {

View File

@ -161,11 +161,11 @@ uDisplay *udisp;
replacepin(&cp, Pin(GPIO_OLED_RESET));
if (wire_n == 1) {
Wire.begin(sda, scl);
I2cBegin(sda, scl);
}
#ifdef ESP32
if (wire_n == 2) {
Wire1.begin(sda, scl);
I2c2Begin(sda, scl);
}
if (I2cSetDevice(i2caddr, wire_n - 1)) {
I2cSetActiveFound(i2caddr, "DSP-I2C", wire_n - 1);
@ -257,11 +257,11 @@ uDisplay *udisp;
scl = replacepin(&cp, Pin(GPIO_I2C_SCL, wire_n));
sda = replacepin(&cp, Pin(GPIO_I2C_SDA, wire_n));
if (wire_n == 0) {
Wire.begin(sda, scl);
I2cBegin(sda, scl);
}
#ifdef ESP32
if (wire_n == 1) {
Wire1.begin(sda, scl, 400000);
I2c2Begin(sda, scl, 400000);
}
if (I2cSetDevice(i2caddr, wire_n)) {
I2cSetActiveFound(i2caddr, "FT5206", wire_n);

View File

@ -165,7 +165,7 @@ void ShtDetect(void)
sht_type = 1;
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_I2C D_SHT1X_FOUND));
} else {
Wire.begin(sht_sda_pin, sht_scl_pin);
I2cBegin(sht_sda_pin, sht_scl_pin);
sht_type = 0;
}
}