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.

main.cpp

Committer:
joeata2wh
Date:
2016-03-20
Revision:
1:2363995f603f
Parent:
0:befb557584fb
Child:
2:e90c47d4f358

File content as of revision 1:2363995f603f:

/* Scan I2C bus on specified pins and prints out
* the address of all pins where a active responder
* is found. 
*
* By Joe Elsworth CTO of A2WH
* Free use for al but no warranty, no promises.
* Don't forget 3K pullup sda,scl */

#include "mbed.h"


Serial pc(USBTX, USBRX);

 #define D_SDA                  PB_7 
 #define D_SCL                  PB_6 
   // sda=PB7, scl=PB_6 Pins specific to Nucleo-F303K8
  // must change pins to match your board.

I2C i2c(D_SDA, D_SCL);  
  
DigitalOut myled(LED1);
 
void scanI2C() {
  int address;
  int ack;  
  for(address=1;address<127;address++) {    
    ack = i2c.write(address, "11", 1);
    if (ack == 0) {
       pc.printf("\tFound at %3d -- %3x\r\n", address,address);
    }    
    wait(0.05);
  } 
}
 
int main() {
  pc.baud(9600);
  pc.printf("I2C scanner \r\n");
  scanI2C();
  pc.printf("Finished Scan\r\n");
  
  ack = i2c.write(71, "11", 1);
   
  while(1) { 
      wait(5.0);          
      myled = !myled;
  }
}