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:
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:
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.
quelle
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:
Die Mindestwerte werden in Abhängigkeit von der Busspannung festgelegt und sollten den Strom durch die Treiber begrenzen.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c
quelle
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.
quelle