Wie einige von Ihnen betreibe ich Elektronik als Hobby und bin jetzt relativ dazu, daher habe ich ein paar Fragen zur Kommunikation zwischen meinem Odroid XU4 und einem netten I2C-Modul von Olimex namens MOD-IO . Lassen Sie mich Ihnen etwas Kontext geben.
Für eines meiner Projekte hatte ich einen Raspberry Pi 3 wie im Bild unten mit dem MOD-IO verbunden:
Um die Adresse zu erkennen, habe ich gerade die i2c-tools-Bibliothek verwendet i2cdetect -y 1
und würde Folgendes erhalten:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Kürzlich hatte ich mir einen Odroid XU4 als Ersatz für den Raspberry Pi 3 zugelegt, da für mein Projekt mehr Rechenleistung benötigt wurde. Da die Logik des Odroid bei 1,8 V liegt (im Gegensatz zu 3,3 V beim Raspberry Pi) und MOD-IO 3,3 VI beträgt, dachte ich, dass ein Level-Shifter den Zweck erfüllen sollte. Die Anschlüsse sind wie auf dem Bild:
Ich habe festgestellt, dass Odroid i2c_1 in der Software auf i2c-4 abgebildet ist. Bestätigt wurde dies auch, indem i2cdetect -y 4
ich beim Prüfen mit einem Oszilloskop lief (ich bin hier ein Neuling, habe gerade gesehen, dass ich nur auf i2c-4 sowohl auf SDA als auch auf SCL einen Messwert auf dem Oszilloskop erhalte).
Beim Ausführen i2cdetect -y 4
erhalte ich jedoch gemischte Ergebnisse in der Konsole:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- 07 -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- 1c -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- 36 -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- 4b 4c -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
entweder zufällige Lesungen oder gar keine.
DEBUGGING oder was ich versucht habe.
MOD-IO vollständig entfernt und das Oszilloskop als Referenz verwendet. Wenn ich die Erkennung direkt auf den Odroid-Pins (SDA oder SCL) ausführe, erhalte ich einen Messwert auf dem Oszilloskop. Auch wenn ich nach dem Level Shifter detektieren laufe, gibt es einen Messwert auf dem Oszilloskop. Daraus folgerte ich, dass der Shifter in Ordnung ist.
Zweitens habe ich ein anderes Gerät angeschlossen, das 3,3 V verwendet, und am Raspberry Pi gearbeitet - einen BMP180-Sensor . Dieser wird analog zum MOD-IO angeschlossen. Wenn detect läuft bekomme ich 0x77 als Adresse. Ich kann sogar den Druck ablesen. Also denke ich, dass an der Schalthebel-Idee nichts furchtbar falsch ist.
Ich habe im Rpi-Forum gelesen, dass der Raspberry Pi einen internen Pull-up-Widerstand von 1,8 k hat, aber ich konnte nichts über Odroid I2C-Pull-up finden. Ich habe versucht, einen Pull-up-Widerstand auf der 3,3-V-Seite des Pegelumsetzers zu 3,3 V VCC hinzuzufügen, und indem ich dieses TI-Dokument über die Berechnung des I2C-Bus-Pull-up-Widerstands als Referenz (z. B. 4) verwendet habe, habe ich 1 k als Wert gewählt, aber umsonst.
Ich versuche, ein Olimex MOD-IO (3,3-V-Logik) über einen I2C-Bus mit einem Odroid XU4 (1,8-V-Logik) über einen bidirektionalen Pegelwandler zu verbinden, und ich kann es nicht zum Laufen bringen.
Hat jemand eine Ahnung, was ich falsch mache? Können Sie mich in die richtige Richtung weisen?
Erstmal danke Jungs für all eure Inputs. Heute habe ich das gemacht, was ich für einen Schritt nach vorne halte.
Kontext: Es wurde versucht, sowohl der 1,8-V-Leitung als auch der 3,3-V-Leitung verschiedene Klimmzüge hinzuzufügen.
Richten Sie zuerst 1k auf dem 1.8v (SDA & SCL) und 4k7 auf dem 3.3v ein. Zu diesem Zeitpunkt habe ich zum ersten Mal die I2C-Adresse gelesen. Ich habe einen Messwert für die Adresse 0x40 erhalten, aber als ich einen zweiten Messwert versuchte, war ich wieder am Anfang.
Nach dem Zurücksetzen des MOD-IO bekomme ich also einen Messwert und die gleiche zufällige Adresse auf dem zweiten. Also habe ich das Oszilloskop angeschlossen und weiter debuggt.
Was ich weiter versuchte, war, die 1,8-V-Widerstände durch einen größeren 2k2-Widerstand zu ersetzen, aber dies führte zu keiner Änderung des Ergebnisses. Das Ändern der 3,3-V-Klimmzüge auf 2k2 machte es noch schlimmer, also hörte ich auf, mit den Klimmzügen nach unten zu gehen. Ich habe versucht, die 3,3 V mit einer 10k zu ändern, aber das Ergebnis änderte sich wenig bis gar nicht.
Die endgültige Version des Setups ist also jetzt mit einem 2k2 auf der 1,8-V-Leitung (SDA & SCL) und einem 10k auf der 3,3-V-Leitung (SDA & SCL).
Dann fing ich an, das Oszilloskop zu fotografieren, wie ich es tat i2cdetect
(keine leichte Aufgabe :D).
Zuerst war die 1,8-V-Leitung. Dies habe ich direkt vor dem Pegelumsetzer mit abgeschaltetem MOD-IO gemacht, da ich weder mit dem Oszilloskop noch mit dem MOD-IO etwas ablesen konnte. Hier ist, was ich habe: imgur
Zweitens war die 3,3-V-Leitung. Dies wurde mit angeschlossenem MOD-IO durchgeführt. Beim ersten Erkennen habe ich die richtige Adresse erhalten, aber beim zweiten Mal ist der Vorgang mit zufälligen Adressen erneut fehlgeschlagen. imgur
Was mir hier seltsam aufgefallen ist, ist das Rauschen auf dem SCL 3.3v und dem SDA 3.3v, das bei/nach der zweiten Erkennung niedrig wird und so bleibt, bis das MOD-IO zurückgesetzt wird (funktioniert nicht immer, manchmal muss ich es zurücksetzen ein paar Mal, damit die Erkennung die richtige Adresse anzeigt).
Beachten Sie auch, dass die Bilder sequentiell aufgenommen wurden, da das Oszilloskop einen Kanal hat.
Also, was denkt ihr, sollte ich als nächstes tun?
Da ich keinen Erfolg beim Ausleihen eines guten Zielfernrohrs hatte, beschloss ich, etwas Geld zu sparen und ein anständiges Zielfernrohr zu kaufen. Die Lieferung hat einige Zeit gedauert, also hier sind einige Bilder von dem, was ich bekommen habe (ich bin immer noch am Umfang, also sei vorsichtig :D).
Als Erwähnung habe ich das gleiche Setup mit einem Pull-up von 2k2 auf 1,8 V und einem 10k auf 3,3 V beibehalten.
Was mache ich als nächstes? Was haltet ihr davon?
Sie müssen den Pegelumsetzer ändern. Der XU4 ist sehr wählerisch. Ich hatte einen Level-Shifter, der Ihrem sehr ähnlich war - wahrscheinlich genau derselbe, aber meiner hat eine blaue Platine - und konnte ihn nicht zum Laufen bringen. Dann kaufte ich das richtige und es funktionierte auf Anhieb. Es gibt viele Geschäfte sowohl in der EU als auch in den USA, wenn Sie in Korea nicht einkaufen können.
Es scheint, dass Ihr Level-Shifter nicht mit I2C-Geräten arbeiten kann, die Clock-Stretching verwenden. Folglich gelangt das Gerät in einen Zustand, in dem SCK/SDA mit GND verriegelt werden.
Die Taktdehnung ermöglicht es einem I2C-Slave-Gerät, die Kommunikation auszusetzen, indem die Uhr während der Datenverarbeitung (nach der Adressierungsphase) auf GND gehalten wird. Das bedeutet, dass sowohl der Slave als auch der Master gleichzeitig ihren Open-Collector-Ausgang aktivieren.
In einem normalen Setup ohne Level-Shifter würde der Master den Takt freigeben und dann feststellen, dass der Slave den Takt immer noch unten hält. Sobald der Slave die Uhr freigibt (die wieder hoch wird), kann die Kommunikation fortgesetzt werden.
Mit dem Level-Shifter dazwischen funktioniert diese Logik nicht mehr. Wenn der Master CLK gedrückt hält, muss der Pegelumsetzer CLK auch auf der Slave-Seite nach unten treiben. Wenn der Slave CLK gedrückt hält, dann wird diese Information entweder nicht vom Level-Shifter an den Master weitergeleitet (unidirektionaler Shifter) oder der Shifter speichert den Zustand. Dies liegt daran, dass es noch nicht feststellen kann, ob der Master die Uhr freigegeben hat.
Nicht alle I2C-Geräte verwenden Clock-Stretching. Ich vermute, dass der BMP180-Sensor, den Sie als Referenz verwenden, funktioniert, weil er kein Clock-Stretching verwendet. Auf der anderen Seite basiert das MOD-IO auf einem ATmega16L, der (sehr wahrscheinlich) eine Taktverlängerung durchführt, bis die Software den I2C-Interrupt verarbeitet hat.
Wenn Sie sich einen richtigen I2C-Level-Shifter wie den TCA9800 und den P82B96 ansehen, verwenden sie fortschrittlichere Techniken, um die Lockup-Situation zu lösen.
Der P82B96 verwendet zwei unterschiedliche Massepegel (0 V und ~0,6 V), um den Strom dominanten Teil auf dem Bus zu unterscheiden.
Der TCA9800 misst die Richtung des Stromflusses, um das gleiche Problem zu lösen.
Die Antwort lautet also: Holen Sie sich einen richtigen I2C-Level-Shifter! (und behalten Sie das Zielfernrohr, das Sie gekauft haben :)
Nazar
Vlad Iliescu
SamGibson
Vlad Iliescu
SamGibson
riorax
SamGibson
Vlad Iliescu