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:
Sun Mar 20 23:51:00 2016 +0000
Revision:
2:e90c47d4f358
Parent:
1:2363995f603f
Child:
3:8def8fb70765
updated comment

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 0:befb557584fb 6 * Free use for al 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 0:befb557584fb 28 void scanI2C() {
joeata2wh 0:befb557584fb 29 int address;
joeata2wh 0:befb557584fb 30 int ack;
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 0:befb557584fb 45
joeata2wh 0:befb557584fb 46 ack = i2c.write(71, "11", 1);
joeata2wh 0:befb557584fb 47
joeata2wh 0:befb557584fb 48 while(1) {
joeata2wh 0:befb557584fb 49 wait(5.0);
joeata2wh 0:befb557584fb 50 myled = !myled;
joeata2wh 0:befb557584fb 51 }
joeata2wh 0:befb557584fb 52 }
joeata2wh 0:befb557584fb 53