Der I2C-Kommunikationsbus verwendet eine 7-Bit- oder 10-Bit-Adressierung, um Slave-Geräte zu adressieren. Unter Verwendung der allgemeineren 7-Bit-Adressen beginnt jedes vom Master auf dem Bus gesendete Paket mit einer 7-Bit-Adresse, gefolgt von einer 1-Bit-Lese- oder Schreibanzeige ().
Die meisten Datenblätter geben die I2C-Adresse für ihr Gerät entweder in binärer Notation oder als Bits in Zeitdiagrammen (mit Hinweisen für konfigurierbare Adressbits) an. Beide sind eindeutig, da sie entweder sieben oder acht Bits anzeigen, sodass Sie feststellen können, ob die Bit ist enthalten. Dies scheint der offiziellen NXP I2C-Spezifikation zu folgen .
Das Problem tritt auf, wenn versucht wird, die Adresse in hexadezimaler Form aufzuschreiben. Verschiedene Quellen konvertieren die Adresse auf unterschiedliche Weise:
- Konvertieren Sie die 7-Bit-Adresse in einen Hexadezimalwert im Bereich
0x00
von0x7F
0b101 0011
wird0x53
- Beispiele Tutorial Robot Electronics I2C , Linux i2cdetect-Tool , STM32-CPAL-Bibliothek , Arduino Wire-Bibliothek
- Umfassen die Bit wie das LSB und geben zwei Adressen an, eine zum Lesen und eine zum Schreiben im Bereich
0x00
bis0xFF
0b101 0011
wird0xA6
zum Schreiben und0xA7
zum Lesen- Manchmal wird nur die Schreibadresse (zB
0xA6
) angegeben - Beispiele: 8051-Projekt-Tutorial , STM32-HAL-Bibliothek ( Beispiel für Verwirrung ), Microchip-PIC-Codebeispiele (CE119) , Saleae Logic-Protokollanalysator
Diese beiden Optionen sind nicht immer unterscheidbar.
Die Verwendung der binären Notation ist eindeutig besser, da Sie eine eindeutige Adresse erhalten. Dies ist jedoch nicht immer möglich. Ein bemerkenswerter Fall ist C / C ++, wo es keine besonders standardmäßige Methode zum Schreiben von Binärzahlen gibt . Dies führt zu dem Problem, bei dem die Angabe von Konstanten für Geräte in der Schaltung nicht eindeutig ist.
Bei der Auswahl eines Standards für unsere Schaltpläne, Dokumentation und Code (C ++) müssen wir uns also für die eine oder andere Art entscheiden. Das führt zu meiner Frage:
Gibt es eine dominante Möglichkeit, eine I2C-Adresse in hexadezimaler Schreibweise anzuzeigen, oder werden beide häufig verwendet?
Antworten:
Ich weiß, was du meinst. Ich habe diese Unklarheiten auch in der Dokumentation gesehen. Das macht es aber nicht richtig.
Ich persönlich kommuniziere die Adresse nur als 7-Bit-Wert, sei es binär (0-1111111), hexadezimal (0-7F), dezimal (0-127) oder in einem anderen Schema. Das R / W-Bit ist NICHT Teil der Adresse. Es und die Adresse sind zwei separate Felder, die zufällig in dasselbe Byte gepackt sind.
Obwohl die 7-Bit-Adressinterpretation korrekt ist und häufiger vorkommt, gibt es leider viele schlechte Dokumentationen. Dies bedeutet, dass Sie nicht auf das nächste Datenblatt zählen können, das Sie gelesen haben, um dies auf die eine oder andere Weise zu tun. Wenn Sie die Dokumentation lesen, müssen Sie sich nur dieses Problems bewusst sein und besonders darauf achten, wie genau die Adresse angezeigt wird. Bisher bin ich noch nicht auf ein Datenblatt gestoßen, bei dem dies letztendlich nicht herausgefunden werden konnte.
Wenn Sie Ihre eigene Dokumentation schreiben, tun Sie bitte dem Rest der Welt einen Gefallen und drücken Sie die "Adresse" als 7-Bit-Wert aus. Wenn Sie es mit dem R / W-Bit anzeigen möchten, nennen Sie es das "Adressbyte" oder etwas, um dies zu verdeutlichen.
quelle
Nach meiner Erfahrung besteht die häufigste Art, eine I2C-Adresse auszudrücken, darin, die 7-Bit-Form hexadezimal zu verwenden.
Seien Sie konsequent, um keine Mehrdeutigkeiten zu vermeiden:
Stellen Sie in Ihrem I2C-Code sicher, dass jede I2C-Funktion die 7-Bit-Adresse als Argument und nicht die 8-Bit-Adresse verwendet.
In Ihrer Dokumentation wird die Adresse immer als 7-Bit-Adresse bezeichnet.
Hinweis: Ich habe mich gefragt, was Sie damit gemeint haben, dass Binärdateien weniger mehrdeutig sind, und mir wurde klar, dass Sie bei Binärdateien mit Nullen auffüllen können, um eine Zahl mit 7 oder 8 Ziffern zu erhalten und somit zwischen diesen zu unterscheiden. Klug! Ich frage mich, ob die Leute überhaupt eine Ziffer weniger bemerken werden, also wahrscheinlich am besten explizit.
quelle
6 downto 0
! Ich denke, Sie lernen, die Übereinstimmung der binärenEs gibt keinen Standard und es ist eine endlose Quelle der Trauer. Linux i2cset und i2cget verwenden die 7-Bit-Notation, so dass dies dem Standard am nächsten kommt. Es gibt andere Tools / Plattformen, die 8-Bit verwenden. Datenblätter sind nicht konsistent. Chaos!
Wenn ich eine Dokumentnotation zu I2C mache, werde ich sie wie folgt als binären und hexadezimalen Wert (7-Bit) darstellen:
Dies macht deutlich, welches ich meine.
quelle