Gibt es einen korrekten Widerstandswert für I2C-Pull-Up-Widerstände?


72

Das Datenblatt des 24LC256 EEPROM besagt, dass:

Der SDA-Bus erfordert einen Pull-up-Widerstand auf VCC (typisch 10 kΩ für 100 kHz, 2 kΩ für 400 kHz und 1 MHz).

Ich dachte, dass jeder Widerstand mit einem kΩ-Wert die Arbeit erledigen würde (und es scheint, dass mein EEPROM bei verschiedenen Frequenzen mit einem 10 kΩ-Widerstand einwandfrei funktioniert).

Meine Fragen sind:

  • Gibt es einen korrekten Wert für Pull-Up-Widerstände?
  • Gibt es ein Gesetz / eine Regel, um diesen Wert zu bestimmen?
  • Wie wirken sich unterschiedliche Widerstandswerte auf den I²C-Datenbus aus?

Antworten:


66

Der richtige Pullup-Widerstand für den I 2 C-Bus hängt von der Gesamtkapazität des Busses und der Frequenz ab, mit der Sie den Bus betreiben möchten.

Die Formel aus dem ATmega168-Datenblatt (von dem ich glaube, dass sie aus der offiziellen I 2 C-Spezifikation stammt) lautet:

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

Der Microchip 24LC256 spezifiziert eine maximale Pin-Kapazität von 10 pF (was ziemlich typisch ist). Zählen Sie die Anzahl der Geräte, die parallel am Bus angeschlossen sind, und verwenden Sie die obige Formel, um einen Wertebereich zu berechnen, der funktioniert.

Wenn Sie die Batterien ausschalten, würde ich Werte verwenden, die am oberen Ende des Bereichs liegen. Wenn es keine Leistungsgrenzen für die Stromquelle oder Leistungsverlustprobleme in den ICs gibt, würde ich Werte am unteren Ende des Bereichs verwenden.

Ich verkaufe einige Kits mit einer I 2 C RTC (DS1337). Ich habe 4K7-Widerstände im Kit, was für die meisten Benutzer ein vernünftiger Kompromiss ist.


Normalerweise würde ich mir vorstellen, dass der Bus die meiste Zeit im Leerlauf ist (de-asserted). Für eine Batterieanwendung sind daher wichtigere Probleme zu lösen, als die I2C-Pullups nur so zu optimieren: P
Nick T

5
Das einzige, was ich hinzufügen würde, ist ein Puffer über der summierten Kapazität der Geräte auf dem Bus. Die Leiterbahn selbst sowie die Lötstellen von den Kontaktstellen zu den Stiften haben ebenfalls eine gewisse Impedanz. Bei längeren Bussen kann die Kapazität der Leiterbahn / des Kabels größer sein als die Pin-Kapazität der Geräte. Beim Entwerfen von Produktionsplatinen bestimme ich normalerweise den endgültigen Pull-up-Wert erst, wenn ich einen Prototyp zur Hand habe und den Bus mit verschiedenen Werten ausstatten kann.
Mark

14

Es ist sinnvoll, dass höhere Frequenzen Pull-ups mit geringerem Widerstand erfordern: Ein geringerer Widerstand lädt / entlädt die Kapazität des Kabels schneller, was zu steileren Flanken führt. Bei den breiteren Impulsen mit niedrigeren Frequenzen wird die Impulsform durch eine weniger steile Flanke nicht so stark beeinflusst.

Die I2C-Spezifikation gibt daher Maximalwerte für die Pull-up-Widerstände in Abhängigkeit von der Buskapazität für drei Geschwindigkeitsklassen an:

Bildbeschreibung hier eingeben

Die Mindestwerte werden in Abhängigkeit von der Busspannung festgelegt und sollten den Strom durch die Treiber begrenzen.


3
3 Jahre später schrieb Texas Instruments eine Anwendungsnotiz , die dieser Antwort sehr nahe kommt.
Nick Alexeev

EDN-Artikel: Konstruktionsberechnungen für robuste I2C-Kommunikation . [Nur Referenzmaterial aufstapeln.]
Nick Alexeev

11

