TWI/I2C-Protokoll mit HMC5883L Magnetometer mit ATMEGA256RFR2 XPLAINED PRO (megaavr)

Ich versuche, die Datenausgaberegister von X, Y, Z zu lesen

Bisher konnte ich:

Send a START - flag 0x08 = START condition transmitted.
Send 0x3C - flag 0x18 = SLA+W transmitted, ACK received.
//For configuring HMC5883L Control Register A & B
Send 0x02 data byte - flag 0x28 = Data byte transmitted, ACK received.
Send 0x00 data byte - flag 0x28 = Data byte transmitted, Ack Received.
Send a Repeat Start - flag 0x10 = Repeat Start condition transmitted.
Send 0x3D - flag 0x40 = SLA+R transmitted, ACK received.

Start > SLA+W > Configure Control Register A & B > Repeat Start > SLA+R > ??

Ich weiß nicht, was ich nach dem Senden eines SLA + R tun soll. Ich habe versucht, ein 0x03 (MSB-Register für Ausgang X) zu senden. Ich bekomme immer wieder einen festen Wert wie (0,10,10,18 - Wiederholung).

Meine Hauptfrage wäre, wie lese ich die Speicheradresse des Slaves bei 0x03, gefolgt von 0x04, 0x05, 0x06, 0x07, 0x08 erfolgreich?

Im Datenblatt steht:

Wenn eines oder mehrere der Ausgangsregister gelesen werden, können keine neuen Daten in irgendeinem der Ausgangsdatenregister platziert werden, bis alle sechs Datenausgangsregister gelesen sind.

Um die Kommunikation zwischen dem Master und diesem Gerät zu minimieren, wird der Adresszeiger automatisch ohne Eingreifen des Masters aktualisiert. Der Registerzeiger wird automatisch um 1 erhöht, nachdem das aktuelle Register erfolgreich gelesen wurde.

Der Adresszeigerwert selbst kann nicht über den I2C-Bus gelesen werden. Jeder Versuch, eine ungültige Adressstelle zu lesen, gibt Nullen zurück, und jeder Schreibvorgang in eine ungültige Adressstelle oder ein undefiniertes Bit innerhalb einer gültigen Adressstelle wird von diesem Gerät ignoriert.

Um den Adresszeiger auf eine zufällige Registerstelle zu verschieben, geben Sie zuerst ein „Schreiben“ an diese Registerstelle aus, ohne dass dem Befehl ein Datenbyte folgt. Um beispielsweise den Adresszeiger auf Register 10 zu verschieben, senden Sie 0x3C 0x0A.

Jede Hilfe wäre willkommen, danke im Voraus!

Antworten (2)

Um den Adresszeiger auf eine zufällige Registerstelle zu verschieben, geben Sie zuerst ein „Schreiben“ an diese Registerstelle aus, ohne dass dem Befehl ein Datenbyte folgt. Um beispielsweise den Adresszeiger auf Register 10 zu verschieben, senden Sie 0x3C 0x0A

Um also ab Register 0x03 zu lesen, versuchen Sie Folgendes:

Start > SLA+W > 0x03 > Repeat Start > SLA+R > read 6x

(Beachten Sie das Wim ersten SLA+W.)

Ich habe das Problem tatsächlich gelöst, aber ein anderes seltsames Problem ist: Wenn ich auf 0x03 schreibe (um den Zeiger zu setzen), bin ich mir nicht genau sicher, wo der Zeiger ist, aber es liest stattdessen 0x04. Um es zu beheben, begann ich bei 0x02, sie funktionierten perfekt. Ich habe dies verifiziert, indem ich die ID-Register A, B, C gelesen habe. Das Lesen der ersten ID bei 0x0A gab mir eine '4', obwohl ich ein 'H' bekommen sollte. Um dies zu korrigieren, fing ich tatsächlich an, ab 0x09 zu lesen, dann gab es mir ein 'H', '4', '3'.

Beachten Sie, dass Sie eigentlich keine Daten schreiben dürfen. Schreiben Sie einfach ein Byte - die Registernummer - und wechseln Sie dann zum Lesen.