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

Das Datenblatt des 24LC256 EEPROM besagt, dass:

Der SDA-Bus benötigt einen Pull-up-Widerstand gegen 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 Aufgabe erfüllen würde (und es scheint, dass mein EEPROM bei verschiedenen Frequenzen mit einem 10-kΩ-Widerstand gut 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 (11)

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 es aus der offiziellen I 2 C-Spezifikation stammt) lautet:

Freq < 100 kHz R Mindest = v c c 0,4 v 3 mA , R max = 1000 ns C Bus

Freq > 100 kHz R Mindest = v c c 0,4 v 3 mA , R max = 300 ns C Bus

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

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

Ich verkaufe einige Bausätze mit einem I 2 C RTC (DS1337). Ich schließe 4K7-Widerstände in das Kit ein, was für die meisten Benutzer ein vernünftiger Kompromiss zu sein scheint.

Normalerweise würde ich mir vorstellen, dass der Bus die meiste Zeit im Leerlauf (deaktiviert) ist, also gibt es für eine Batterieanwendung wichtigere Probleme zu lösen, als zu versuchen, I2C-Pullups einfach so zu optimieren: P
Das einzige, was ich hinzufügen würde, ist ein Puffer über der summierten Kapazität der Geräte am Bus. Die Leiterbahn selbst sowie die Lötverbindungen von Pads zu Pins haben ebenfalls eine gewisse Impedanz. Bei längeren Bussen kann die Kapazität der Leiterbahn/des Drahts größer sein als die Pin-Kapazität der Geräte. Beim Entwerfen von Produktionsplatinen bestimme ich normalerweise nicht den endgültigen Pull-up-Wert, bis ich einen Prototyp in der Hand habe und den Bus mit verschiedenen Werten ausstatten kann.

Es ist sinnvoll, dass höhere Frequenzen Pull-ups mit niedrigerem Widerstand erfordern: Ein niedrigerer Widerstand lädt/entlädt die Kapazität des Kabels schneller, was zu steileren Flanken führt. Bei den breiteren Pulsen mit niedrigeren Frequenzen beeinflusst eine weniger steile Flanke die Form des Pulses nicht so sehr.

Daher gibt die I2C-Spezifikation Maximalwerte für die Pull-up-Widerstände als Funktion der Buskapazität für drei Geschwindigkeitsklassen an:

Geben Sie hier die Bildbeschreibung ein

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

3 Jahre später schrieb Texas Instruments einen Anwendungshinweis , der dieser Antwort ziemlich nahe kommt.
EDN-Artikel: Entwurfsberechnungen für robuste I2C-Kommunikation . [Ich häufe nur Referenzmaterial an.]

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

Digitale Ausgänge haben eine bestimmte Fähigkeit, Strom zu liefern oder zu senken. Wenn Ihr Ausgang 5 mA sinken könnte und der Ausgang über einen Pull-up mit 5 V verbunden und dann auf 0 gesetzt wurde, benötigen Sie einen Widerstand von mindestens 1 k. Wenn Sie weniger als 1 k verwenden, kann der Ausgang nicht genug Strom aufnehmen, um den Pin ganz nach unten auf 0 V zu ziehen. Wenn Sie einen größeren Wert wie 10k verwenden, muss der Pin nur 0,5 mA sinken, was viel weniger als seine Nennleistung ist.

Digitaleingänge haben einen festgelegten Leckstrom. Dies ist so etwas wie die Strommenge, die benötigt wird, um eine 0 oder 1 an einem Eingang "beizubehalten". Wenn Ihr Pull-up-Widerstand zu groß ist, kann er den Leckstrom nicht überwinden. Wenn es den Leckstrom gerade so überwindet, könnte jedes Rauschen in der Schaltung ausreichen, um den Eingang zu ändern.

Wenn Sie digitale Ausgänge verwenden, die Strom aufnehmen und abgeben können ("Totempfahltreiber", "Gegentakttreiber"), könnten Sie versucht sein, 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 übermäßigen Strom ziehen können ... und es ist sehr leicht zu vergessen, dass bidirektionale MCU-Pins normalerweise als Eingänge auftauchen!


