PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C und seine Widerstände?



Leidi
30.05.2005, 14:15
Ich möchte ein Temperatursensor DS1721 über I2C an den µC anschließen.
Die Leitung wird nicht länger als ca 1 Meter lang sein. Aus älteren Beiträgen hier im Forum weiß ich nun, dass ich geschirmtes Kabel nehmen sollte. Nun aber zu den Fragen:
1]Ich brauche noch Pull-Up Widerstände. Einmal ist die Rede von 1,8kOhm, ein anderes Mal von10kOhm. Ist das nun wurscht, wie groß der ist; hauptsache groß?
2]Nen Pull-Up-Widerstand ist doch nen stinknormaler Widerstand, oder? Der hat doch nur seinen Namen erhalten wegen seiner Funktion, oder?
3]Brauche ich nen Abschlußwiderstand?
Gruß
Leidi

slaud
30.05.2005, 14:26
1 10 k klingen gut
2ja
3 keine ahnung

Gerhard
30.05.2005, 14:34
ich verwende als Pullup ebenfalls 4,7k bis 10k.
Zusätzlich füge ich serielle Widerstände (330 Ohm) am Device ein. Siehe Bild:

Leidi
30.05.2005, 14:58
Jau, besten Dank!
Das Bild ist gut.
Daraus schließe ich dann aber, dass Abschlusswiderstände nicht notwendig sind. Richtig?!?!

Gerhard
30.05.2005, 15:37
Daraus schließe ich dann aber, dass Abschlusswiderstände nicht notwendig sind. Richtig?!?!

ja richtig. Das letzte Device bildet sozusagen den Abschluss.

mfg Gerhard

Frank
30.05.2005, 15:48
Wobei man die 330 Ohm jedoch eigentlich nicht braucht. Es ist nur eine zusätzliche Schutzmaßnahme die aber eigentlich unnötig ist weil die Ports im Eingangsmodus betrieben werden. Normalerweise tun´s zwei Widerstände ca. 5 bis 10 k, wie bereits gesagt wurde. Wo die sind ist gewöhnlich auch ziemlich egal. Wenn viele Teilnehmer (ab ca. 4 Teilnehmer) am Bus sind würde ich zu 4,7k ansonsten ist 10k auch ideal.

Leidi
30.05.2005, 16:49
Okay!
Das hat mir schon einmal weitergeholfen.
Thanks @all

pod32
29.10.2006, 21:33
Hallo,

wie ist es wenn die länge des I2C groß wird (>2m)?

Habe irgendwo einmal gelesen man muss einen 0,1µF Kondensator noch einbauen...

Was ist zu beachten wenn die Leitung länger wird und ich wahrscheinlich ClockStreching machen will/muss?

Danke!!!

phaidros
30.10.2006, 04:28
Von Philips gibt es spezielle I2C-Busextender, P82B715. Mit denen sind bis zu 50 Meter Buslänge drin.
Es geht aber auch ohne. Ich hab bei mir im Haus eine Buslänge von etwas über 20 Metern realisiert mit PICs als Devices. Dabei wird I2C über Software gemacht, so dass ich die Geschwindigkeit selber nach Belieben einstellen konnte. Ich musste ziemlich weit runter gehen bei der Länge, vielleicht 1 KBit/s, weiss nicht mehr genau. Werde aber demnächst auch auf die P82B715 umstellen.

MrQu
30.10.2006, 13:17
Also ich nehme auch immer 4,7 K als PullUp.

Die 330 Ohm (bzw. ich nehme immer 100 Ohm) verwende ich nur wenn ich eine externe Leitung anschliesse.
Wenn ich jetzt ein EE-Eprom hinhänge dann lasse ich die 100 Ohm weg.


Gruß MrQu

kingf
16.08.2017, 16:27
Hallo
ICh verstehe die Aufgabe von Pull up nicht bei I²C.

Danke

