Forum: Mikrocontroller und Digitale Elektronik Falsche I2C Adresse: Chinaschrott oder Verständnisproblem


von HS (Gast)


Lesenswert?

Hallo Zusammen,

auf einem zugegebenermaßen äußerst billigen  Display finden sich auf der 
Platine die I2C-Adresse 0x78 und 0x7A. (Wobei es auf meiner Platine so 
unsauber gedruckt ist, dass es auch 0x7B heißen könnte).

Funktioniert aber alles nicht. Was funktioniert ist 0x3C. Controller ist 
ein SSD 1306.

Ist das ein Fehler in der Hardware/im Aufdruck oder verstehe ich etwas 
falsch - und wenn ja, dann wüsste ich natürlich auch gerne was... ;-)

Thx u. Grüße


PS: Hier ein Foto 
https://images-na.ssl-images-amazon.com/images/I/71GKhNAcDbL._SL1500_.jpg

von Hauke Haien (Gast)


Lesenswert?

https://www.heise.de/select/make/2017/3/1498421637812722

Dein Problem ist hier (weiter unten) beschrieben.

von Wolfgang (Gast)


Lesenswert?

HS schrieb:
> Ist das ein Fehler in der Hardware/im Aufdruck oder verstehe ich etwas
> falsch

Es gibt Leute, die geben die I2C-Adresse wie in der Spezifikation von 
Philips als 7-Bit Wert an. Dann besteht das erste übertragene Byte aus 
den 7 Adressbits und dem R/W-Bit und es gibt Leute, die geben das erste 
Byte als Adressbyte an.

0x3C würde allerdings eher zu 0x78/0x79 passen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

HS schrieb:
> Was funktioniert ist 0x3C

...

> oder verstehe ich etwas falsch

Das ist das übliche und weit verbreitete Problem der 7- bzw. 
8-Bit-Adressen von I2C.

0x3C << 1 == 0x78

Bei 8-Bit-Darstellung wird das R/W-Bit zur Adresse hinzugefügt.

von Wolfgang (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Das ist das übliche und weit verbreitete Problem der 7- bzw.
> 8-Bit-Adressen von I2C.

Es könnte alles so einfach sein, wenn sich jeder bei seiner Bezeichnung 
an die Spezifikation halten würden (UM10204 Fig.9) und es den Leuten 
beizubringen wäre, Adresse und erstes Byte ("Address Byte") auseinander 
zu halten.
https://www.nxp.com/docs/en/user-guide/UM10204.pdf

von Wolfgang (Gast)


Lesenswert?

HS schrieb:
> I2C-Adresse 0x78 und 0x7A

p.s. die beiden aufgedruckten Adressen beziehen sich auf den Lötjumper 
für den D/C-Pin (SA0 im I2C Mode)

von HS (Gast)


Lesenswert?

Danke. Also kein Chinaschrott, also zumindest nicht deswegen ... u. ich 
hab was gelernt.

von M. K. (sylaina)


Lesenswert?

HS schrieb:
> Ist das ein Fehler in der Hardware/im Aufdruck oder verstehe ich etwas
> falsch - und wenn ja, dann wüsste ich natürlich auch gerne was... ;-)

Wie es schon gesagt wurde, ist es eine Frage der Adress-Darstellung. Auf 
der Platine ist der 8-Bit-Code abgedruckt. Und das ist im Prinzip auch 
richtig so denn Slaves, und das ist dein Display ja, arbeiten mit der 
8-Bit-Darstellung (0x78) während Master mit der 7+1-Bit-Darstellung 
arbeiten (hier wird dann 0x3C vorgegeben, der Mastercode hängt dann das 
letzte Bit hinten dran). Ich hab diesen Fehler auch in meinen Mastercode 
drin, werde ich irgendwann noch abändern müssen (hab ja auch eine Lib zu 
den SSD1306-Controllern geschrieben)

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Und das ist im Prinzip auch richtig so denn Slaves, und das ist
> dein Display ja, arbeiten mit der 8-Bit-Darstellung (0x78) während
> Master mit der 7+1-Bit-Darstellung arbeiten

Wofür gibt es eigentlich Spezifikationen?
Propagierst du jetzt, das Master und Slave bei der Kommunikation 
nominell unterschiedliche Adressen verwenden?

Damit wird die Welt nicht übersichtlicher.

Der Slave hat genauso eine 7 Bit Adresse und die Datenrichtung wird 
genauso über das nachfolgend übertragene Bit spezifiziert.

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Wofür gibt es eigentlich Spezifikationen?
> Propagierst du jetzt, das Master und Slave bei der Kommunikation
> nominell unterschiedliche Adressen verwenden?

Nein, ihre Adresse ist gleich aber die Darstellung wird unterschiedlich 
gehandhabt, auch in der eigentlichen Spezifikation. ;)

von Wolfgang (Gast)


Lesenswert?

M. K. schrieb:
> Nein, ihre Adresse ist gleich aber die Darstellung wird unterschiedlich
> gehandhabt, auch in der eigentlichen Spezifikation. ;)

Wo? Ich konnte nicht finden, was der 7Bit Spezifikation widerspricht.

Auch dort wird von 7 Bit Slave Address gesprochen und in den Abbildungen 
sind genau diese 7 Bit als "Address" bezeichnet. Im Text tauchen IMHO 
auch immer 7Bit Adressen (gesetzt als 4+3 Bit) auf.

Aber diese Diskussion scheint wohl fruchtlos und man wird weiterhin mit 
beiden Sprachgebräuchen leben müssen.

von Stefan F. (Gast)


Lesenswert?