I2C und andere ähnliche Protokolle verwenden "Open Drain" (oder "Open Collector") Ausgänge. Anstelle von Ausgängen, 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. Es gibt jetzt zusätzliche Einschränkungen für den Bereich von Pull-up-Widerständen; Der Pull-up-Wert bildet mit der Buskapazität eine RC-Schaltung. Ein zu kleiner Wert verhindert wiederum, dass die Ausgangstreiber genügend Strom ziehen, um den Pin ganz nach unten auf 0 zu ziehen. Ein zu großer Wert dauert jedoch zu lange, um die Buskapazität aufzuladen.

Wenn es Setup/Hold-Zeiten gibt, die Sie nicht überschreiten dürfen, helfen Ihnen diese, eine RC-Zeitkonstante zu bestimmen. Die Buskapazität wird weitgehend durch das PCB-Layout bestimmt, sodass Sie dann einen R-Wert auswählen können, der sich mit dem C kombiniert, um einen Wert bereitzustellen, der bequem innerhalb der Einrichtungs-/Haltezeit für Ihren digitalen Eingang liegt.

Niedrige Pull-up-Werte (geringerer Widerstand) können die Flanken der Signalübergänge verbessern, können aber manchmal zu steif sein - wenn die Geräte am Bus den Pull-up-Strom nicht aufnehmen können, erhalten Sie logisch "Low", was nicht wirklich so niedrig ist , was zu Kommunikationsfehlern (und viel Schmerz) führen kann.

Ich würde den höchsten Pull-up-Widerstand wählen, der Ihnen eine zuverlässige Kommunikation ermöglicht.

Wenn Sie mich fragen, ist es das Beste, jedes Projekt mit einem Oszilloskop zu betrachten, wenn Sie es für kritisch halten. Sie können rechnen, aber ... es ist besser, es zu messen :), weil die Impedanz (Länge der Leitungen usw.) einen großen Faktor hat.

Auf meiner Website gibt es eine GIF-Animation des Effekts verschiedener Werte:

https://small-roar.com/i2c-inter-integrated-circuit/

Wie Sie sehen können, führt ein zu kleiner Wert dazu, dass das Signal nicht erkannt wird. Bei älteren MCUS wie Atmega ist dies kein Problem, da sie hohe Werte für "logisch niedrig / hoch" haben. Wenn Sie eine Anwendung mit geringem Stromverbrauch wünschen, ist dies nicht der beste Weg .

Geben Sie hier die Bildbeschreibung ein

Ein Problem, das ich noch nicht erwähnt habe, ist der Stromverbrauch. Wenn man eine 3,3-Volt-Versorgung verwendet, verschwendet ein 3,3-kΩ-Widerstand gegen Masse 1 mA Strom (3,3 mW Leistung), wenn ein Ausgang niedrig ist. Die Verwendung eines 10K-Widerstands würde sowohl den Strom als auch die Leistung um den Faktor drei reduzieren. Wenn auf dem I2C-Bus viel kommuniziert wird, kann dieser Stromverbrauch einen erheblichen Teil des gesamten Stromverbrauchs ausmachen, insbesondere wenn der Bus für längere Zeit niedrig ist. Wenn zum Beispiel 100 Bytes/Sekunde gelesen werden, aber nach dem Lesen jedes Bytes der Bus mit dem Gerät verlassen wird, das das erste Bit des nächsten Bytes ausgibt, und die meisten dieser Bytes das MSB frei haben, kann der Bus 90 % davon ausgeben die Zeit mit SCL und SDA niedrig. Je nachdem, was das System sonst noch tut, könnte dies die Leistungsaufnahme massiv erhöhen.

