From af7d96d98ca57e7e925b148c8cd5b25817f1b52f Mon Sep 17 00:00:00 2001 From: Michel Date: Mon, 11 Jul 2022 14:50:26 +0200 Subject: [PATCH 1/2] Add solicitation status function Adds twi_isSollicited() to allow querying an i2c peripheral to know if it's in the middle of an i2c transaction. This is most useful when planning to mask interrupts, which can break communications on the bus. --- libraries/Wire/src/utility/twi.c | 4 ++++ libraries/Wire/src/utility/twi.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/Wire/src/utility/twi.c b/libraries/Wire/src/utility/twi.c index e09a33caf..1e50b1a30 100644 --- a/libraries/Wire/src/utility/twi.c +++ b/libraries/Wire/src/utility/twi.c @@ -500,6 +500,10 @@ bool twi_manageTimeoutFlag(bool clear_flag){ return(flag); } +bool twi_isSollicited(void){ + return twi_state == TWI_SRX || twi_state == TWI_STX; +} + ISR(TWI_vect) { switch(TW_STATUS){ diff --git a/libraries/Wire/src/utility/twi.h b/libraries/Wire/src/utility/twi.h index 85b983794..3b2dbf1bf 100644 --- a/libraries/Wire/src/utility/twi.h +++ b/libraries/Wire/src/utility/twi.h @@ -55,5 +55,6 @@ void twi_setTimeoutInMicros(uint32_t, bool); void twi_handleTimeout(bool); bool twi_manageTimeoutFlag(bool); + bool twi_isSollicited(void); #endif From d4e47e2892cd061ef5e95fdb3875959afc310820 Mon Sep 17 00:00:00 2001 From: Michel Date: Mon, 11 Jul 2022 14:54:22 +0200 Subject: [PATCH 2/2] Add user-facing wrapper of twi_isSollicited --- libraries/Wire/src/Wire.cpp | 6 +++++- libraries/Wire/src/Wire.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 001d924df..b1f5f8ce3 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -372,7 +372,11 @@ void TwoWire::onRequest( void (*function)(void) ) user_onRequest = function; } +bool TwoWire::isBusy(void) +{ + return twi_isSollicited(); +} + // Preinstantiate Objects ////////////////////////////////////////////////////// TwoWire Wire = TwoWire(); - diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index e70d72edb..dea6dbe9b 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -75,6 +75,7 @@ class TwoWire : public Stream virtual void flush(void); void onReceive( void (*)(int) ); void onRequest( void (*)(void) ); + bool isBusy(void); inline size_t write(unsigned long n) { return write((uint8_t)n); } inline size_t write(long n) { return write((uint8_t)n); }