Wenn man das bit 7 für R/W verwendet hätte, gäbe es dieses 
Missverständnis nicht.

von Jim M. (turboj)


Lesenswert?

HS schrieb:
> Was funktioniert ist 0x3C.

Das war keine Überraschung:
1
0x3C<<1 == 0x78

Oftmals ist deswegen auch eine Wellenform für das I²C Signal angegeben, 
weil die 7-Bit Addressen manchmal geshiftet sind und manchmal nicht.

von W.S. (Gast)


Lesenswert?

Wolfgang schrieb:
> Der Slave hat genauso eine 7 Bit Adresse und die Datenrichtung wird
> genauso über das nachfolgend übertragene Bit spezifiziert.

Ganz so einfach ist das nicht. Manche Slaves arbeiten eben NUR in einer 
Richtung und reagieren auf die andere garnicht. Also wäe es logisch, 
grundsätzlich immer nur die 8 Bit Darstellung zu wählen. Da weiß man 
präzise, worauf so ein Slave überhaupt reagiert.

Aber abgesehen von dieser Theoretisiererei ist es doch ganz easy: 
Einfach mal nen Scan aller Adressen machen und ab da weiß man, was man 
zu wissen braucht.

W.S.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

W.S. schrieb:
> Also wäe es logisch,
> grundsätzlich immer nur die 8 Bit Darstellung zu wählen.

Genau das ist "the root of all evil".

Besser wäre schon, nur devices mit Adressen >64 zu verwenden, da ist 
sofort klar ob 7 oder 8 bit :-)

von Andi B. (andi_b2)


Lesenswert?

Da der Erfinder, Philips, in den Anfangszeiten von I²C üblicherweise die 
Adresse als Adressbyte mit LSB = R/W angegeben hat, bleibe ich dabei. 
Also Adresse ist AAAA AAAx. Das die Linuxianer, und so manch Anderer, 
die Bits nach unten schiebt, ist deren Ding. Was jetzt NXP/Qualcomm 
macht, weiß ich nicht. Aber in den Anfängen wurde immer das Byte als 
Adresse genannt. Und Adresse + 1 war dann logischerweise die 
Leseadresse.

Leider hat es Philips verabsäumt, dies explizit im Standard so 
festzuschreiben. Wahrscheinlich deshalb, weil es eh jedem klar war. Aber 
dann kamen die Linuxianer....

von Stefan F. (Gast)


Lesenswert?

Viele I²C Mikrochips haben mehr oder weniger Leitungen zur Einstellung 
einiger Adress-Bits. Diese heissen üblicherweise A0, A1, A2, usw.

A0 ist hierbei das niedrigste Bit der 7bit Adresse - nicht das 
niedrigste Bit des Bytes!

von Klaus (Gast)


Lesenswert?

Andi B. schrieb:
> Leider hat es Philips verabsäumt, dies explizit im Standard so
> festzuschreiben. Wahrscheinlich deshalb, weil es eh jedem klar war. Aber
> dann kamen die Linuxianer....

Das ist doch Unsinn. In vielen, zum Teil immer noch üblichen, 
Datenprotokollen werden Bits und Bitfelder in einem Datenbyte, meisst 
eher Oktet genannt, übertragen. Bei HDLC kann man zb. zwei 3bit Felder 
und zwei Bits in einem Oktet finden. Wenn man das in einem Stück 
bearbeiten würde, bekäme man nie einen Funktionierenden Protokollstack 
hin.

Das sprengt natürlich das Verständniss der Nicht-Linuxianer, die über 
die für den mechanischen Fernschreiber erfundene asynchrone 
Schnittstelle nie wirklich hinausgekommen sind.

MfG Klaus

von Wolfgang (Gast)


Lesenswert?

Andi B. schrieb:
> Da der Erfinder, Philips, in den Anfangszeiten von I²C üblicherweise die
> Adresse als Adressbyte mit LSB = R/W angegeben hat, bleibe ich dabei.
> Also Adresse ist AAAA AAAx.

Dann mal Butter bei die Fische

Wo liest du das?

In der oben verlinkten UM10204 von NXP ist davon nichts zu erkennen - 
und das ist die zuletzt 2014 überarbeitet Revision, der ursprünglich von 
Philips herausgegebenen Originalausgabe der Spezifikation von 1982.

von Bernd K. (prof7bit)


Lesenswert?

Die Adresse ist die Adresse

und das R/W Bit ist das R/W Bit

und das ACk-Bit ist das ACK Bit

Jedes ist für sich

Alle zusammen brauchen 9 Bit.

Die Adresse braucht 7 Bit. Das R/W-Bit hat nichts mit der Adresse zu 
tun. Sonst hätte jeder Slave 2 Adressen und das R/W-Bit wäre nirgendwo 
als solches erwähnt.

Punkt.

von spess53 (Gast)


Lesenswert?

Hi

> Bei HDLC kann man zb. zwei 3bit Felder
>und zwei Bits in einem Oktet finden. Wenn man das in einem Stück
>bearbeiten würde, bekäme man nie einen Funktionierenden Protokollstack
>hin.

Und was hat das mit den I2C-Adressen zu tun?

MfG Spess

von Bernd K. (prof7bit)


Lesenswert?

Andi B. schrieb:
> Aber dann kamen die Linuxianer....

Wie lange hast Du gebraucht um einen Zusammenhang zu Linux und 
imaginären "Linuxianern" herbeizufantasieren bei diesem Thema das 
absolut null und nichts damit zu tun hat, aber auch sowas von gar 
nichts, und zwar nicht mal im Entferntesten? Bist Du etwa ein 
Windowsianer und suchst Streit?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.