From 265d24ccc50fdd5b94750ce45261a218ffa248cc Mon Sep 17 00:00:00 2001 From: maidnl Date: Tue, 23 Sep 2025 16:12:40 +0200 Subject: [PATCH 1/4] Reducing excessive I2C communication timeout (added however the possibility to set the timeout to custom value) --- libraries/Wire/Wire.cpp | 8 ++++++-- libraries/Wire/Wire.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 1cb6aa7f3..dd530ec93 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -191,7 +191,7 @@ TwoWire::TwoWire(int scl, int sda, WireAddressMode_t am /*= ADDRESS_MODE_7_BITS* is_master(true), is_sci(false), address_mode(am), - timeout(1000), + timeout(1), transmission_begun(false), data_too_long(false), rx_index(0), @@ -835,7 +835,11 @@ void TwoWire::flush(void) { while(bus_status != WIRE_STATUS_TX_COMPLETED && bus_status != WIRE_STATUS_TRANSACTION_ABORTED) {} } - +/* -------------------------------------------------------------------------- */ +void TwoWire::setTimeout(unsigned int t) { +/* -------------------------------------------------------------------------- */ + timeout = t; +} #if WIRE_HOWMANY > 0 diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index 88ff8d652..f4c0d2c5a 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -125,6 +125,8 @@ class TwoWire : public arduino::HardwareI2C { void setBusStatus(WireStatus_t); + void setTimeout(unsigned int t); + inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); } inline size_t write(unsigned int n) { return write((uint8_t)n); } From bb58da9c32f43204199a1c1510d25940c9d517bb Mon Sep 17 00:00:00 2001 From: maidnl Date: Tue, 23 Sep 2025 16:19:58 +0200 Subject: [PATCH 2/4] Added short comment on function --- libraries/Wire/Wire.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index f4c0d2c5a..442ddcb79 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -124,7 +124,7 @@ class TwoWire : public arduino::HardwareI2C { void onRequest( void (*)(void) ); void setBusStatus(WireStatus_t); - + /* set timeout in ms for I2C communication */ void setTimeout(unsigned int t); inline size_t write(unsigned long n) { return write((uint8_t)n); } From 4f15d9de14003a2c7bb65e40a60001b9203ae3c0 Mon Sep 17 00:00:00 2001 From: maidnl Date: Wed, 24 Sep 2025 09:28:58 +0200 Subject: [PATCH 3/4] Renamed Wire timeout function --- libraries/Wire/Wire.cpp | 2 +- libraries/Wire/Wire.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index dd530ec93..7c7dac58a 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -836,7 +836,7 @@ void TwoWire::flush(void) { } /* -------------------------------------------------------------------------- */ -void TwoWire::setTimeout(unsigned int t) { +void TwoWire::setWireTimeout(unsigned int t) { /* -------------------------------------------------------------------------- */ timeout = t; } diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index 442ddcb79..3f7fe02df 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -125,7 +125,7 @@ class TwoWire : public arduino::HardwareI2C { void setBusStatus(WireStatus_t); /* set timeout in ms for I2C communication */ - void setTimeout(unsigned int t); + void setWireTimeout(unsigned int t); inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); } From 1e3a547535f604ddcbf084d443e32a18baaf0b9f Mon Sep 17 00:00:00 2001 From: maidnl Date: Mon, 13 Oct 2025 12:57:03 +0200 Subject: [PATCH 4/4] Updated setWireTimeout function signature to be compliant with same function present on ArduinoCore-avr - the first parameter now express the timeout in micro seconds (default 25000 us) - the second parameter reset_on_timeout has been added for compatibility but has no effect on this core (default false) - the default timeout (if setWireTimeout is not called) remains set to 1 ms (1000 us) --- libraries/Wire/Wire.cpp | 17 +++++++++-------- libraries/Wire/Wire.h | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 7c7dac58a..cc9f2df17 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -191,7 +191,7 @@ TwoWire::TwoWire(int scl, int sda, WireAddressMode_t am /*= ADDRESS_MODE_7_BITS* is_master(true), is_sci(false), address_mode(am), - timeout(1), + timeout(1000), transmission_begun(false), data_too_long(false), rx_index(0), @@ -465,7 +465,7 @@ void TwoWire::end(void) { /* -------------------------------------------------------------------------- */ -uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsigned int timeout_ms, bool sendStop) { +uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsigned int timeout_us, bool sendStop) { /* -------------------------------------------------------------------------- */ /* ??? does this function make sense only for MASTER ???? */ @@ -480,8 +480,8 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig err = m_read(&m_i2c_ctrl,data,length,!sendStop); } } - uint32_t const start = millis(); - while(((millis() - start) < timeout_ms) && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) { + uint32_t const start = micros(); + while(((micros() - start) < timeout_us) && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) { } } @@ -494,7 +494,7 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig } /* -------------------------------------------------------------------------- */ -uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsigned int timeout_ms, bool sendStop) { +uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsigned int timeout_us, bool sendStop) { /* -------------------------------------------------------------------------- */ uint8_t rv = END_TX_OK; fsp_err_t err = FSP_ERR_ASSERTION; @@ -508,8 +508,8 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign err = m_write(&m_i2c_ctrl,data,length,!sendStop); } } - uint32_t const start = millis(); - while(((millis() - start) < timeout_ms) && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) { + uint32_t const start = micros(); + while(((micros() - start) < timeout_us) && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) { } @@ -836,8 +836,9 @@ void TwoWire::flush(void) { } /* -------------------------------------------------------------------------- */ -void TwoWire::setWireTimeout(unsigned int t) { +void TwoWire::setWireTimeout(unsigned int t, bool reset_on_timeout) { /* -------------------------------------------------------------------------- */ + (void)reset_on_timeout; timeout = t; } diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index 3f7fe02df..4d59c147d 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -124,8 +124,9 @@ class TwoWire : public arduino::HardwareI2C { void onRequest( void (*)(void) ); void setBusStatus(WireStatus_t); - /* set timeout in ms for I2C communication */ - void setWireTimeout(unsigned int t); + /* set timeout in us for I2C communication (default is 1000 us) + the second parameter has been added for compatibility but it has no effect*/ + void setWireTimeout(unsigned int t = 25000, bool reset_on_timeout = false); inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); }