Forum: Mikrocontroller und Digitale Elektronik Kabellänge I2C


von Mark T. (bitts)


Lesenswert?

Hallo,

ich habe schon einige Fragen zum Thema der möglichen Kabellängen bei I2C 
gelesen. Da ich mich damit auch gerade beschäftige, will ich meine 
aktuellen (Anfänger-)Erfahrungen mitteilen. Vielleicht hilft es ja 
jemandem.

Mein Ziel war es, eine möglichst einfache Datenverbindung mit zwei 
(später auch mehreren) Arduinos hinzubekommen.

Ich habe im Testaufbau einen Arduino Pro Micro über USB mit Spannung 
versorgt.
Daran habe ich 100m CAT6 UUTP angeschlossen. Ein Adernpaar für Ucc/SDA 
und ein Adernpaar für GND/SCL. So wird es in den App Notes der bekannten 
I2C-Treiber vorgeschlagen.
Zwei Pullups mit je 220 Ohm.
Slave ist ein weiterer Arduino Pro Micro, der über das CAT-Kabel 
versorgt wird.

Mit dem Multispeed-I2C-Scanner aus dem Playground werden bis 250 kHz 
Slaves erkannt.

Fazit: 100m scheinen mit 5V ohne zusätzlichen Treiber mit einem AVR zu 
funktionieren - und das mit relativ preiswertem Kabel.

von Oliver R. (orb)


Lesenswert?

Die Widerstände sind etwas klein, der Port muß 22,7mA sinken, knapp über 
den Speccs.Unter 470Ohn würd ich nicht gehen.
100kHz sind auch mit normalem Telefonkabel über größere Entfernungen 
möglich, ok UTP ist nicht viel besser.

von Tobias L. (murxwitz)


Lesenswert?

evtl. kannst du auch statt den "normalen" PullUps Stromquellen nutzen, 
zwar etwas aufwendiger im Aufbau, dafuer duerfte das ganze nochmal 
besser funktionieren. Ein einfacher Stromspiegel sollte reichen.

von Mark T. (bitts)


Lesenswert?

Oliver R. schrieb:
> Die Widerstände sind etwas klein, der Port muß 22,7mA sinken, knapp über
> den Speccs.Unter 470Ohn würd ich nicht gehen.
> 100kHz sind auch mit normalem Telefonkabel über größere Entfernungen
> möglich, ok UTP ist nicht viel besser.


Mit anderen Widerständen funktioniert es nicht. Bei kleineren 
Widerständen schafft es der AVR vermutlich nicht, den Pegel weit genug 
herunter zu ziehen und bei größeren Widerständen ist die 
Leitungskapazität zu groß. Ich messe bei 100m mit einem Multimeter 
6,5nF.
Ich würde sagen, dass die Sache hier ziemlich ausgereizt ist.

von Mark T. (bitts)


Lesenswert?

Tobias L. schrieb:
> evtl. kannst du auch statt den "normalen" PullUps Stromquellen nutzen,
> zwar etwas aufwendiger im Aufbau, dafuer duerfte das ganze nochmal
> besser funktionieren. Ein einfacher Stromspiegel sollte reichen.

Mit einem Stromspiegel habe ich noch nicht hantiert, aber ich vermute, 
dass das nicht geht, weil der einen Ein- und Ausgang hat. Zumindest der 
Pegel der Datenleitung muss sowohl vom Master, als auch von den Slaves 
heruntergezogen werden können. Das geht mit einer Stromquelle mMn. 
nicht.

von Schreiberling (Gast)


Lesenswert?

Hallo,

für längere Kabel ist eine UART am besten geeignet. I2C ist dagegen für 
Verbindungen auf einer Platine  oder kurze Sachen geeignet, nicht für 
lange Kabel (Kapazitäten, wurde ja schon genannt).

UART ist dagegen ideal:
- Asynchron, Signallaufzeiten sind (fast) egal
- man kann physikalisch RD422/RS485-Treiber verwenden
- Softwaretechnisch sehr einfach, wenn man zwei µCs mit HW-UART hat - 
was auf deine zutrifft
- Bidirektional : doppelte Datenrate bei gleicher Frequenz

