From ae3dd3215db0184634c91ef05fdb8419be39275f Mon Sep 17 00:00:00 2001 From: paynterf Date: Fri, 10 Jul 2020 23:34:16 -0400 Subject: [PATCH 1/4] Added code to demonstrate use of new I2C timeout feature --- .../Wire/examples/i2c_scanner/i2c_scanner.ino | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino index 3febbf441..bef1cdbe4 100644 --- a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino +++ b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino @@ -21,6 +21,8 @@ // A sensor seems to use address 120. // Version 6, November 27, 2015. // Added waiting for the Leonardo serial communication. +// Version 6, July 10, 2020 by G. Frank Paynter +// Demonstrates the use of the new Wire library timeout feature // // // This sketch tests the standard 7-bit addresses @@ -29,15 +31,29 @@ #include +uint16_t wireTimeoutCount; //capture I2C bus timeout events + void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); + + Wire.setWireTimeout(3000, true); //timeout value in uSec, true to reset I2C bus on timeout + wireTimeoutCount = 0; + Wire.clearWireTimeoutFlag(); + } void loop() { + if (Wire.getWireTimeoutFlag()) + { + wireTimeoutCount++; + Wire.clearWireTimeoutFlag(); + Serial.print("Wire timeout detected; count now "); Serial.println(wireTimeoutCount); + } + int nDevices = 0; Serial.println("Scanning..."); From 8aa1cef9fa0a622a12ecb76213c62e3f93abfb6a Mon Sep 17 00:00:00 2001 From: paynterf Date: Thu, 16 Jul 2020 11:00:40 -0400 Subject: [PATCH 2/4] Move anti-lockup code to beginning of Setup() --- libraries/Wire/examples/i2c_scanner/i2c_scanner.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino index bef1cdbe4..aca985a05 100644 --- a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino +++ b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino @@ -36,14 +36,14 @@ uint16_t wireTimeoutCount; //capture I2C bus timeout events void setup() { Wire.begin(); - Serial.begin(9600); - while (!Serial); // Leonardo: wait for serial monitor - Serial.println("\nI2C Scanner"); - + //demonstrates use of new anti-lockup feature Wire.setWireTimeout(3000, true); //timeout value in uSec, true to reset I2C bus on timeout wireTimeoutCount = 0; - Wire.clearWireTimeoutFlag(); + Wire.clearWireTimeoutFlag(); //should be cleared on startup, but... + Serial.begin(9600); + while (!Serial); // Leonardo: wait for serial monitor + Serial.println("\nI2C Scanner"); } void loop() { From b9a9ab35ae9a0a7262792e824d6155ce25292141 Mon Sep 17 00:00:00 2001 From: paynterf Date: Thu, 16 Jul 2020 11:27:08 -0400 Subject: [PATCH 3/4] Remove 'clearWireTimeoutFlag()' from setup. It is explicitly cleared in 'SetTimeout()' --- libraries/Wire/examples/i2c_scanner/i2c_scanner.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino index aca985a05..7dd83adf7 100644 --- a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino +++ b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino @@ -39,7 +39,6 @@ void setup() { //demonstrates use of new anti-lockup feature Wire.setWireTimeout(3000, true); //timeout value in uSec, true to reset I2C bus on timeout wireTimeoutCount = 0; - Wire.clearWireTimeoutFlag(); //should be cleared on startup, but... Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor From cf81cfc522fcb074f8ac2700ad07f1d1cad8db74 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Sat, 26 Sep 2020 21:37:16 +0200 Subject: [PATCH 4/4] Add check for WIRE_HAS_TIMEOUT --- libraries/Wire/examples/i2c_scanner/i2c_scanner.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino index 7dd83adf7..8029c45eb 100644 --- a/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino +++ b/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino @@ -36,9 +36,11 @@ uint16_t wireTimeoutCount; //capture I2C bus timeout events void setup() { Wire.begin(); - //demonstrates use of new anti-lockup feature + #if defined(WIRE_HAS_TIMEOUT) + // Prevent lockups on bus problems by aborting after a timeout Wire.setWireTimeout(3000, true); //timeout value in uSec, true to reset I2C bus on timeout wireTimeoutCount = 0; + #endif Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor @@ -46,12 +48,14 @@ void setup() { } void loop() { + #if defined(WIRE_HAS_TIMEOUT) if (Wire.getWireTimeoutFlag()) { wireTimeoutCount++; Wire.clearWireTimeoutFlag(); Serial.print("Wire timeout detected; count now "); Serial.println(wireTimeoutCount); } + #endif int nDevices = 0;