1
1
//
2
2
// FILE: MultiSpeedI2CScanner.ino
3
3
// AUTHOR: Rob Tillaart
4
- // VERSION: 0.1.10
4
+ // VERSION: 0.1.11
5
5
// PURPOSE: I2C scanner at different speeds
6
6
// DATE: 2013-11-05
7
+ // URL: https://github.com/RobTillaart/MultiSpeedI2CScanner
7
8
// URL: http://forum.arduino.cc/index.php?topic=197360
8
9
//
9
- // Released to the public domain
10
- //
11
10
12
- #include < Wire.h>
13
11
#include < Arduino.h>
12
+ #include < Wire.h>
14
13
15
14
TwoWire *wi;
16
15
17
- const char version[] = " 0.1.10 " ;
16
+ const char version[] = " 0.1.11 " ;
18
17
19
18
20
19
// INTERFACE COUNT (TESTED TEENSY 3.5 AND ARDUINO DUE ONLY)
@@ -23,8 +22,7 @@ int selectedWirePort = 0;
23
22
24
23
25
24
// 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
28
26
long speed[10 ] = { 100 , 200 , 300 , 400 };
29
27
int speeds;
30
28
@@ -42,7 +40,7 @@ bool delayFlag = false;
42
40
// MINIMIZE OUTPUT
43
41
bool printAll = true ;
44
42
bool header = true ;
45
-
43
+ bool disableIRQ = false ;
46
44
47
45
// STATE MACHINE
48
46
enum states {
@@ -61,8 +59,8 @@ void setup()
61
59
Serial.begin (115200 );
62
60
63
61
#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 ;
66
64
Wire.begin (sda, scl, 100000 ); // ESP32 - change config pins if needed.
67
65
#else
68
66
Wire.begin ();
@@ -90,6 +88,7 @@ void setup()
90
88
91
89
void loop ()
92
90
{
91
+ yield ();
93
92
char command = getCommand ();
94
93
switch (command)
95
94
{
@@ -147,6 +146,11 @@ void loop()
147
146
Serial.print (F (" <print=" ));
148
147
Serial.println (printAll ? F (" all>" ) : F (" found>" ));
149
148
break ;
149
+ case ' i' :
150
+ disableIRQ = !disableIRQ;
151
+ Serial.print (F (" <irq=" ));
152
+ Serial.println (disableIRQ ? F (" diabled>" ) : F (" enabled>" ));
153
+ break ;
150
154
151
155
case ' 0' :
152
156
case ' 1' :
@@ -300,6 +304,7 @@ void displayHelp()
300
304
Serial.println (F (" \t c = continuous scan - 1 second delay" ));
301
305
Serial.println (F (" \t q = quit continuous scan" ));
302
306
Serial.println (F (" \t d = toggle latency delay between successful tests. 0 - 5 ms" ));
307
+ Serial.println (F (" \t i = toggle enable/disable interrupts" ));
303
308
304
309
Serial.println (F (" Output:" ));
305
310
Serial.println (F (" \t p = toggle printAll - printFound." ));
@@ -309,7 +314,7 @@ void displayHelp()
309
314
Serial.println (F (" Speeds:" ));
310
315
Serial.println (F (" \t 0 = 100..800 Khz - step 100 (warning - can block!!)" ));
311
316
Serial.println (F (" \t 1 = 100 KHz" ));
312
- Serial.println (F (" \t 2 = 200 KH " ));
317
+ Serial.println (F (" \t 2 = 200 KHz " ));
313
318
Serial.println (F (" \t 4 = 400 KHz" ));
314
319
Serial.println (F (" \t 9 = 50..400 Khz - step 50 < DEFAULT >" ));
315
320
Serial.println ();
@@ -328,6 +333,8 @@ void I2Cscan()
328
333
startScan = millis ();
329
334
uint8_t count = 0 ;
330
335
336
+ if (disableIRQ) noInterrupts ();
337
+
331
338
if (header)
332
339
{
333
340
Serial.print (F (" TIME\t DEC\t HEX\t " ));
@@ -344,18 +351,6 @@ void I2Cscan()
344
351
Serial.println ();
345
352
}
346
353
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
359
354
for (uint8_t address = addressStart; address <= addressEnd; address++)
360
355
{
361
356
bool printLine = printAll;
@@ -364,12 +359,15 @@ void I2Cscan()
364
359
365
360
for (uint8_t s = 0 ; s < speeds ; s++)
366
361
{
362
+ yield (); // keep ESP happy
367
363
368
364
#if ARDUINO < 158 && defined (TWBR)
365
+ uint16_t PREV_TWBR = TWBR;
369
366
TWBR = (F_CPU / (speed[s] * 1000 ) - 16 ) / 2 ;
370
367
if (TWBR < 2 )
371
368
{
372
369
Serial.println (" ERROR: not supported speed" );
370
+ TWBR = PREV_TWBR;
373
371
return ;
374
372
}
375
373
#else
@@ -413,4 +411,8 @@ void I2Cscan()
413
411
Serial.print (stopScan - startScan);
414
412
Serial.println (F (" milliseconds." ));
415
413
}
414
+
415
+ interrupts ();
416
416
}
417
+
418
+ // -- END OF FILE --
0 commit comments