Um Strom zu sparen, kann es hilfreich sein, einen "Pull-up"-Widerstand mit einem I/O-Pin statt mit VDD zu verbinden. Obwohl ich keine Hardware-I2C-Implementierungen gesehen habe, die dies unterstützen, wird es 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 Stromverschwendung, wenn der Master eine "0" ausgeben will. Wenn der Master außerdem SCK für eine Weile niedrig belassen wird, ohne sich darum zu kümmern, was auf SDA ist, kann der Master den Pull-up 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 und sich nicht mit einem Pull-up auf dieser Leitung herumschlagen.

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 unmittelbar nach jeder fallenden Flanke von SCK kurz einen sehr starken Pull-up ein und wechseln Sie dann zu einem schwachen Pull-up. Der starke Pull-up zieht die Leitung trotz der Kapazität hoch, und sobald die Leitung hochgezogen ist, kann der schwache Pull-up sie hoch halten. Selbst wenn ein Gerät Schwierigkeiten haben würde, die Leine gegen den starken Pull-up nach unten zu ziehen, wäre es in der Lage, dies zu tun, sobald der starke Pull-up ausgeschaltet ist.

Vielen Dank für diese Antwort! Bei batteriebetriebenen oder wärmearmen Geräten hilft jedes bisschen.

Für niedrige Frequenzen spielt der Wert keine Rolle, aber für hohe Frequenzen kann er in Kombination mit anderen Kapazitäten in der Schaltung eine Filterwirkung auf das Signal haben, weshalb sie unterschiedliche Werte für unterschiedliche Geschwindigkeiten empfehlen.

Ich weiß, dass dies eine sehr alte Antwort ist, aber ich möchte kommentieren, dass der Widerstandswert bei niedrigen Frequenzen eine Rolle spielt . Wenn der Widerstandswert zu niedrig ist, können die Open-Collector-Ausgänge die Signalleitungen nicht auf einen gültigen Logikpegel herunterziehen 0.

Der minimale Widerstandswert hängt von den Treiberfähigkeiten von zwei Seiten des Busses ab. Zum Beispiel treiben sie 10 mA, also sollte Ihr Widerstandswert größer sein als v b u s 10   m EIN . Es ist kein exakter Widerstandswert, er hängt von Ihrer Buskapazität ab. Sie können Ihren Widerstandswert überprüfen, ob er korrekt ist oder nicht, indem Sie die Anstiegs- und Abfallzeit der Busimpulse messen. Sie finden diese Zeitwerte im folgenden Link:

http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c

Ihre Antwort ist relevant. In der Tat ist es kein exakter Wert, aber meiner Meinung nach eine sichere Annäherung. Beachten Sie jedoch, dass der minimale Widerstandswert die Buskapazität nicht berücksichtigen sollte und nur von dem maximalen Strom abhängen sollte, den Sie auf dem Bus zulassen möchten.

Angenommen, Sie möchten die Geschwindigkeit maximieren und gleichzeitig den Stromverbrauch minimal halten. Es ist ziemlich einfach, die maximalen und minimalen Widerstandswerte zu berechnen. Dies wird in diesem Datenblatt erläutert .

Buskapazität

Zuerst müssen wir die Buskapazität kennen. Es stimmt, dass Sie es grob abschätzen können, indem Sie die Pin-Kapazität der Treiber hinzufügen. Wenn Sie jedoch ein Produkt entwickeln, können Sie einen Prototyp mit einem beliebigen Testwiderstand zusammenbauen und einen genaueren Wert berechnen.

In dem genannten Datenblatt wird die folgende Gleichung hergeleitet:

t r = t 0,7 v C C t 0,3 v C C = 0,8473 × R P × C b

Sie können die Anstiegszeit an Ihrem Testaufbau messen und die höchste in die Gleichung einsetzen:

C b = t r M a x 0,8473 × R P t e s t

Mit diesem Wert können Sie auch überprüfen, ob Ihr System die von der Spezifikation zugelassene maximale Buskapazität erfüllt.

Maximaler Widerstand

Nachdem Sie die Kapazität erhalten haben, können Sie die Kapazität wieder in die Gleichung einsetzen, um die maximalen Widerstandswerte für Ihr System zu erhalten:

Für den Standardmodus:

R p ( m a x ) = 1000 n s 0,8473 × C b

Für den Schnellmodus:

R p ( m a x ) = 300 n s 0,8473 × C b

Für Schnellmodus plus:

R p ( m a x ) = 120 n s 0,8473 × C b

Minimaler Widerstand

Dies ist die einfachste Berechnung, teilen Sie einfach den maximalen Busspannungsabfall durch Ihren maximalen Zielstrom:

R P ( m ich n ) = v C C v Ö L ( m ich n ) ich Ö L