Nimm z.B. folgenden Tranceiver:
MAX485, ADM485 und Konsorten
http://www.maximintegrated.com/en/products/interface/transceivers/MAX485.html

Damit hast du über 100m keine Probleme. Nicht umsonst ist das in der 
Industrie sehr beliebt. Nimmt man Kabel mit der richtigen Impedanz, kann 
man auch mehr als ein 1MBd fahren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mark Thalle schrieb:
> I2C
IIC = Inter-IC
Damit war also ursprünglich eine Verbindung z.B. des Display-Controllers 
mit dem Tuner und dem Verstärker eines Fernsehers oder Autoradios 
gemeint. Entfernung also max. 50cm.
Bei der Monitorerkennung über DDC geht man noch bis gut 10m, aber alles, 
was weiter geht, gehört in den Bereich "Glück gehabt".

> werden bis 250 kHz Slaves erkannt.
> Fazit: 100m scheinen mit 5V ohne zusätzlichen Treiber mit einem AVR zu
> funktionieren - und das mit relativ preiswertem Kabel.
Du wirst aber bei einem I2C-Slave, der Clock-Stretching machen will, 
auflaufen. Nicht umsonst ist bei CAN die Leitungslänge eingeschränkt.

BTW: hast du das Kabel ausgerollt und den Slave tatsächlich 100m weiter 
weg platziert (und evtl. sogar fremdversorgt)?

: Bearbeitet durch Moderator
von Klaus R. (klara)


Lesenswert?

Mark Thalle schrieb:
> Zwei Pullups mit je 220 Ohm.
> Slave ist ein weiterer Arduino Pro Micro, der über das CAT-Kabel
> versorgt wird.
>
> Mit dem Multispeed-I2C-Scanner aus dem Playground werden bis 250 kHz
> Slaves erkannt.
>
> Fazit: 100m scheinen mit 5V ohne zusätzlichen Treiber mit einem AVR zu
> funktionieren - und das mit relativ preiswertem Kabel.

Ich kenne den Arduino leider nicht und möchte mir auch jetzt nicht 
unbedingt ein Datenblatt besorgen. Es mag sein das zwei Arduino über 
einen I2C-Bus mit 5V, 220 Ohm Pullups, über 100m bei 250 kHz 
kommunizieren können.

Nur, Du wirst an diesem I2C-BUS kein Standard I2C-Baustein betreiben 
können. Bei einem 5V I2C-Bus ist bei ca. 1,65 kOhm Schluss. Kleinere 
Pullups erhöhen den zulässigen Strom über die absolute Grenze. Ich 
selber gehe bis auf 2,2 kOhm herunter.

Um bis auf 220 Ohm heruntergehen zu können sind z.B. P82B96 (DUAL 
BIDIRECTIONAL BUS BUFFER) nötig.
mfg klaus

von xyxoz (Gast)


Lesenswert?

Klaus Ra. schrieb:
> Ich kenne den Arduino leider nicht und möchte mir auch jetzt nicht
> unbedingt ein Datenblatt besorgen.

Was hat Arduino damit zu tun?

von Oliver R. (orb)


Lesenswert?

xyxoz schrieb:
> Was hat Arduino damit zu tun?

Der Prozessor auf Arduinos (meist AVRs) kann 20mA gegen Masse ableiten 
und bei 220Ohm ist man mit 22mA nur knapp drüber.
Für I2C ist aber nur 3mA vorgesehen und das entspricht bei 5Volt einem 
PullUp von 1,67k. Mehr muß ein Busteilnehmer nicht können undsomit ist 
der Arduino nicht 'normal' und schon relevant.

von Tobias L. (murxwitz)


Lesenswert?


von U. M. (oeletronika)


Lesenswert?

Hallo,
so ein I²C oder sonstige Interfaces, die nur für eher sehr kurze 
Strecken gedacht sind, bekommt auch über längere Abstände irgendwie zum 
Laufen, aber das ist eher ein reines Provisorium oder echter 
Bastlerfusch.
Jede kleine Störung wird das aushebeln. Bei Gewitter haut es dir 
regelmäßig die Treiber weg.

Mit einer RS232 kann man locker 100m und mehr überbrücken, aber auch das 
geht schon in Richtung begrenzter Eignung.

