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.
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.
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.
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.
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.
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.
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
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
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?
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.
wegen Stromspiegel: http://digilentinc.com/Data/Products/CHIPKIT-PRO-MX7/chipKIT_Pro_MX7_bysa_a_sch.pdf Seite 7 oben links
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
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.
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"...
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.
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...
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
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.
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.
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.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.