Habe einen ESP32 als Master und einen Pro Micro als Slave laufen. Funktioniert soweit alles optimal. Um die unterschiedlichen Spannungen auszugleichen habe ich einen 2 Kanal LLCV. Ich habe einen halben Tag lang probiert über die TX/RX Kanäle zu kommunizieren was aber nicht funktioniert hat. Ich dachte zuerst ich hätte ein Problem mit den Pullup Widerständen auf der Leitung. (Bei jedem Kanal hängt ein 10K pullup dran) Irgendwann habe ich dann probiert die beiden I2C Leitungen über die beiden TX Kanäle des 2Kanal! LLCV anzuhängen. Funktioniert Top! Aber weshalb? Verwende so ein Teil: https://learn.sparkfun.com/tutorials/retired---using-the-logic-level-converter (Die Seite beschreibt ja eigentlich genau dass die bidirektionale Kommunikation bei I2C über die beiden TX Kanäle laufen soll...) TX wird jeweils über einen Mosfet geschaltet, RX über Widerstände/Spannungsteiler aber ich kann mir die ober verlinkte Seite noch 10x durchlesen verstehe aber immer noch nicht weshalb der RX nicht funktioniert - irgendwas geht mir da ab! (OK es sind Grundlagen...) Vielleicht hat ja hier jemand eine Erklärung für mich weshalb das so ist. Der Key ist ja folgende Aussage: > Signal will be shifted down and sent to low-voltage device on “RXO” pin. > “TXO” on the high side. Bi-directional, but this is the only shifter that will shift from low to high. RX: will be shifted down... TX: will be shifted from low to high Bi-direktional sollten ja beide sein Ich glaube ich hab's überlauert... TX schaltet wirklich von 3.5 auf 0 bzw. 5 auf 0 und umgekehrt also HIGH/LOW RX schalten bei einem LOW Signal auf der 5V Leitung auf??? ja auf was eigentlich? Halt nicht 0 sonst würde es ja funktionieren... Wenn auf RX ein HIGH ansteht dann sollte das ja noch richtig sein. 5V high wird zu 3.5V HIGH... Dieser Ansatz sollte stimmen - oder?
Ehm... Nutzt du nun I2C oder den UART?
Ich habe ernsthafte Schwierigkeiten, deinem Text zu folgen. Mir ist nicht klar, was du wie miteinander verbunden hast. Auch die Beschriftung dieser Billig-Platine ist ziemlich uneindeutig. Ich müsste dazu mal einen Schaltplan sehen, wo die beiden µC und das Innenleben der Levelshifter-Platine aufgezeichnet sind. Du vermutlich auch, dann blickst du selbser durch. Die einfachen Spannungsteiler auf den Rx Kanälen reduzieren die Spannung in eine Richtung aber erhöhen sie nicht in die andere Richtung. Deswegen kannst du sie nicht gebrauchen. Ich frage mich allerdings, warum du überhaupt Levelshifter verwendest? Der I²C Bus wird von den Mikrocontrollern mit Open-Drain Treibern angesteuert. Das heißt: Der High Pegel kommt ausschließlich von den Pull-Up Widerständen. Hänge diese einfach and 3,3V und beide IC's sind zufrieden.
Den LLC verwende ich da der ESP32 mit 3.5V läuft und der pro Micro mit 5V
Michael Mitterer schrieb: > Den LLC verwende ich da der ESP32 mit 3.5V läuft und der pro Micro > mit 5V Trotzdem kannst du deinen I²C Bus mit 3,3V oder 3,5V betreiben. Beide Chips werden damit funktionieren - ohne Pegelwandler.
Der Unterschied sind 1.7V - das wird dem ESP32 nicht so gefallen wenn er 5V als High bekommt - oder? Nur nochmal zur Klarstellung: Der Arduino läuft auf 5V, der ESP32 auf 3.3V
Michael Mitterer schrieb: > Der Unterschied sind 1.7V - das wird dem ESP32 nicht so gefallen > wenn er > 5V als High bekommt - oder? > > Nur nochmal zur Klarstellung: Der Arduino läuft auf 5V, der ESP32 auf > 3.3V Nochmal zur Klarstellung: Du sollst deinen I²C Bus mit 3,3V betreiben. Die Spannung der High Pegel wird einzig und alleine durch die Pull-Up Widerstände festgelegt. Du musst wirklich lernen, wie der I²C Bus funktioniert.
Also dazu gibt es zu viele Aussagen im Netz die das Gegenteil behaupten: https://electronics.stackexchange.com/a/35063 Weiters gibt es auch sehr viele Aussagen aus der Praxis, speziell Arduino und Raspberry dass es bei der I2C Kommunikation zu Übertragungsproblemen kommt. Abgesehen davon - ich hab's ja ausprobiert! Ohne LLCV geht's nicht mit aber schon. Wenn ich sage dass es nicht geht dann bedeutet das dass der Slave mit der ID 8 nicht gefunden wurde dafür aber manchmal!!! ein Slave mit der ID 5. Das heißt für mich Übertragungsproblem! Mich hat eigentlich interessiert weshalb beim LLCV die Kommunikation über die TX/RX Leitungen nicht funktioniert, die Kommunikation über die beiden!!!! TX Kanäle aber schon. Der LLCV den ich verwende ist ja ein 2 Kanal LLCV.
Hi, welche Pins verwendest Du denn um die beiden Arduinos zu verbinden? RX und TX haben nämlich nichts mit I2C zutun (das ist UART). I2C gibt es beim Pro Micro an Port 2 (SDA) und Pin 3 (SCL). Bei einem Standard ESP32 Board sind es 22 (SCL) und 21 (SDA), falls Du etwas exotiches hast, am besten noch einmal nachprüfen. Der Pegel wird durch den Pullup definiert. Hier sollte nur der ESP32 die Signale hochziehen. Der Micro besitzt keine externen Pullups und nutzt nur die internen Pullups (die das Signal natürlich auf 5V hochziehen). Ich muss zugeben, ich weiss gerade nicht ob der Arduino als Slave schon automatisch den Pullup deaktiviert (wäre sinnvoll). Dann lag es wohl daran, dass Du garkeine Pullups nutzt und dadurch auch keiner das Signal herunterziehen kann um Daten zu senden. :) ) Mit folgendem Code kannst Du diese deaktiveren:
1 | pinMode(SDA, INPUT); |
2 | pinMode(SCL, INPUT); |
3 | /*Hier bin ich mir gerade nicht sicher ob es reicht die Pins als Input zu definieren um sie zu deaktiveren...*/ |
4 | digitalwrite(SDA, LOW); |
5 | digitalwrite(SCL, LOW); |
Nun musst Du SDA und SCL über einen 2k-5k Ohm Widerstand mit 3.3V verbinden, oder Du nutzt die internen Pullups des ESPs.
1 | pinMode(SDA,INPUT_PULLUP); |
2 | pinMode(SCL,INPUT_PULLUP); |
Wenn Du zufällig noch ein Oszilloskop hast, kannst Du dir beide Signale abgreifen und prüfen, ob alles stimmt. Grüße, Patrick EDIT: Zudem sagt dein Link doch auch aus, dass es funktioniert.
:
Bearbeitet durch User
Funktioniert es denn? Ich würde, wie gesagt, erst einmal versuchen die Pullups am ESP zu aktivieren. Dann sollte es schon funktionieren.
Stefanus F. schrieb: > Nochmal zur Klarstellung: Du sollst deinen I²C Bus mit 3,3V betreiben. > Die Spannung der High Pegel wird einzig und alleine durch die Pull-Up > Widerstände festgelegt. Quatsch. Wenn ein Busteilnehmer mit 5V und der andere mit 3,3V arbeitet, gibt es nicht DIE Betriebsspannung für den I2C-Bus. Es gibt einen Zweig mit 5V und einen mit 3,3V. Dazwischen hängt z.B. ein MOSFET, wie bei dem verlinkten LLC im Schaltplan unter "Bi-Directional" gezeigt. https://learn.sparkfun.com/tutorials/retired---using-the-logic-level-converter
Wolfgang schrieb: > Quatsch. > Wenn ein Busteilnehmer mit 5V und der andere mit 3,3V arbeitet, gibt es > nicht DIE Betriebsspannung für den I2C-Bus. > Es gibt einen Zweig mit 5V und einen mit 3,3V. Dazwischen hängt z.B. ein > MOSFET, wie bei dem verlinkten LLC im Schaltplan unter "Bi-Directional" > gezeigt. Das macht man, sofern man einen Levelshifter braucht. Was wiederum davon abhängt, ab wann der 5V-µC den Pegel sicher als high erkennt. Bei dem hier betrachteten µC ist das bereits ab 0,2*Vdd+0,9V = 1,9V der Fall. Die 3,3V reichen also locker aus, damit der High-Pegel korrekt erkannt wird. Die Beschreibung von Stefanus ist also kein Quatsch sondern schlicht korrekt. Sie gilt natürlich nicht für beliebige µC, aber für die hier verwendete Kombination gilt sie. Das Problem des TO liegt (oder lag) an einer anderen Stelle, möglicherweise tatsächlich daran, dass er den Pullup vergessen hat. Sein Levelshifter bringt auch Pullups mit und löst dadurch das Problem. Aber trotzdem wird hier kein Levelshifter benötigt - sondern einfach ein Pullup, wie das bei I2C halt nunmal so ist.
Wolfgang schrieb: > Quatsch. Schön dass du die oben genannte Anleitung von NXP (das ist die Firma die I²C erfunden und spezifiziert hat) völlig ignorierst. Auf die Idee, einen I²C Bus unnötig mit gemischten Spannungen und Levelshiftern zu betreiben kommen nur Firmen, die ihre Produkte ahnungslosen Bastlern verkaufen wollen. Wenn das wenigstens ein anständiger Pegelwandler wäre, würde ich ja nichts sagen. Aber diese primitive Transistorschaltung funktioniert nur unter gewissen Rahmenbedingungen (die NXP in einer umfangreichen Application Note übrigens detailliert erklärt). Bei Lego Mindstroms funktioniert sie zum Beispiel nicht. Im übrigen: Während dein Ratschlag scheinbar aus den falsch verstandenen Vermarktungskanälen eines chinesischen Elektronik Händlers stammt, habe ich es fundiert im Rahmen einer Berufsausbildung zum Kommunikationselektroniker gelernt.
Patrick B. schrieb: > Funktioniert es denn? > Es hat schon immer funktioniert! Meine Lösung mit dem LLCV und den beiden Leitungen jeweils auf TX der beiden Kanäle ist einfach richtig. Und - wie schon gesagt, ich habe es mit und ohne LLCV probiert. Ich kann nur nochmal festhalten dass mir hier gesagt wurde dass es nicht funktioniert und der LLCV nicht benötigt wird - das stimmt aber einfach nicht. Meine Frage war auch eine andere: Ich wollte wissen weshalb!!!! es über die beiden TX-Kanäle funktioniert und weshalb die Kommunikation über einen Kanal mit TX/RX NICHT funktioniert. Inzwischen glaube ich aber dass ich es einigermaßen verstanden habe. TX zieht die Leitungen sauber auf HIGH bzw. auf LOW unabhängig von der jeweils anliegenden Spannung. RX zieht die Leitungen auf einen Wert RELATIV zur anliegenden Spannung. Dieser relative Wert wird dann aber von I2C nicht sauber als HIGH oder LOW erkannt. RX/TX hat in diesem Fall nichts!!!!! mit serieller Kommunikation zu tun. Das ist einfach die Bezeichnung des LLCV TX wird über einen Mosfet geschaltet, RX ist ein Spannungsteiler Ich habe jetzt auch nochmal ein Foto angehängt...
Hallo, Mike M. schrieb: > Meine Frage war auch eine andere: Ich wollte wissen weshalb!!!! es über > die beiden TX-Kanäle funktioniert und weshalb die Kommunikation über > einen Kanal mit TX/RX NICHT funktioniert. >... > RX/TX hat in diesem Fall nichts!!!!! mit serieller Kommunikation zu tun. > Das ist einfach die Bezeichnung des LLCV > TX wird über einen Mosfet geschaltet, RX ist ein Spannungsteiler I2C (SDA/SCL) ist prinzipiell bi-directional, es können also beide Seiten den den Zustand beeinflussen. RX/TX stammen vom UART und sind jeweils nur eine Richtung. Einen Spannungsteiler geht aber nur in eine Richtung sinnvoll. Was sich der Hersteller dieses Pegelwandlers gedacht hat, weiß nur dieser... Gruß aus Berlin Michael
Eins muss ich schon noch ergänzen - wenn ich behaupte dass es überhaupt nicht funktioniert dann stimmt das insofern nicht ganz - teilweise funktioniert es auch ohne LLCV. Nur seit ich den LLCV drin habe funktioniert es problemlos und immer.
Michael U. schrieb: > Was sich der Hersteller dieses Pegelwandlers gedacht hat, weiß nur > dieser... Das Produkt und die Anleitung dazu sind inzwischen RETIRED. Auf dem Nachfolgeprodukt befinden sich 4 Transistoren, so dass alle 4 Kanäle gleichwertig sind.
Achim S. schrieb: > Das macht man, sofern man einen Levelshifter braucht. Was wiederum davon > abhängt, ab wann der 5V-µC den Pegel sicher als high erkennt. Bei einem Arduino Pro Micro mit dem ATnega32U4 @ 5V liegt V_IH bei 1.9V (0.2 VCC+0.9V), so dass der den I2C mit 3,3V richtig versteht, ok. Bei einem Arduino mit ATmega328 @ 5V wäre das mit einem 3.3V Bus bös auf Kante genäht, weil bei dem V_IH bei 3V liegt. Da darf also die Versorgung des ESP nicht nennenswert von 3.3V abweichen und der Bus nicht zu hochohmig abgeschlossen sein. Stefanus F. schrieb: > Schön dass du die oben genannte Anleitung von NXP (das ist die Firma die > I²C erfunden und spezifiziert hat) völlig ignorierst. Als I2C erfunden wurde, hat noch überhaupt niemand von NXP geredet. Die Schaltung wurde als Application Note AN97055 schon 1997 von Philips veröffentlicht. " Und genau diese Schaltung meinte ich mit "MOSFET zwischen den Buszweigen".
Wolfgang schrieb: > Als I2C erfunden wurde, hat noch überhaupt niemand von NXP geredet. Ach was, wirklich? Das ist mir aber neu! Atme ist jetzt Microchip und Raider heißt schon lange Twix. Hätte ich Philips geschrieben, dann hättest du vermutlich eingeworfen, dass Philips nicht mehr zuständig sei - hab ich Recht? Macht es Sinn, einem Neuling 10 Jahre veraltete Firmennamen zu nennen, wo sie die Dokumente garantiert nicht finden werden? Hier ist das Dokument zum Leveshifter: https://www.nxp.com/docs/en/application-note/AN10441.pdf Und hier die Spezifikation von I²C: https://www.nxp.com/docs/en/user-guide/UM10204.pdf
Stefanus F. schrieb: > Ach was, wirklich? Das ist mir aber neu! Dann hast du jetzt vielleicht etwas gelernt. Der Firmenname NXP wurde erst 2006 mit Ausgründung des Halbleiterbereichs von Philips geschaffen. https://de.wikipedia.org/wiki/NXP_Semiconductors I2C gab es da schon lange.
Wolfgang schrieb: > Der Firmenname NXP wurde erst 2006 mit Ausgründung des > Halbleiterbereichs von Philips geschaffen. > I2C gab es da schon lange. Wow das ist ja toll. Was es alles gibt!? Im ernst: Ich bin nicht blöde. Dass die Firma Umbenannt wurde weiß ich seit 10 Jahren. Deswegen benutze ich ja auch den neuen Namen. ich reche auch nicht mehr in DM um und ab nächstes Jahr nehme ich auch das Wort Atmel nicht mehr in den Mund (außer um alte Produkte beim richtigen Namen zu nennen) - versprochen. Raider heißt jetzt Twix.
Stefanus F. schrieb: > Macht es Sinn, einem Neuling 10 Jahre veraltete Firmennamen zu nennen, > wo sie die Dokumente garantiert nicht finden werden? Darum habe ich es als Anhang beigefügt.
>> Macht es Sinn, einem Neuling 10 Jahre veraltete Firmennamen zu nennen, >> wo sie die Dokumente garantiert nicht finden werden? Wolfgang schrieb: > Darum habe ich es als Anhang beigefügt. Die Anzeige funktioniert leider nicht. Der Download geht aber - komisch.
Stefanus F. schrieb: > Die Anzeige funktioniert leider nicht. Der Download geht aber - komisch. Warte ab, bis der Dienst auf dem Foren-Server die Quick Looks erzeugt hat.
Wolfgang schrieb: > Bei einem Arduino Pro Micro mit dem ATnega32U4 @ 5V liegt V_IH bei 1.9V > (0.2 VCC+0.9V), so dass der den I2C mit 3,3V richtig versteht, ok. Bei > einem Arduino mit ATmega328 @ 5V wäre das mit einem 3.3V Bus bös auf > Kante genäht, weil bei dem V_IH bei 3V liegt. Richtig. Deswegen schrieb ich ja (zur Beschreibung von Stefanus): Achim S. schrieb: > Sie gilt natürlich nicht für beliebige µC, > aber für die hier verwendete Kombination gilt sie.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.