I2C address scanner - Scans I2C bus on specified pins and prints all addresses where a active responder is found.

Dependencies:   mbed

Find address for I2C device

Scans all addreses on a I2C bus and reports those it is able to sucessfully communicate with.

One problem with I2C is that sometimes we receive chips without proper documentation and can not determine what address we should use ot communicate with that chip. This library seeks to identify the chips by attempting to communicate with each address and if it suceeds it assumes there is a chip present.

I have tested this with a clock chip, temperature sensor, OLED device and FRAM chip. It worked for all of them but there is a chance that some chips will not respond without a specific API call so there may be some chips it could not locate.

Committer:
joeata2wh
Date:
Mon Mar 21 04:09:15 2016 +0000
Revision:
5:a4fddd74263c
Parent:
4:ad1195c10812
Child:
6:02a058f2ec6f
removed obsolete diagnostic line

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joeata2wh 0:befb557584fb 1 /* Scan I2C bus on specified pins and prints out
joeata2wh 2:e90c47d4f358 2 * the all address where a active responder
joeata2wh 0:befb557584fb 3 * is found.
joeata2wh 0:befb557584fb 4 *
joeata2wh 0:befb557584fb 5 * By Joe Elsworth CTO of A2WH
joeata2wh 3:8def8fb70765 6 * Free use for all but no warranty, no promises.
joeata2wh 2:e90c47d4f358 7 * Don't forget 3K pullup sda,scl
joeata2wh 2:e90c47d4f358 8 *
joeata2wh 2:e90c47d4f358 9 * I tested this by soldering in a I2C chip known to respond at
joeata2wh 2:e90c47d4f358 10 * address dec=120 hex=70 and the utility got the ack as expected.
joeata2wh 2:e90c47d4f358 11 * when the chip was de-soldered it was no longer detected.
joeata2wh 2:e90c47d4f358 12 */
joeata2wh 0:befb557584fb 13
joeata2wh 0:befb557584fb 14 #include "mbed.h"
joeata2wh 0:befb557584fb 15
joeata2wh 0:befb557584fb 16
joeata2wh 0:befb557584fb 17 Serial pc(USBTX, USBRX);
joeata2wh 0:befb557584fb 18
joeata2wh 1:2363995f603f 19 #define D_SDA PB_7
joeata2wh 0:befb557584fb 20 #define D_SCL PB_6
joeata2wh 0:befb557584fb 21 // sda=PB7, scl=PB_6 Pins specific to Nucleo-F303K8
joeata2wh 0:befb557584fb 22 // must change pins to match your board.
joeata2wh 0:befb557584fb 23
joeata2wh 0:befb557584fb 24 I2C i2c(D_SDA, D_SCL);
joeata2wh 0:befb557584fb 25
joeata2wh 0:befb557584fb 26 DigitalOut myled(LED1);
joeata2wh 0:befb557584fb 27
joeata2wh 4:ad1195c10812 28 int ack;
joeata2wh 0:befb557584fb 29 void scanI2C() {
joeata2wh 4:ad1195c10812 30 int address;
joeata2wh 0:befb557584fb 31 for(address=1;address<127;address++) {
joeata2wh 0:befb557584fb 32 ack = i2c.write(address, "11", 1);
joeata2wh 0:befb557584fb 33 if (ack == 0) {
joeata2wh 0:befb557584fb 34 pc.printf("\tFound at %3d -- %3x\r\n", address,address);
joeata2wh 0:befb557584fb 35 }
joeata2wh 0:befb557584fb 36 wait(0.05);
joeata2wh 0:befb557584fb 37 }
joeata2wh 0:befb557584fb 38 }
joeata2wh 0:befb557584fb 39
joeata2wh 0:befb557584fb 40 int main() {
joeata2wh 0:befb557584fb 41 pc.baud(9600);
joeata2wh 0:befb557584fb 42 pc.printf("I2C scanner \r\n");
joeata2wh 0:befb557584fb 43 scanI2C();
joeata2wh 0:befb557584fb 44 pc.printf("Finished Scan\r\n");
joeata2wh 5:a4fddd74263c 45 // just blink to let us know the CPU is alive
joeata2wh 0:befb557584fb 46 while(1) {
joeata2wh 0:befb557584fb 47 wait(5.0);
joeata2wh 0:befb557584fb 48 myled = !myled;
joeata2wh 0:befb557584fb 49 }
joeata2wh 0:befb557584fb 50 }
joeata2wh 0:befb557584fb 51