aboutsummaryrefslogtreecommitdiff
path: root/libraries/Wire/src/Wire.cpp
diff options
context:
space:
mode:
authorGreyson Christoforo <grey@christoforo.net>2018-02-28 20:59:45 +0000
committerMartino Facchin <m.facchin@arduino.cc>2020-06-11 15:30:04 +0200
commitdeea9293201dbab724b6b0519c35ddba3e6b92d9 (patch)
tree480a0d0d23624b58c2bcedcf7e53dddf7fda823f /libraries/Wire/src/Wire.cpp
parent71c3f9920102991dc7b0492482fb08d51881e44a (diff)
Introduce non compulsory Wire timeout
move timout handling into its own function change timeout from milliseconds to microseconds don't forget operating slave address or the bitrate when we reset because of a timeout Co-Authored-By: Witold Markowski <witold.a.markowski@gmail.com> fix delay datatype uint16_t --> uint32_t Update libraries/Wire/src/utility/twi.c fix mix up using TWBR instea of TWAR! Co-Authored-By: Matthijs Kooijman <matthijs@stdin.nl> Update libraries/Wire/src/utility/twi.c fix 2nd TWBR/TWAR mixup Co-Authored-By: Matthijs Kooijman <matthijs@stdin.nl> twi_stop() should use the same timeout as everywhere else all while loops are now protected by timeouts Revert "twi_stop() should use the same timeout as everywhere else" This reverts commit 68fe5f1dae1bb41183bb37eeda3fb453394a580c. make timeout counter volatile rename timeout function for improved clarity - resetting the twi interface on timeouts is now optional - timeouts in the ISR are no longer hardcoded and now obey the set timeout value - a user-readable flag is now set whenever a timeout occurs - the user can clear this flag whenever they like
Diffstat (limited to 'libraries/Wire/src/Wire.cpp')
-rw-r--r--libraries/Wire/src/Wire.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp
index 58916ce..b446f9a 100644
--- a/libraries/Wire/src/Wire.cpp
+++ b/libraries/Wire/src/Wire.cpp
@@ -18,6 +18,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
*/
extern "C" {
@@ -86,6 +87,33 @@ void TwoWire::setClock(uint32_t clock)
twi_setFrequency(clock);
}
+/***
+ * Sets the TWI timeout.
+ *
+ * @param timeout a timeout value in microseconds, if zero then timeout checking is disabled
+ * @param reset_with_timeout if true then TWI interface will be automatically reset on timeout
+ * if false then TWI interface will not be reset on timeout
+ */
+void TwoWire::setWireTimeoutUs(uint32_t timeout, bool reset_with_timeout){
+ twi_setTimeoutInMicros(timeout, reset_with_timeout);
+}
+
+/***
+ * Returns the TWI timeout flag.
+ *
+ * @return true if timeout has occured
+ */
+bool TwoWire::getWireTimeoutFlag(void){
+ return(twi_manageTimeoutFlag(false));
+}
+
+/***
+ * Clears the TWI timeout flag.
+ */
+void TwoWire::clearWireTimeoutFlag(void){
+ twi_manageTimeoutFlag(true);
+}
+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
{
if (isize > 0) {