Es gibt einen korrekten Wertebereich, es ist jedoch schwierig, diesen Bereich genau zu beschreiben. Im Allgemeinen funktioniert 10k.

Digitale Ausgänge können Strom erzeugen oder ableiten. Wenn Ihr Ausgang 5 mA sinken könnte und der Ausgang über einen Pull-up auf 5 V angeschlossen und dann auf 0 gesetzt wurde, benötigen Sie einen Widerstand von mindestens 1k. Wenn Sie weniger als 1k verwenden, kann der Ausgang nicht genug Strom aufnehmen, um den Pin bis auf 0V herunterzuziehen. Wenn Sie einen größeren Wert wie 10k verwenden, muss der Pin nur 0,5 mA einspeisen, was viel weniger ist als seine Bewertung.

Digitaleingänge haben einen bestimmten Ableitstrom. Dies entspricht in etwa der Strommenge, die benötigt wird, um eine 0 oder 1 an einem Eingang zu "halten". Wenn Ihr Pull-up-Widerstand zu groß ist, kann er den Leckstrom nicht überwinden. Wenn es den Ableitstrom nur knapp überwindet, kann jedes Rauschen im Stromkreis ausreichen, um den Eingang zu ändern.

Bei Verwendung von digitalen Ausgängen, die Strom aufnehmen und abgeben können ("Totempfahltreiber", "Gegentakttreiber"), sind Sie möglicherweise versucht, keine Pull-up- oder Pull-down-Widerstände zu verwenden. Es ist jedoch sehr wichtig, dass CMOS-Eingänge nicht schweben dürfen, da sie sonst einen übermäßigen Strom ziehen können ... und es ist sehr leicht zu vergessen, dass bidirektionale MCU-Pins normalerweise als Eingänge dienen!


I2C und ähnliche Protokolle verwenden "Open Drain" - (oder "Open Collector" -) Ausgänge. Anstatt Ausgänge zu haben, die nach oben und unten ziehen können, können Open-Drain-Ausgänge nur nach unten ziehen. Deshalb wird der externe Pull-Up-Widerstand benötigt. Der Bereich der Pull-up-Widerstände unterliegt jetzt zusätzlichen Einschränkungen. Der Pull-Up-Wert bildet mit der Buskapazität eine RC-Schaltung. Ein zu kleiner Wert verhindert erneut, dass die Ausgangstreiber genug Strom aufnehmen, um den Pin vollständig auf 0 zu ziehen. Ein zu großer Wert dauert jedoch zu lange, um die Buskapazität aufzuladen.

Wenn es Rüst- / Haltezeiten gibt, gegen die Sie nicht verstoßen dürfen, können Sie anhand dieser Zeiten eine RC-Zeitkonstante bestimmen. Die Buskapazität wird größtenteils durch das PCB-Layout bestimmt, sodass Sie einen R-Wert auswählen können, der mit dem C kombiniert wird, um einen Wert zu erhalten, der bequem innerhalb der Einricht- / Haltezeit für Ihren Digitaleingang liegt.


7

Niedrige Pull-up-Werte (niedrigerer Widerstand) können die Flanken der Signalübergänge verbessern, können jedoch manchmal zu steif sein. Wenn die Geräte am Bus den Pull-up-Strom nicht aufnehmen können, erhalten Sie einen logischen Low-Pegel, der nicht wirklich so niedrig ist , was zu Kommunikationsfehlern (und starken Schmerzen) führen kann

Ich würde mit dem höchsten Pull-up-Widerstand arbeiten, der Ihnen zuverlässige Kommunikation bietet.


5

Bei tiefen Frequenzen spielt der Wert keine Rolle, bei hohen Frequenzen kann er jedoch in Kombination mit anderen Kapazitäten in der Schaltung eine Filterwirkung auf das Signal haben, weshalb sie unterschiedliche Werte für unterschiedliche Geschwindigkeiten empfehlen.


2

