PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Bus mit 10 Slaves auf 10 metern



changlee
29.05.2011, 11:34
Hallo,
ich habe bis zu 10 Mikrocontroller (Slaves) gleichmäßig verteilt auf etwa 10m Buslänge und einen Master µC am Anfang. Geplant ist die Verwendung des I2C Busses, da recht einfach und keine weitere Hardware erforderlich.
Wenn ich die Übertragungsrate entsprechend niedrig wähle, sollte doch auch I2C über 10m funktionieren, oder? Soweit ich es verstanden habe ist doch die Leitungslänge nur deswegen kritisch, weil ein Puls durch induktive/kapazitive Leitungseigenschaften nach 10m nicht mehr richtig rechteckig ist, sondern "abgerundete Kanten" hat. Wenn das so schlimm wird, dass der µC die TTL Signale nicht mehr sauber erkennt, sollten doch Schmitt-Trigger-Eingänge völlig ausreichen. Oder sehe ich das falsch?

Als Hintergrundinfo, hier die Voraussetungen, die mich am I2C-Bus festhalten lassen:


übertragungsgeschwindigkeit egal
keine zusätzliche Hardware wie Bus-Transceiver, Controller,.. (Schmitt-Trigger-Input am µC vorhanden), aus Kostengründen; wenn extra Hardware, dann pro slave max. 20 Cent
Datenübertragung nur auf 5 Volt Pegeln, da sonst Extrakosten für Pegelwandler
Möglichst einfaches Protokoll.


Grüße,
Stefan

Besserwessi
29.05.2011, 12:01
Ganz so einfach und klar ist das leider nicht. Bei einer langen Leitung und steilen Flanken kann es zu Überschwingern kommen - die Steilheit der Flanken ist aber durch die Ausgangsstufen festgelegt, unabhängig von der tatsächlich genutzten Geschwindigkeit. Im ungünstigsten Fall wird das dann als ein Paar kurze Pulse interpretiert.

Da die Signale beim I2C keine feste Richtung haben, kann man auch nicht so einfach Schmidt-trigger einsetzen um eine langsame Flanke wieder steil zu machen. Mit dem Takt Signal kann man das ggf. noch machen, wenn die Slaves hier kein Clock-Stetching benötigen. Bei der Datenleitung ist es aber schwer was zu machen. Da muss man die Qualität der Ein und Ausgänge so nehmen wie die ICs sie anbieten.

teamohnename
29.05.2011, 12:09
Hallo Stefan,
vielleicht hilft Dir das weiter:
http://www.mikrocontroller.net/articles/I2C_als_Hausbus
Da geht es auch darum, das I²C Signal über lange Leitungen zu übertragen.
Viele Grüße
teamohnename

changlee
29.05.2011, 12:41
@Besserwessi:
wie es zu überschwingern kommen soll, verstehe ich nicht. Wann/wie treten die auf?
Clock-stretching wird nicht nötig sein. Aber zumindest was den Datenfluss von Master zu Slave angeht, sollte doch ein Schmitt-Trigger Eingang am Slave genügen, denn wenn wenn das Taktsignal seinen Zustand erreicht hat, sollte das doch auch für die Datenleitung gelten. Ggf. kann im Protokoll ja eine kleine Wartezeit bis zum auslesen des Daten-Pegels eingebaut werden.

@teamohnename:
danke für den Link. Der ist ja ganz informativ.

Ich werde mal sehen, ob ich hier ein 10m Kabel rumliegen habe. Dann kann ich einen Test machen.


Gibt es denn irgendwelche Alternativen, welche die harten Kostenanforderungen erfüllen? Ich hatte bisher noch RS485 oder CAN in Erwägung gezogen, aber das wird nicht direkt vom µC unterstützt und würde dann deutliche Mehrkosten für Buscontroller zur Folge haben.

Besserwessi
29.05.2011, 13:44
Überschwinger können durch Reflexionen am Leitungsende entstehen. Bei genügender Länge des Kabel, d.h. wenn die Laufzeit nicht mehr gegen die Anstiegszeit (bzw. auch die fallende Flanke) zu vernachlässigen ist, verhält sich auch ein Digitalsignal wie eine Welle und wird gff. am Ende des Kabels reflektiert. Die µCs haben oft Anstiegszeiten im Bereich 5-10 ns , da fangen die ersten Problem so ab 30 cm an.

Gegen die Reflexionen kann man die Kabel am Ende mit dem Wellenwiderstand abschließen. Bei I2C ist das aber so direkt keine wirkliche Option weil die rund 100 Ohm für I2C zu niederohmig sind. Man kann auch die Flanken (hier die fallende) absichtlich langsamer machen - das machen einige I2C ICs auch schon. Nachträglich sind dem aber Grenzen gesetzt.