diff --git a/libraries/Wire/keywords.txt b/libraries/Wire/keywords.txt index 5e3d2b1ca..03cc5c006 100644 --- a/libraries/Wire/keywords.txt +++ b/libraries/Wire/keywords.txt @@ -17,6 +17,7 @@ endTransmission KEYWORD2 requestFrom KEYWORD2 onReceive KEYWORD2 onRequest KEYWORD2 +disablePullups KEYWORD2 ####################################### # Instances (KEYWORD2) diff --git a/libraries/Wire/library.properties b/libraries/Wire/library.properties index e19526e87..ae3d32df5 100644 --- a/libraries/Wire/library.properties +++ b/libraries/Wire/library.properties @@ -1,5 +1,5 @@ name=Wire -version=1.0 +version=1.1 author=Arduino maintainer=Arduino sentence=This library allows you to communicate with I2C and Two Wire Interface devices. diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index c407776e7..064cbb7f6 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -19,6 +19,7 @@ Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts Modified 2017 by Chuck Todd (ctodd@cableone.net) to correct Unconfigured Slave Mode reboot Modified 2020 by Greyson Christoforo (grey@christoforo.net) to implement timeouts + Modified 2021 by Fernando Rubio (frubio@techdev.cl) to support I2C 3v3 devices */ extern "C" { @@ -82,6 +83,11 @@ void TwoWire::end(void) twi_disable(); } +void TwoWire::disablePullups(void) +{ + twi_disablePullups(); +} + void TwoWire::setClock(uint32_t clock) { twi_setFrequency(clock); diff --git a/libraries/Wire/src/Wire.h b/libraries/Wire/src/Wire.h index e70d72edb..b441ab7dc 100644 --- a/libraries/Wire/src/Wire.h +++ b/libraries/Wire/src/Wire.h @@ -18,6 +18,7 @@ Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts Modified 2020 by Greyson Christoforo (grey@christoforo.net) to implement timeouts + Modified 2021 by Fernando Rubio (frubio@techdev.cl) to support I2C 3v3 devices */ #ifndef TwoWire_h @@ -54,6 +55,7 @@ class TwoWire : public Stream void begin(uint8_t); void begin(int); void end(); + void disablePullups(); void setClock(uint32_t); void setWireTimeout(uint32_t timeout = 25000, bool reset_with_timeout = false); bool getWireTimeoutFlag(void); diff --git a/libraries/Wire/src/utility/twi.c b/libraries/Wire/src/utility/twi.c index d223760d8..d4ecb5daf 100644 --- a/libraries/Wire/src/utility/twi.c +++ b/libraries/Wire/src/utility/twi.c @@ -18,6 +18,7 @@ Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts Modified 2020 by Greyson Christoforo (grey@christoforo.net) to implement timeouts + Modified 2021 by Fernando Rubio (frubio@techdev.cl) to support I2C 3v3 devices */ #include @@ -55,6 +56,9 @@ static volatile uint32_t twi_timeout_us = 0ul; static volatile bool twi_timed_out_flag = false; // a timeout has been seen static volatile bool twi_do_reset_on_timeout = false; // reset the TWI registers on timeout +//3v3 Compatibility need the feature of disable pullups and allow external pullups +static volatile uint8_t twi_pullups_state = 1; //Pull-ups Enabled by default as previous Lib versions, state is needed to support future resets from timeouts + static void (*twi_onSlaveTransmit)(void); static void (*twi_onSlaveReceive)(uint8_t*, int); @@ -84,9 +88,9 @@ void twi_init(void) twi_sendStop = true; // default value twi_inRepStart = false; - // activate internal pullups for twi. - digitalWrite(SDA, 1); - digitalWrite(SCL, 1); + // activate/deactivate internal pullups for twi according to default value. + digitalWrite(SDA, twi_pullups_state); + digitalWrite(SCL, twi_pullups_state); // initialize twi prescaler and bit rate cbi(TWSR, TWPS0); @@ -118,6 +122,18 @@ void twi_disable(void) digitalWrite(SCL, 0); } +/* + * Function twi_disablePullups + * Desc disables internal pullups on init + * Input none + * Output none + */ +void twi_disablePullups(void) +{ + // deactivate internal pullups for twi. + twi_pullups_state = 0; +} + /* * Function twi_slaveInit * Desc sets slave address and enables interrupt diff --git a/libraries/Wire/src/utility/twi.h b/libraries/Wire/src/utility/twi.h index 85b983794..5206b3834 100644 --- a/libraries/Wire/src/utility/twi.h +++ b/libraries/Wire/src/utility/twi.h @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Modified 2020 by Greyson Christoforo (grey@christoforo.net) to implement timeouts + Modified 2021 by Fernando Rubio (frubio@techdev.cl) to support I2C 3v3 devices */ #ifndef twi_h @@ -42,6 +43,7 @@ void twi_init(void); void twi_disable(void); + void twi_disablePullups(void); void twi_setAddress(uint8_t); void twi_setFrequency(uint32_t); uint8_t twi_readFrom(uint8_t, uint8_t*, uint8_t, uint8_t);