Ein Thema, das ich noch nicht erwähnt habe, ist der Stromverbrauch. Wenn eine 3,3-Volt-Versorgung verwendet wird, verschwendet ein 3,3-K-Widerstand gegen Erde 1 mA Strom (3,3 mW Leistung), wenn ein Ausgang niedrig ist. Die Verwendung eines 10K-Widerstands würde sowohl Strom als auch Leistung um den Faktor drei reduzieren. Wenn auf dem I2C-Bus viel Kommunikation stattfindet, kann dieser Stromverbrauch einen erheblichen Anteil an der gesamten Leistungsaufnahme ausmachen, insbesondere wenn der Bus über einen längeren Zeitraum niedrig bleibt. Wenn zum Beispiel 100 Bytes / Sekunde gelesen werden, aber nach dem Lesen jedes Bytes der Bus mit dem Gerät verbleibt, das das erste Bit des nächsten Bytes ausgibt, und die meisten dieser Bytes das MSB-Clear haben, kann der Bus 90% von ausgeben die Zeit mit SCL und SDA niedrig. Je nachdem, was das System sonst noch tut, kann dies den Stromverbrauch massiv erhöhen.

Um Energie zu sparen, kann es hilfreich sein, einen Pull-up-Widerstand an einen E / A-Pin und nicht an VDD anzuschließen. Ich habe zwar noch keine Hardware-I2C-Implementierungen gesehen, die dies unterstützen, aber es wird vermieden, die Master-Ausgangsdaten auf einem separaten E / A-Pin zu haben, der über einen Widerstand mit dem Bus verbunden ist, anstatt einen Open-Collector-Treiber und einen festen Pull-Up-Widerstand zu verwenden Verschwendung von Strom, wenn der Master eine "0" ausgeben möchte. Wenn der Master den SCK-Wert für eine Weile niedrig hält, ohne sich darum zu kümmern, was auf dem SDA gespeichert ist, kann der Master den Pull-up-Modus deaktivieren, bis er für weitere Kommunikation bereit ist. Wenn keines der Geräte Clock-Stretching verwenden muss, kann der Master einfach einen direkten Ausgang für SCK verwenden, ohne sich um das Hochziehen des Kabels zu kümmern.

Wenn man Software-Bit-Banging mit einem schnellen Prozessor verwendet und trotz hoher Buskapazität eine gute Leistung erzielen möchte, kann der obige Ansatz mit der Verwendung der eingebauten schwachen Pull-ups eines Prozessors kombiniert werden. Schalten Sie beim Lesen von Daten kurz nach jeder fallenden Flanke von SCK einen sehr starken Pullup ein und wechseln Sie dann zu einem schwachen Pullup. Das starke Hochziehen zieht die Leitung trotz der Kapazität hoch, und sobald die Leitung hochgezogen ist, kann das schwache Hochziehen sie hoch halten. Selbst wenn ein Gerät Probleme haben würde, die Leine gegen den starken Pull-up nach unten zu ziehen, könnte es dies tun, sobald der starke Pull-up ausgeschaltet wird.



-1

Hier sind Wellenformen für 400 Kilobit / Sekunde (Wellenform 200 KHz 101010). Der RC ist 4,7 kOhm und 212pF. Der RC-Wert ermöglicht ein Absetzen von 2 TAU.

Bildbeschreibung hier eingeben


Diese Antwort ist einfach falsch. 200-kHz-Takt liefert 200 kb / s, nicht 400. Nur die ansteigenden Flanken sind vom Pull-up-Widerstand betroffen. Die Handlungen sehen verwirrend aus, fast so, als ob eine Modulation stattfindet. Physikalische Größen und ihre Einheiten werden mit Leerzeichen (oder dünnem Leerzeichen) dazwischen geschrieben. Tau ist ein Symbol, keine Abkürzung.
Jenny

@venny Dies sind typische Wellenformen für einen Bus, der für die Einschwingzeit zu schnell fährt. Wenn sich nur 2 TAU einstellen, gibt es kein Flat-Top für die Wellenformen, daher die "irgendeine Art von Modulation"; Wäre dies ein Pseudozufallsmuster, so wäre die Variabilität der Abrechnung sehr offensichtlich. Lesen Sie auf "Daten Auge". Schließlich hat der 200-kHz-Takt ein Hoch für 2,5 us, dann ein Tief für 2,5 us; Die Periode von 2,5 us entspricht genau den 400-kHz-Daten, die ich erwähnt habe.
analogsystemsrf
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.