Hinweis: Im Datenblatt geben sie VOL(max) an. Ich glaube es ist ein Tippfehler. In jedem Fall liefert diese Antwort eine sichere Schnellkalkulation.

Was die ersten beiden Fragen betrifft, so glaube ich, dass sie angemessen beantwortet wurden. Zum dritten: Wie bereits erwähnt, spielen Pull-up-Werte zusammen mit der Kabelkapazität eine große Rolle sowohl bei der Erkennung Ihrer Geräte als auch bei der Geschwindigkeit, die Sie erreichen können, da sie effektiv einen Tiefpassfilter bilden.

Für ein aktuelles Projekt musste ich den Wert des Pull-up-Widerstands sehr niedrig (510 Ohm) absenken, um einen 50 m langen I2C-Bus über ein einfaches altes flaches Telefonkabel mit 5 V zu betreiben. Dies liegt weit außerhalb der I2C-Spezifikationen (min. ~ 1,5 kOhm Pull-ups für 5 V bei 3 mA), aber es funktioniert.

Hallo und willkommen auf der Seite! Stack Exchange-Sites unterscheiden sich sehr bewusst von traditionellen Internetforen. Hier machen wir nur konkrete Fragen und konkrete Antworten . Das Antwortformular ist nur für das Posten tatsächlicher Antworten, dh Lösungen, reserviert. Es darf niemals verwendet werden, um allgemeine Kommentare abzugeben, persönliche Erfahrungen zu teilen, die eigentlich keine Antwort sind, sich zu bedanken oder Fragen zu stellen.
Willkommen bei EE.SE, aber ich bin mir nicht sicher, ob dies die Fragen beantwortet: (1) Gibt es einen korrekten Wert für Pull-up-Widerstände? (2) Gibt es ein Gesetz/eine Regel zur Bestimmung dieses Werts? (3) Wie wirken sich unterschiedliche Widerstandswerte auf den I²C-Datenbus aus? Stack Exchange-Sites sind eher Q&A-Sites als ein Forum. Einzelheiten finden Sie in der Tour .

Gemäß der I2C- Busspezifikation hängt der Wert des I2C-Pull-Up-Widerstands hauptsächlich vom I2C-Modus (Standard / Fast / Fast Plus / HS), VDD und der kapazitiven Last des Busses ab.

Sein Mindestwert wird mit der folgenden Gleichung berechnet:

Rpmin = (VDD – VOLmax) / IOL

Woher:

  • VDD: Versorgungsspannung
  • VOLmax: Maximale LOW-Pegel-Ausgangsspannung
  • IOL: Niedriger Ausgangsstrom

Der Maximalwert wird mit der folgenden Gleichung berechnet:

Rpmax = tr / 0,8473 x Cb

Woher:

  • tr: Maximale Anstiegszeit des Signals ( SDA / SCL / SDAH / SCLH)
  • Cb: Maximale kapazitive Last für Busleitung

Ich habe ein Online-Tool zur Dimensionierung des Pull-up-Widerstands bei verschiedenen Busmodi erstellt. Sie können hier darauf zugreifen .

Dies ist kein Spam, sie haben die Zugehörigkeit offengelegt, was nach den Richtlinien von SE in Ordnung ist
Lassen Sie uns klarstellen, dass der Link am Ende dieses Beitrags Sie auf die Website eines gewinnorientierten Unternehmens weiterleitet, das auch Informationen über zum Verkauf stehende Produkte bereitstellt.
Das sollte auch mit dem Link oben gemacht werden. Es leitet zu einer NPX-Ressource weiter, die ebenfalls ein gewinnorientiertes Unternehmen ist, das viel größer ist als das, zu dem der Link unten weiterleitet. Obwohl, wenn ich darauf hinweisen darf, könnte es für die Community etwas mehr Einfluss haben, zu entscheiden, ob dieser Link der Community eine hilfreiche und zeitsparende Ressource bietet oder nicht. Ich persönlich glaube, dass mir mein Tool ein paar Stunden oder die Recherche des i2c-Protokolls erspart hätte. Das ist der Grund, warum ich meine Zeit in den Bau investiert habe.