Zitat Zitat von kingf Beitrag anzeigen
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)