Wirklich empfehlenswert ist eine einfache RS485.
Die gehört natürlich an eine UART.
Als Treiber für eher moderate Baudraten bis max. ca. 250kBaud empfehle 
ich Bandbreitenbegrenzte Treiber: ADM488A
http://www.analog.com/en/interface-isolation/rs-485-rs-422/adm488a/products/product.html
Das hat den Vorteil, das die Leitungen nicht so empfindlich auf 
fehlerhafte Terminierung reagieren.

Bei 100m Leitungslänge wird man aber auch im Heimbereich schon mal akute 
Problem mit Überspannungen haben. Dann ist eine beidseitige galvanische 
Trennung und eine ordentliche Schutzbeschaltung zwingend. Sonst 
reparierst du das aller Jahre wieder.
Da empfehle ich z.B. den ADM2483
http://www.analog.com/en/interface-isolation/rs-485-rs-422/adm2483/products/product.html
Falls du daran Interesse hast, kann ich dir auch gut erprobte 
Schutzbeschaltungen anbieten.
Gruß Öletronika

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wegen der Problemtik mit unterschiedlichem Massepotential hat mir ein 
erfahrener Elektroniker folgendes empfohlen:

Slaves, die nur wenig Leistungsaufnahme haben, komplett über den Bus 
speisen. Ggf. Optokoppler und Relais für weitergehende Peripherie 
verwenden.

Wo das nicht geht, nur die Bustreiber über den Bus speisen und dann über 
Optokoppler an den Mikrocontroller anbinden. Der Rest der Schaltung kann 
dann beliebiges Potential haben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan us schrieb:
> Wegen der Problemtik mit unterschiedlichem Massepotential hat mir ein
> erfahrener Elektroniker folgendes empfohlen
Nur kann es dann sein, dass die Masse am anderen Ende zu "weich" ist und 
"zappelt"...

von Easylife (Gast)


Lesenswert?

Die 6.5nF des Kabels schlagartig zu entladen sind ein weiteres Problem 
für die angeschlossenen Devices...

Es gibt von TI einen schönen Baustein: P82B715 (I2C Bus Extender).

Der verträgt immerhin 3nF und kann einiges an Strom "sinken".
Im Datenblatt benutzen sie 5V und 270 Ohm Widerstände.

3nF sind natürlich noch keine 6.5nF... evtl. gibts ja noch etwas anderes 
in der Art.

von Easylife (Gast)


Lesenswert?

Oder man behilft sich zusätzlich mit kleinen Serienwiderständen an 
beiden Kabelenden... 22R dürften das Ganze schon etwas entschärfen und 
0.4V müssten noch als LOW durchgehen...

von Mike (Gast)


Lesenswert?

Schreiberling schrieb:
> I2C ist dagegen für Verbindungen auf einer Platine  oder kurze Sachen
> geeignet, nicht für lange Kabel (Kapazitäten, wurde ja schon genannt).

Der Erfinder des I2C (NXP/Philips) scheint es besser zu wissen und hat 
zu diesem Thema extra die Application Note AN10658 "Sending I2C-bus 
signals via long communications cables" veröffentlicht.
www.nxp.com/documents/application_note/AN10658.pdf

von Oliver R. (orb)


Lesenswert?

Mike schrieb:
> Der Erfinder des I2C (NXP/Philips) scheint es besser zu wissen

Autos können auch schwimmen, man muß sie nur auf ein Boot packen.
Die AN beschreibt den Einsatz von Treibern (PCA9600 und P82B96)für 
längere Stecken. Daß das funktioniert wird hier keiner bestreiten 
wollen.

von Mark T. (bitts)


Lesenswert?

Lothar Miller schrieb:
> Mark Thalle schrieb:

> Bei der Monitorerkennung über DDC geht man noch bis gut 10m, aber alles,
> was weiter geht, gehört in den Bereich "Glück gehabt".

