Forum: Mikrocontroller und Digitale Elektronik I2C Kommunikation ESP32 -> Arduino Pro Micro 5v / Logiclevel converter


von Mike M. (mike_on_the_bike)


Lesenswert?

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?

von Sebastian R. (sebastian_r569)


Lesenswert?

Ehm... Nutzt du nun I2C oder den UART?

von Stefan F. (Gast)


Lesenswert?

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.

von Michael Mitterer (Gast)


Lesenswert?

Den LLC verwende ich da der ESP32 mit 3.5V läuft und der pro Micro mit 
5V

von Michael Mitterer (Gast)


Lesenswert?

I2C!

von Stefan F. (Gast)


Lesenswert?

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.

von Michael Mitterer (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Michael Mitterer (Gast)


Lesenswert?

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.

von Peter Z. (hangloose)


Lesenswert?

Hier gibt es ein PDF von NXP darüber
https://www.nxp.com/docs/en/application-note/AN10441.pdf

von Pat P. (tsag)


Lesenswert?

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
von Mike M. (mike_on_the_bike)


Lesenswert?

Danke an alle.

von Pat P. (tsag)


Lesenswert?

Funktioniert es denn?

Ich würde, wie gesagt, erst einmal versuchen die Pullups am ESP zu 
aktivieren. Dann sollte es schon funktionieren.

von Wolfgang (Gast)


Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Mike M. (mike_on_the_bike)


Angehängte Dateien:

Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Mike M. (mike_on_the_bike)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Achim S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.