So zeigen Sie die I2C-Adresse in hex an

7

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 (R/W¯).
7-Bit-Kommunikation über die I2C-Busspezifikation

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 R/W¯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:

  1. Konvertieren Sie die 7-Bit-Adresse in einen Hexadezimalwert im Bereich 0x00von0x7F
  2. Umfassen die R/W¯Bit wie das LSB und geben zwei Adressen an, eine zum Lesen und eine zum Schreiben im Bereich 0x00bis0xFF

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?

Xcodo
quelle
2
+1 für die Frage, auch ich habe dieses Problem bei der Definition der Schnittstelle zu I2C-Bibliotheken konfrontiert. Ich habe immer die 7-Bit-Adresse verwendet (mit einigen Schmerzen im Herzen, weil dies eine zusätzliche Verschiebung bedeutet, die irgendwo in der Implementierung verbleibt), weil das Originaldokument von Philips auf diese Weise Adressen aufschrieb. PS: Das neue C ++ 0x14 hat binäre Literale und 'wie erlaubt Rauschen, so dass Sie das Literal 0b'110'1100
Wouter van Ooijen

Antworten:

3

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.

Olin Lathrop
quelle
Mein Ausgangspunkt war, dass der 7-Bit-Wert der einzige Weg war. Es ist nur schade, dass die STM32 HAL-Bibliothek, auf die meine Kollegen im Moment abzielen, nicht übereinstimmt!
Xcodo
0

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.

geometrisch
quelle
2
Ich komme aus einer stark typisierten, flexiblen VHDL-Welt mit Array-Breite. Meine I2C-Adresskonstanten werden immer sein 6 downto 0! Ich denke, Sie lernen, die Übereinstimmung der binären
Literalbreiten
0

Es 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:

periph_i2c addr: {1 1 0 0 1 0 1 r/w} (0x65 hex)

Dies macht deutlich, welches ich meine.

hacktastisch
quelle