mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Sensor TPA81: Adresse wechseln?


Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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]):
    tempI2C = i2c_start(SLAVE_ADDRESS + I2C_WRITE);
      i2c_write(0x00);  // register to write to
      i2c_write(0xA0);  // 3 bytes to set the new address
      delayus (60);
      i2c_write(0xAA);  
      delayus (60);
      i2c_write(0xA5);  
      delayus (60);
      i2c_write(0xD2);  // the new address: D2
      delayus (60);
      i2c_stop();   // terminate connection

Muss ich das Register, in das geschreiben werden soll, jeweils nochmal 
senden, also so:
    tempI2C = i2c_start(SLAVE_ADDRESS + I2C_WRITE);
      i2c_write(0x00);  // 3 bytes to set the new address
      i2c_write(0xA0);  
      delayus (60);
      i2c_write(0x00);  
      i2c_write(0xAA);  
      delayus (60);
      i2c_write(0x00);  
      i2c_write(0xA5);  
      delayus (60);
      i2c_write(0x00);  
      i2c_write(0xD2);  // the new address: D2
      delayus (60);
      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

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig verstehe, muss du das Regsiter (0x00) nicht 
angeben, das erkennt er wohl automatisch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.