Hallo zusammen. Ich habe ein Problem mit einem I2C Gerät, dem Wärmesensor TPA81. Ich möchte zwei der Sensoren an einen Bus hängen, und daher die Adresse des einen ändern. Das soll laut Datenblatt auch gehen (siehe [1]): "Changing the I2C Bus Address To change the I2C address of the TPA81 you must have only one module on the bus. Write the 3 sequence commands in the correct order followed by the address. Example; to change the address of a TPA81 currently at 0xD0 (the default shipped address) to 0xD2, write the following to address 0xD0; (0xA0, 0xAA, 0xA5, 0xD2 ). These commands must be sent in the correct sequence to change the I2C address, additionally, No other command may be issued in the middle of the sequence. The sequence must be sent to the command register at location 0, which means 4 separate write transactions on the I2C bus. Additionally, there MUST be a delay of at least 50uS between the writing of each byte of the address change sequence. ..." Was genau muss ich denn nun schicken? Ich habe folgendes probiert unter Verwendung der I2C (TWI) Master Software Library (siehe [2]):
1 | tempI2C = i2c_start(SLAVE_ADDRESS + I2C_WRITE); |
2 | i2c_write(0x00); // register to write to |
3 | i2c_write(0xA0); // 3 bytes to set the new address |
4 | delayus (60); |
5 | i2c_write(0xAA); |
6 | delayus (60); |
7 | i2c_write(0xA5); |
8 | delayus (60); |
9 | i2c_write(0xD2); // the new address: D2 |
10 | delayus (60); |
11 | i2c_stop(); // terminate connection |
Muss ich das Register, in das geschreiben werden soll, jeweils nochmal senden, also so:
1 | tempI2C = i2c_start(SLAVE_ADDRESS + I2C_WRITE); |
2 | i2c_write(0x00); // 3 bytes to set the new address |
3 | i2c_write(0xA0); |
4 | delayus (60); |
5 | i2c_write(0x00); |
6 | i2c_write(0xAA); |
7 | delayus (60); |
8 | i2c_write(0x00); |
9 | i2c_write(0xA5); |
10 | delayus (60); |
11 | i2c_write(0x00); |
12 | i2c_write(0xD2); // the new address: D2 |
13 | delayus (60); |
14 | i2c_stop(); // terminate connection |
Oder muss die die ganze Transaktion (inkl. i2cstart, i2cstop) immer wieder schicken? Oder das ganze mit i2c_rep_start beginnen? Etwas ratlos, Joe [1] http://www.robot-electronics.co.uk/htm/tpa81tech.htm [2] http://jump.to/fleury