I believe I have found a bug. Correct me if I’m wrong.
I have a TE M3200 pressure/temperature sensor with default I2C address 0x36. It wasn’t working with my imp code and I used a logic analyzer to deduce it must have been an address issue.
So I wrote a loop to test all 127 I2C addresses and my sensor only responded when the imp was testing address 108d = 0x6C. I confirmed with my logic analyzer that this is address 0x36 on the actual I2C bus.
Why do I have to write 0x6C to get address 0x36 on the I2C bus?
0x6C is 0x36 right shifted by 1. Is this I2C address convention to include the R/W bit in the address?
Apparently the logic software includes the R/W bit in the I2C address.
Device code:
// This is device code
@include "device/flash.nut"
@include "device/flow-meter.nut"
class TE_M3200 {
_i2c = null;
_addr = null;
constructor(i2c) {
_i2c = i2c;
_addr = 0x35; /* TE M3200 part # M32xx-xxxx1x-xxxxx. The "1" = addr 0x36*/
}
function get() {
for(local address = 0; address < 128; address++){
server.log("trying i2C address " + address);
local reading = _i2c.read(address, "", 4);
server.log(reading)
local error_check = _i2c.readerror();
if(error_check != 0){
server.log("TE M3200 I2C Error " + error_check)
// return error_check;
}
else{
break;
}
}
/*
https://developer.electricimp.com/api/hardware/i2c/readerror
No error 0 Method completed successfully
Controller select error -1 Timeout waiting for bus to be released after sending start
Transmit select error -2 Timeout while selecting transmit mode
Transmit error -3 Timeout while sending data
BTF error -4 Timeout waiting for data transfer to complete
Stop error -5 Timeout waiting for stop condition to be detected
Address clear error -6 Timeout waiting for address flag to be cleared
Address RXNE error -7 Timeout waiting for address to be read
Data RXNE error -8 Timeout waiting for data to be read
Peripheral NACKed error -9 Peripheral NACKs the send
Controller receive select error -10 Timeout while selecting multibyte receive mode
Receive error -11 Timeout during multibyte read
Reselect error -12 Timeout waiting for bus to be released after sending start
Not enabled -13 Attempt to read or write from an unconfigured peripheral
*/
// local pressure_raw = reading[1];
// pressure_raw = pressure_raw | ((reading[0] & 0x3F) << 8);
// local temperature_raw = reading[3] >> 5;
// temperature_raw = temperature_raw | (reading[2] << 3);
// local status = reading[0] >> 6;
// return "Temperature: " + temperature_raw + ", Pressure: " + pressure_raw, ", Status: " + status;
}
}
// Configure an imp001 i2c bus
hardware.i2cJK.configure(CLOCK_SPEED_400_KHZ);
// Create TempSensor object
tempSensor <- TE_M3200(hardware.i2cJK);
// Read temperature
server.log(tempSensor.get());
Output:
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 98
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 99
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 100
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 101
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 102
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 103
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 104
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 105
2020-08-19 14:09:20-0700 [Device] (null : 0x0)
2020-08-19 14:09:20-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:20-0700 [Device] trying i2C address 106
2020-08-19 14:09:21-0700 [Device] (null : 0x0)
2020-08-19 14:09:21-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:21-0700 [Device] trying i2C address 107
2020-08-19 14:09:21-0700 [Device] (null : 0x0)
2020-08-19 14:09:21-0700 [Device] TE M3200 I2C Error -10
2020-08-19 14:09:21-0700 [Device] trying i2C address 108
2020-08-19 14:09:21-0700 [Device] binary: 84 a3 5f 50
2020-08-19 14:09:21-0700 [Device] (null : 0x0)