I2c bus scanning

Is there a simple way to scan the I2C bus and poll for any device response ? In theory I know it’s possible to detect as I do this all the time on bare metal LPC devices, just not sure the imp API or the STM supports it.

Already found a way. This little piece of code does the trick and seems to work on all I2C devices I tested in the meantime

i2c <- null;
Address <- 0;

function initHardware()
{
	i2c <- hardware.i2c0; // imp005
	i2c.configure(CLOCK_SPEED_100_KHZ);
}


function findDevice() 
{
    local e = i2c.write(Address,"\x00"); //Try write some data
    if (e == 0 )// NO_ERROR => Found something.
		server.log(format("Found device @ address 0x%02x", Address>>1));

    Address+=2; //Increment by 2.
    if (Address < 254)
	    imp.wakeup(0.1, findDevice.bindenv(this));
	 else
	    server.log("Finished scanning");
}

initHardware();
server.log("Startscanning");
findDevice();

This alternative is from the Knowledgebase and is more compact:

i2c <- hardware.i2c89;   // Set to desired I2C bus
i2c.configure(CLOCK_SPEED_100_KHZ);

for (local i = 2 ; i < 256 ; i+=2) {
    if (i2c.read(i, "", 1) != null) server.log(format("Device at address: 0x%02X", i));
}

It’s also best not to write arbitrary things to devices if at all possible :slight_smile: