Odroid XU4 und Olimex MOD-IO von I2C über Pegelwandler

Lange Version

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:

Raspberry Pi 3 mit MOD-IO verbunden

Um die Adresse zu erkennen, habe ich gerade die i2c-tools-Bibliothek verwendet i2cdetect -y 1und 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:

Odriod XU4 verbunden mit MOD-IO über einen Level Shifter

Ich habe festgestellt, dass Odroid i2c_1 in der Software auf i2c-4 abgebildet ist. Bestätigt wurde dies auch, indem i2cdetect -y 4ich 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 4erhalte 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.

  1. 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.

  2. 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.

  3. 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.

Kurzfassung

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?

Bearbeiten 1:

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?

Bearbeiten 2:

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?

Ist Ihr Level Shifter bidirektional? Außerdem nimmt das I2C-Protokoll Pull-ups sowohl auf SDA als auch auf SCK an
Ja, der Schalthebel ist bidirektional, zumindest laut ebay des Herstellers . Ich habe versucht, 1k Pull-up hinzuzufügen und hatte keinen Erfolg.
@VladIliescu - (a) Von Ihrem Debugging-Punkt "2" aus haben Sie vermutlich den Pegelwandler für diesen Test verwendet. Ist das korrekt? (b) Wenn ich Ihre Ausrüstung in meinem Labor hätte, würde ich mir die Oszilloskopspuren des I2C-Busses ansehen, wenn Sie diesen I2C-Pegelwandler verwenden - die Spannungspegel und Anstiegs- / Abfallzeiten auf beiden "Seiten" überprüfen. des Pegelwandlers. Sie haben in Ihrer Frage viele Informationen geliefert (tolle erste Frage - ich habe bereits +1 gegeben). Eines der wenigen Dinge, die fehlen, sind einige Scope-Spuren. Kann Ihr Oszilloskop die Wellenformen als Bilder speichern? Wenn nicht, können Sie Fotos von der Anzeige machen?
@SamGibson vielen Dank für deine Mühe. Zu deinen Fragen: a) ja, das einzige, was sich geändert hat, ist BMP180 statt MOD-IO. b) Ich werde morgen versuchen, die Oszilloskopspuren klar zu sehen, aber das wird sich als ziemliche Herausforderung erweisen, da mein Oszilloskop ein rudimentäres DYI-Kit (DSO138) ist. Ich habe es bisher nur verwendet, um zu bestätigen, dass etwas passiert. Aber ich werde es sicher versuchen.
@Vlad - Danke. (a) I2C-Wellenformen auf beiden Seiten des Konverters vergleichen: Odroid->Konverter->BMP180 (funktioniert) und Odroid->Konverter->MOD-IO (funktioniert nicht). (b) Betreff: Ihr Punkt "3", ich habe die neuesten Odroid XU4-Schaltpläne überprüft und sehe keine eingebauten Pull-ups auf dem h / w 1,8-V-I2C-Bus ("I2C # 1"). Aber ... (c) Das Foto Ihres BMP180-Boards zeigt I2C-Pull-ups. (d) Mir ist hier der Platz ausgegangen, aber kurz gesagt, ich vermute, dass das Fehlen von Pull-ups auf der 1,8-V-ODroid-XU4-"Seite" des I2C-Busses bei Verwendung Ihres Pegelwandlers wichtig sein könnte (überprüfen Sie mit ' Umfang).
@VladIliescu Versuchen Sie für die bidirektionale SDA-Linie, 1K- oder 2,2K-Klimmzüge auf beiden Seiten hinzuzufügen. Versuchen Sie für die SCL-Leitung, 1K-Pullup auf der 3,3-V-Seite hinzuzufügen. Dies würde versucht werden, wenn das Problem eine langsame Anstiegszeit aufgrund schwacher Klimmzüge ist. Dies kann die Dinge noch verschlimmern, wenn das Problem darin besteht, dass 1,8 V für das Einschalten von Vgs marginal sind.
@Vlad - Analyse zu Bearbeiten 1: (e) Leider zeigen diese Oszilloskopfotos, dass ihre Zeitbasis nicht schnell genug war, damit wir die Anstiegs- / Abfallzeit der I2C-Signale (dh die "Form" einzelner I2C-Impulse) sehen können, was zeigt, ob Die Pull-up-Widerstandswerte sind korrekt. (f) Als Vermutung sieht es so aus, als ob die I2C-Busgeschwindigkeit ~ 125 kHz betragen könnte und die Scope-Zeitbasis mindestens 10-mal schneller sein muss; vielleicht sogar noch ein bisschen mehr. Wenn Ihres das nicht kann, dann kann dies eine Sackgasse sein. (g) Das letzte Foto zeigt, dass etwas die SDA-Leitung auf der 3,3-V-Seite nach unten getrieben hat (wahrscheinlich wurde dieses Gerät durch das, was es auf dem I2C-Bus sah, verwirrt).
@SamGibson Leider zeigt das schnellere Einstellen der Oszilloskopzeit nur eine gerade Linie, das war das Beste, was ich mit dem aktuellen Tool machen konnte. Mal sehen ob ich mir nächste Woche einen leihen kann. In der Zwischenzeit werde ich einfach verschiedene Widerstandswerte ausprobieren und die Ergebnisse überprüfen. Vielen Dank für Ihre Unterstützung und sobald ich etwas habe, werde ich es sicher hinzufügen.

Antworten (2)

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