Mit Bausteinen, die kaum mehr als die ursprünglichen Spezifikationen 
erfüllen, ist das vermutlich richtig. NXP liefert aber Treiber, die 
extra für lange Leitungen ausgelegt sind. Die angabe einer maximalen 
Leitungslänge habe ich noch nicht gesehen. Der begrenzende Faktor ist 
hauptsächlich die Leitungskapazität mit 3-4 nF.
Die AVRs auf den Arduinos scheinen ausreichend Strom ziehen zu können, 
sodass es auch ohne Treiber bei 5V möglich ist.

>> werden bis 250 kHz Slaves erkannt.
>> Fazit: 100m scheinen mit 5V ohne zusätzlichen Treiber mit einem AVR zu
>> funktionieren - und das mit relativ preiswertem Kabel.
> Du wirst aber bei einem I2C-Slave, der Clock-Stretching machen will,
> auflaufen. Nicht umsonst ist bei CAN die Leitungslänge eingeschränkt.

Wieso wird Clockstretching nicht funktionieren? Wenn ich das richtig 
verstanden habe, reduziert der Slvae dabei selbst den Takt, indem er die 
Clockleitung auf low zieht. Das entspricht dann doch nur einer 
langsameren Übertragungsrate und sollte noch eher funktionieren, als die 
getesteten maximalen 250 kHz.

> BTW: hast du das Kabel ausgerollt und den Slave tatsächlich 100m weiter
> weg platziert (und evtl. sogar fremdversorgt)?

Ne, ich habe beim Testen nur die Enden des 100m-Rings kurz abgewickelt 
und den Rest aufgerollt gelassen.
Die Versorgung des Slaves habe ich einmal über die 100m CAT6 gemacht und 
einmal über USB. USB für Master und Slave kamen dabei aber jeweils vom 
gleichen PC und jeweils mit ca. 3m USB-Kabel.

Abgewickelt und fremdversorgt gibt es vielleicht mehr Störungen durch 
Induzierung und Potentialverschiebung.

Mir ging es beim Testen erst mal darum, was ein Arduino/AVR über den 
I2C-Bus so kann. Tatsächlich brauche ich die hohe Übertragungsrate nicht 
und die Arduinos, die ich darüber verbinden möchte, liegen nicht 100m 
auseinander.

von Mark T. (bitts)


Lesenswert?

Klaus Ra. schrieb:
> Mark Thalle schrieb:

> Nur, Du wirst an diesem I2C-BUS kein Standard I2C-Baustein betreiben
> können. Bei einem 5V I2C-Bus ist bei ca. 1,65 kOhm Schluss. Kleinere
> Pullups erhöhen den zulässigen Strom über die absolute Grenze. Ich
> selber gehe bis auf 2,2 kOhm herunter.
>
> Um bis auf 220 Ohm heruntergehen zu können sind z.B. P82B96 (DUAL
> BIDIRECTIONAL BUS BUFFER) nötig.


Daran habe ich auch schon gedacht. Standard-Bauteilen müsste ich dann 
einen Bustreiber spendieren, damit sie an diesem Bus funktionieren 
können.

Ich erspare mir diese Bustreiber für jeden AVR, den ich anschließe. Und 
da diese Bustreiber nicht gerade billig sind und fast nur in SMD-Gehäuse 
verfügbar sind, wäre ich froh, wenn ich ohne auskäme.

von Mark T. (bitts)


Lesenswert?

Easylife schrieb:
> Oder man behilft sich zusätzlich mit kleinen Serienwiderständen an
> beiden Kabelenden... 22R dürften das Ganze schon etwas entschärfen und
> 0.4V müssten noch als LOW durchgehen...


Ein Serienwiderstand macht es aber noch wesentlich langsamer. Zum Einen 
erhöht es die Zeitkonstante, sodass die Kapazität langsamer entladen 
wird, dauert es relativ zur Zeitkonstante länger, bis der notwendige 
Schwellwert unterschritten ist.
Die Leitung (AWG24) selbst hat einen gemessenen Widerstand von ca. 22 
Ohm für ein Adernpaar.

von Possetitjel (Gast)


Lesenswert?

Mark Thalle schrieb:

> Die angabe einer maximalen Leitungslänge habe ich
> noch nicht gesehen.

Nicht verwunderlich; die hängt ja auch von der Dämpung
des verwendeten Kabels ab.