oberallgeier
16.08.2017, 16:42
Suchen, finden (https://www.mikrocontroller.net/topic/88806), lesen.

shedepe
16.08.2017, 17:33
Stichwort Open Collector.

Mal eine Erklärung zu der Wahl der Widerstandsgröße:
I2C Transmitter verwenden sog. Open Collector Ausgänge. D.h. sie haben einfach einen Transistor der SDA oder SCL auf Low ziehen kann. (Low ist auch der dominante Level) Wenn wir nun einen größeren Widerstand wählen fließt entsprechend weniger Strom als wenn wir einen kleineren wählen. Das ist eben entscheidend für die Frage: Wie viele Devices können wir am Bus betreiben -> Jedes Device das zuhört zieht ein kleines bisschen Strom und stellt eine Kapazität dar -> Zu viele Devices -> Keine stabilen HIGH, LOW Pegel (bzw. die Pegel können leichter gestört werden). Das gleiche gilt wenn wir nun die Länge des Busses betrachten. Ein längerer Bus bedeutet auch.: Mehr Kapazität. Diese Kapazität muss umgeladen werden -> Das geht nur mit mehr Strom in der selben Zeit.

Deshalb auch: Keine 0,1uF oder anderes in den Bus schalten. Das sorgt eher dafür, dass es nicht mehr funktioniert, bzw. langsamer funktioniert.
Laut Spezifikation darf die Bus Kapazität nicht 400 pF (550pf) betragen. Es wird außerdem empfohlen jeden Teilnehmer mit 100Ohm Serienwiderstand anzuschließen. Desweiteren gibt es Tabellen die in Abhängigkeit der Leitungslänge und der Anzahl der Teilnehmer die Größe der Pullup Widerstände vorgeben.

Zu guter Letzt: Sollte man wirklich lange Leitungen oder I2C in Störanfälligen Umgebungen betreiben wollen gibt es I2C differentiell Wandler: http://www.nxp.com/products/interfaces/ic-bus-portfolio/ic-fast-mode-plus/2-channel-multipoint-fast-mode-plus-differential-i2c-bus-buffer-with-hot-swap-logic:PCA9615DP
Und/Oder High Voltage I2C :D

Peter(TOO)
16.08.2017, 21:22
ICh verstehe die Aufgabe von Pull up nicht bei I²C.
Die beiden Pins (SDA und SCL) können Eingänge und Ausgänge sein.

Nimmt man Normale Ausgänge, welche nach 0 und 1 schalten und zwei Ausgängen schalten unterschiedliche Pegel auf den Bus, hat man einen Kurzschluss.

Die OC-Ausgänge können nur gegen 0 schalten und sind bei einer 1 einfach hochohmig. Letzeres gibt natürlich keinen vernünftigen Pegel. Die 1 zieht dann der Pull up hoch.

Diese Verschaltung ist auch als "wired AND" bekannt. Du bekommst die 1 nur, wenn alle Ausgänge auf der selben Leitung eine 1 ausgeben. also eine logische UND-Verknüpfung.

Wozu der ganze Aufwand?

Man kann sich zusätzliche Leitungen sparen.

Der Master sendet eine Reihe Bits an den Empfänger und schaltet die SDA dann auf 1 und wartet bis der Empfänger die Leitung auf 0 zieht, als Bestätigung, dass der Empfänger bereit ist das nächste Datenpaket zu Empfangen. Andernfalls würde man dafür eine weitere Leitung benötigen.

Der andere Trick ist das Clock-Stretching. Ist der Takt für einen Empfänger zu schnell, zieht er einfach SCL auf 0. Der Master erkennt, dass der Clock nicht auf 1 geht und legt eine Warteschleife ein.

Ein weiterer Vorteil liegt noch darin, dass jeder Baustein Master sein kann.

Ein Nachteil eines OC-Bumses ist die Leitungskapazität. Zusammen mit dem Pull up bildet sich ein RC-Glied, bei welchem dann der Spannungsverlauf von 0 auf 1 die schöne e-Funktion ergibt, welche man aus der Physik kennt.
R*C = Tau
Technisch geht man davon aus, dass ein C nach 5 Tau geladen ist.
Wenn man R kennt, kann man den Spannungsverlauf z.B. mit dem Oszilloskop ausmessen und die Grösse von C bestimmen.

OK, wenn man R möglichst klein macht, wird das schneller. Das Problem ist, dass der OC-Transistor nur einen maximalen Strom verträgt, kleiner darf man R nicht wählen. Da der Transistor auch noch einen Innenwiderstand hat (Besonders CMOS-Transistoren) wird der Pegel für die 0. mit kleinerem R grösser. Nun hat aber jeder Eingang eine bestimmte Schaltschwelle. Damit das richtig funktioniert, muss der Pegel plus die Störungen kleiner als die Schaltschwelle bleiben.
Das andere Problem ist das C. Beim Wechsel von 1 auf 0, muss das C entladen werden. Versucht man ein C in t=0 zu entladen wird der Entladestrom theoretisch unendlich. Praktisch sind da natürlich die verschiedenen Innenwiderstände, welche die nicht wirklich zulassen, aber der Transistor verträgt nur einen maximalen Strom und kann beim Überschreiten durchbrennen. Deshalb ist im Datenblatt auch der maximale Wert für C angegeben.

Das Ganze führt dazu, dass solche Bussysteme meist auf maximal ein paar Meter begrenzt sind.
Man könnte jetzt natürlich 10A-Power-FETs als Ausgangstreiber verwenden. Bei 5V verbrät dann der Pull up 50W, das ist so die Grössenordnung eines Elektronik-Lötkolbens. Sowas will man nur im Winter aber nicht auf der Leiterplatte. :-(
Abgesehen davon müsste dein Netzteil bei I2C dann 20A für die beiden Pull ups bereitstellen, das will auch keiner.

Eine älteres Bus-System, welche auf OC. basierte, was SCSI. Das war ein paralleler Bus mit 8,16 oder 32-Bit Breite, welcher vor USB und SATA für Festplatten, Scanner usw- verwendet wurde. Dabei gab es auch keinen festgelegten Master, man konnte also einen Sektor direkt von Festplatte zu Festplatte kopieren. Bei ATA musste man den Sektor von der einen Platte zuerst ins RAM der CPU laden und dann von dort zur anderen Festplatte. Bei solchen Operationen war SCSI doppelt so schnell.
Jedes SCSI-Gerät hatte eine eigene Adresse, bei der 8-Bit Version waren aber nur 8 Adressen möglich. Bei einem Rest zog einfach jedes Gerät das entsprechende Bit auf 0. Der Master hat dann die 8-Bit eingelesen und überall wo er eine 0 gelesen hat, war ein Gerät unter dieser Adresse ansprechbar.

MfG Peter(TOO)