This is really a 'heads up' for people using 3v3 I2C sensors/devices with a 5v mcu (like the Axon I and Axon II).
Background: I2C normally works, in terms of sending 0s and 1s, by respectively driving the pin to 0V (for a 0) or making the pin 'open' and hence the pull-up resistors pull the line up to the supply voltage at the other end of the resistor.
For user simplicity many libraries, mine included, use the AVR internal pullup resistors (50k) to save you having to add extra resistors to your project. Since the Axons are 5v mcu then this means the 50k resistors pullup the line to 5V (since the current consumed by the attached sensor is minimal).
Assuming your I2C sensors use 5v then 'all is good'.
Next I added a BMP085 device from SparkFun https://www.sparkfun.com/products/11282
which operates at 3v3 and has its own 4k7 pullup resistors to 3v3.
Now the trouble starts........
In terms of powering the device then that's simple - just use the 3v3 power pins from the Axon II (in my case).
Low and behold everything works.
Then I thought - lets make sure my code doesn't crash if the device isn't there. Easy - just turn everything off, unplug the 3v3 supply to the sensor, and power on again - right ? Wrong - it blew up (silently!). What the! So it got me thinking....
With power applied the BMP085 was working at 3v3 but the I2C lines (SDA/SCL) had both the on board 4k7 pullups to 3v3 as well as the Axon 50k pullups to 5v - the result being not much above 3v3. What if i added a whole load of other I2C sensors that had their own pullups to 5v? The result would creep closer to 5v and eventually blow my 3v3 BMP085.
But what happened in my case? Well I guess that by removing the 3v3 supply to the BMP085 then its own pullups were now useless and the Axon pullups now set the I2C bus to 5v rather than 3v3 and so the BMP085 went bang. At least my $20 did !!
So here is what I surmise from this.....if all of your I2C sensors have the same Vcc as your processor then all is good - so long as something has a pullup - ie one or more sensors or your library does it on the mcu. The trouble begins when ANY of your I2C devices use supply voltages that are lower than your mcu.....
1. If the sensor boards have their own on-board pullups, and need different Vcc supplies, then you are stuffed!!! The actual voltage on the bus will be dictated by the combination of sensors: their on-board pullup resistors and their values. ie Adding 5v sensor number 10 could make 3v3 sensors 1,2, and 3 blow up.
2. Put different Vcc sensors on different I2C buses. eg for a 5V mcu like the Axon I or Axon II then you could use the hardware I2C with its internal pullups to drive 5V sensors. If you have 3v3 sensors then use a bus with no pullups on the mcu and just use the pullups on the sensors - or if none then add your own pullups to the 3v3 supply.
3. A 3v3 mcu like the Axon Mote probably doesn't have the same problem - so long as its I2C sensors are 3v3 or higher.
You electro guys will no doubt come back to me ... but in the meantime I guess I have to 'blow' another $20 on a new BMP085 !