11//
22// FILE: MultiSpeedI2CScanner.ino
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.1.10
4+ // VERSION: 0.1.11
55// PURPOSE: I2C scanner at different speeds
66// DATE: 2013-11-05
7+ // URL: https://github.com/RobTillaart/MultiSpeedI2CScanner
78// URL: http://forum.arduino.cc/index.php?topic=197360
89//
9- // Released to the public domain
10- //
1110
12- #include < Wire.h>
1311#include < Arduino.h>
12+ #include < Wire.h>
1413
1514TwoWire *wi;
1615
17- const char version[] = " 0.1.10 " ;
16+ const char version[] = " 0.1.11 " ;
1817
1918
2019// INTERFACE COUNT (TESTED TEENSY 3.5 AND ARDUINO DUE ONLY)
@@ -23,8 +22,7 @@ int selectedWirePort = 0;
2322
2423
2524// scans devices from 50 to 800KHz I2C speeds.
26- // lower than 50 is not possible
27- // DS3231 RTC works on 800 KHz. TWBR = 2; (?)
25+ // speed lower than 50 and above 400 can cause problems
2826long speed[10 ] = { 100 , 200 , 300 , 400 };
2927int speeds;
3028
@@ -42,7 +40,7 @@ bool delayFlag = false;
4240// MINIMIZE OUTPUT
4341bool printAll = true ;
4442bool header = true ;
45-
43+ bool disableIRQ = false ;
4644
4745// STATE MACHINE
4846enum states {
@@ -61,8 +59,8 @@ void setup()
6159 Serial.begin (115200 );
6260
6361#if defined (ESP8266) || defined(ESP32)
64- uint8_t sda = 15 ;
65- uint8_t scl = 2 ;
62+ uint8_t sda = 21 ;
63+ uint8_t scl = 22 ;
6664 Wire.begin (sda, scl, 100000 ); // ESP32 - change config pins if needed.
6765#else
6866 Wire.begin ();
@@ -90,6 +88,7 @@ void setup()
9088
9189void loop ()
9290{
91+ yield ();
9392 char command = getCommand ();
9493 switch (command)
9594 {
@@ -147,6 +146,11 @@ void loop()
147146 Serial.print (F (" <print=" ));
148147 Serial.println (printAll ? F (" all>" ) : F (" found>" ));
149148 break ;
149+ case ' i' :
150+ disableIRQ = !disableIRQ;
151+ Serial.print (F (" <irq=" ));
152+ Serial.println (disableIRQ ? F (" diabled>" ) : F (" enabled>" ));
153+ break ;
150154
151155 case ' 0' :
152156 case ' 1' :
@@ -300,6 +304,7 @@ void displayHelp()
300304 Serial.println (F (" \t c = continuous scan - 1 second delay" ));
301305 Serial.println (F (" \t q = quit continuous scan" ));
302306 Serial.println (F (" \t d = toggle latency delay between successful tests. 0 - 5 ms" ));
307+ Serial.println (F (" \t i = toggle enable/disable interrupts" ));
303308
304309 Serial.println (F (" Output:" ));
305310 Serial.println (F (" \t p = toggle printAll - printFound." ));
@@ -309,7 +314,7 @@ void displayHelp()
309314 Serial.println (F (" Speeds:" ));
310315 Serial.println (F (" \t 0 = 100..800 Khz - step 100 (warning - can block!!)" ));
311316 Serial.println (F (" \t 1 = 100 KHz" ));
312- Serial.println (F (" \t 2 = 200 KH " ));
317+ Serial.println (F (" \t 2 = 200 KHz " ));
313318 Serial.println (F (" \t 4 = 400 KHz" ));
314319 Serial.println (F (" \t 9 = 50..400 Khz - step 50 < DEFAULT >" ));
315320 Serial.println ();
@@ -328,6 +333,8 @@ void I2Cscan()
328333 startScan = millis ();
329334 uint8_t count = 0 ;
330335
336+ if (disableIRQ) noInterrupts ();
337+
331338 if (header)
332339 {
333340 Serial.print (F (" TIME\t DEC\t HEX\t " ));
@@ -344,18 +351,6 @@ void I2Cscan()
344351 Serial.println ();
345352 }
346353
347- // TEST
348- // 0.1.04: tests only address range 8..120
349- // --------------------------------------------
350- // Address R/W Bit Description
351- // 0000 000 0 General call address
352- // 0000 000 1 START byte
353- // 0000 001 X CBUS address
354- // 0000 010 X reserved - different bus format
355- // 0000 011 X reserved - future purposes
356- // 0000 1XX X High Speed master code
357- // 1111 1XX X reserved - future purposes
358- // 1111 0XX X 10-bit slave addressing
359354 for (uint8_t address = addressStart; address <= addressEnd; address++)
360355 {
361356 bool printLine = printAll;
@@ -364,12 +359,15 @@ void I2Cscan()
364359
365360 for (uint8_t s = 0 ; s < speeds ; s++)
366361 {
362+ yield (); // keep ESP happy
367363
368364#if ARDUINO < 158 && defined (TWBR)
365+ uint16_t PREV_TWBR = TWBR;
369366 TWBR = (F_CPU / (speed[s] * 1000 ) - 16 ) / 2 ;
370367 if (TWBR < 2 )
371368 {
372369 Serial.println (" ERROR: not supported speed" );
370+ TWBR = PREV_TWBR;
373371 return ;
374372 }
375373#else
@@ -413,4 +411,8 @@ void I2Cscan()
413411 Serial.print (stopScan - startScan);
414412 Serial.println (F (" milliseconds." ));
415413 }
414+
415+ interrupts ();
416416}
417+
418+ // -- END OF FILE --
0 commit comments