> Der begrenzende Faktor ist hauptsächlich die
> Leitungskapazität mit 3-4 nF.

Ganz sicher nicht.

Der begrenzende Faktor ist der Wellenwiderstand. Deshalb
klappt es mit 220 Ohm (weil die Leitung dann näherungsweise
abgeschlossen ist), und mit 470 Ohm klappt es nicht (weil
die Fehlanpassung dann zu stark ist).

Bevor Du jetzt streitest: Rechne einfach aus, wie lange das
Licht im Freiraum für 100m braucht. Überlege Dir dann, wie
der letzte Kabelmeter, der erst bei t=0.5µs umgeladen wird,
den Sendestrom bei t=0.0µs beeinflussen soll.

von Easylife (Gast)


Lesenswert?

Mark Thalle schrieb:
> Ein Serienwiderstand macht es aber noch wesentlich langsamer. Zum Einen
> erhöht es die Zeitkonstante, sodass die Kapazität langsamer entladen
> wird, dauert es relativ zur Zeitkonstante länger, bis der notwendige
> Schwellwert unterschritten ist.

Mit 22R und 6.5n hast du erst bei über 1MHz eine Abschwächung von -3dB.
Bei 100 KHz sollte das also kaum eine Rolle spielen.

von Mark T. (bitts)


Lesenswert?

Possetitjel schrieb:
> Mark Thalle schrieb:

>> Der begrenzende Faktor ist hauptsächlich die
>> Leitungskapazität mit 3-4 nF.
>
> Ganz sicher nicht.
>
> Der begrenzende Faktor ist der Wellenwiderstand. Deshalb
> klappt es mit 220 Ohm (weil die Leitung dann näherungsweise
> abgeschlossen ist), und mit 470 Ohm klappt es nicht (weil
> die Fehlanpassung dann zu stark ist).
>
> Bevor Du jetzt streitest: Rechne einfach aus, wie lange das
> Licht im Freiraum für 100m braucht. Überlege Dir dann, wie
> der letzte Kabelmeter, der erst bei t=0.5µs umgeladen wird,
> den Sendestrom bei t=0.0µs beeinflussen soll.

Zum Streiten ist es bei mir zu lange her, dass ich Leitungstheorie 
durchgekaut habe.
Dass der Wellenwiderstand hier schon eine Rolle spielt, hätte ich nicht 
gedacht. Müsste zum Abschluss nicht beidseitig ein Pullup-Widerstand 
angebracht sein? Ich habe die 220 Ohm ja nur einseitig angebracht und 
der Slave hing sozusagen am offenen Ende.

Wenn die Gesamtlänge der Leitung zwischen Sender und Empfänger ein 
Problem ist, dann sollte es besser funktionieren, wenn ich statt 100m 
zwischen zwei uCs von insgesamt 7 uCs aus jeweils 14m zu einem 
Sternpunkt verlege. Es sind dann insgesamt auch 100m Leitung verlegt, 
aber die maximale Länge zwischen zwei uCs beträgt dann 28m. Das 
entspricht dann in etwa dem, was ich hier realisieren möchte. Da in dem 
Beispiel dann auch 100m Leitung verbaut sind, bliebe die 
Leitungskapazität bei 6,5nF. 250 kHz brauche ich auch nicht. 10 kHz 
reichen mir um ein paar Sensoren auszulesen.

von Mark T. (bitts)


Lesenswert?

Easylife schrieb:
> Mark Thalle schrieb:
>> Ein Serienwiderstand macht es aber noch wesentlich langsamer. Zum Einen
>> erhöht es die Zeitkonstante, sodass die Kapazität langsamer entladen
>> wird, dauert es relativ zur Zeitkonstante länger, bis der notwendige
>> Schwellwert unterschritten ist.
>
> Mit 22R und 6.5n hast du erst bei über 1MHz eine Abschwächung von -3dB.
> Bei 100 KHz sollte das also kaum eine Rolle spielen.

Es sind doch 100kHz Rechteck und nicht Sinus. Ich weiß nicht, wie 
schnell ein AVR die Spannung am Eingang nach unten ziehen kann, aber 
diese vergleichsweise steile Flanke hat weit höhere Frequenzanteile. Die 
kommen dann nur stark gedämpft am Ende der Leitung an, sodass der 
Schwellwert später unterschritten wird.

von Possetitjel (Gast)


Lesenswert?

Mark Thalle schrieb:

> Dass der Wellenwiderstand hier schon eine Rolle spielt,
> hätte ich nicht gedacht.

Jaja... man verschätzt sich :)

Natürlich spielt der Wellenwiderstand hier eine Rolle. 100m
Leitung sind ungfähr 0.5µs (=500ns) Laufzeit. Die Impulsflanken
werden sicherlich deutlich kürzer sein als 500ns. Deine Leitung
darf deshalb nicht mehr als konzentriertes Bauelement betrachtet
werden.

> Müsste zum Abschluss nicht beidseitig ein Pullup-Widerstand
> angebracht sein?

Dann wäre sie beidseitig abgeschlossen, ja.

> Ich habe die 220 Ohm ja nur einseitig  angebracht und der
> Slave hing sozusagen am offenen Ende.

Einseitig abschließen geht in vielen Fällen auch; häufig genügt
das (z.B. bei der Serienterminierung).

Jetzt macht mich aber etwas anderes stutzig: Wo ein Pullup ist,
ist ein OC/OD-Ausgang nicht weit. Dann wären ja die Impedanz-
verhältnisse unterschiedlich, je nachdem, ob eine 1 oder eine 0
gesendet wird?!

> Wenn die Gesamtlänge der Leitung zwischen Sender und Empfänger
> ein Problem ist,

Wenn die Impedanzverhältnisse ungefähr passen (und die reine
Verzögerungszeit nicht stört), ist die Länge an sich kein
Problem - zumindest für die Signalform nicht. Bei verlustarmer
Leitung ist fast wurscht, ob sie 10m, 100m oder 1000m lang ist.
Da sorgt die Leitungstheorie für.

Eingekoppelte Störungen sind ein anderes Thema.

> dann sollte es besser funktionieren, wenn ich statt 100m
> zwischen zwei uCs von insgesamt 7 uCs aus jeweils 14m zu
> einem Sternpunkt verlege.

Zumindest bei höheren Geschwindigkeiten ist das sehr viel
schlechter als die eine 100m-Leitung!

> Es sind dann insgesamt auch 100m Leitung verlegt, aber
> die maximale Länge zwischen zwei uCs beträgt dann 28m.
> Das entspricht dann in etwa dem, was ich hier realisieren
> möchte. Da in dem Beispiel dann auch 100m Leitung verbaut
> sind, bliebe die Leitungskapazität bei 6,5nF.

Das ist eben der Denkfehler.

Wenn ich mal eine Schaltzeit von 100ns für die Impulsflanke
annehme, dann "sieht" Dein Sende-Ausgang nur die ersten 20m
Kabel. Ob die Leitung dort endet oder noch 7km weitergeht,
ist für die Strombelastung des sendenden Ausganges völlig
egal .
Wenn die (Laufzeit auf der) Leitung länger ist als die Flanke,
ist nur der Wellenwiderstand für den Strom maßgeblich, und
nicht die rechnerische Gesamtkapazität!

Nochmal die Frage: Wie soll ein Teil der Leitung, der aus
physikalischen Gründen - nämlich wegen der Lichtgeschwindigkeit -
noch gar nicht vom Signal erreicht worden sein kann , eine
Rückwirkung auf den sendenden Ausgang haben? Wie soll das gehen?

Wie kannst Du den Knall hören, wenn Du den Blecheimer zwar
losgelassen hast, er aber noch gar nicht auf dem Boden
aufgeschlagen ist? Das geht physikalisch nicht, das wäre
akausal.

Wenn Du nun statt einer 100m-Leitung (--> 1 mal Wellenwiderstand)
fünf Leitungen zu je 20m parallelschaltest, dann "sieht" jetzt der
sendende Ausgang ein Fünftel des Wellenwiderstandes als Belastung,
muss also tatsächlich den fünffachen Strom aufbringen.

> 250 kHz brauche ich auch nicht. 10 kHz reichen mir um ein paar
> Sensoren auszulesen.

Naja. Dann ist das alles eine Diskussion über die leere Menge.

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.