ElectroDesignForgeElectroDesignForge
Signale und SchnittstellenKomponentenPCB-Design

I2C-Bus: Verdrahtung, Adressierung und Pull-up-Widerstände

Verdrahten Sie einen zuverlässigen I2C-Bus: SDA- und SCL-Rollen, 7-Bit-Adressen, Geschwindigkeiten, Buskapazität, Anstiegszeit und Klimmzuggröße.

Geschrieben und technisch geprüft vonElectroDesignForge Engineering Team

Redaktionsprozess ansehen

Kernaussage: I²C verbindet mehrere ICs über zwei gemeinsame Leitungen: SDA für Daten und SCL für den Takt. Die Ausgänge arbeiten üblicherweise als Open-Drain: Ein Gerät zieht die Leitung auf LOW, während Pull-up-Widerstände den HIGH-Pegel herstellen. Bei der Dimensionierung sind sowohl der zulässige Senkstrom bei LOW als auch die durch Geschwindigkeit und Buskapazität begrenzte Anstiegszeit zu beachten.


Schnellreferenz

ModusMaximale Frequenz der SCLHöchstzahl t_r Anstiegszeit (30-70%)Referenzkapazität pro Zeile
Standardbetrieb (Sm)100 kHz1000 ns400 pF
Schnellbetrieb (Fm)400 kHz300 ns400 pF
Schnellmodus Plus (Fm+)1 MHz120 ns550 pF

Diese Grenzwerte ergeben sich aus der I2C-Spezifikation. Der langsamste Teil kann eine geringere Geschwindigkeit erfordern. Wählen Sie nicht Fm +, nur weil ein Controller es unterstützt: Jedes Ziel, jeder Level Shifter und jeder Isolator müssen es auch unterstützen.

SDA und SCL: gemeinsame Leitungen

SDA überträgt Adresse, Lese-/Schreibbit, Datenbytes und Bestätigungen. SCL taktet die Übertragung. Im Ruhezustand liegen beide Leitungen auf HIGH. Eine START-Bedingung entsteht, wenn SDA bei HIGH-Pegel auf SCL fällt; bei einer STOP-Bedingung steigt SDA bei HIGH-Pegel auf SCL.

Während der Datenübertragung bleibt SDA stabil, während SCL HIGH ist. Der Controller sendet acht Bits und gibt dann SDA auf der neunten Uhr frei; der Empfänger zieht SDA LOW für eine ACK oder lässt es für eine NACK.

                 +3.3 V                         +3.3 V
                   |                              |
                  [Rp]                           [Rp]
                   |                              |
SDA  ──────────────+──── controller ── target A ── target B
SCL  ──────────────+──── controller ── target A ── target B
GND  ───────────────────── common to every device

Verwendung ein effektives Pullup auf SDA und eines auf SCL Mehrere Module können sie bereits enthalten, so dass sie parallel sind. Zwei 4.7 kΩ Widerstände machen 2.35 kΩ; vier Marken 1.18 kΩPrüfen Sie die Modulschaltpläne, bevor Sie ein weiteres Paar hinzufügen.

Warum Open-Drain?

Ein Gerät fährt den Bus niemals aktiv HIGH: Es gibt eine Leitung frei oder zieht sie LOW. Wenn zwei Geräte zusammenwirken, gewinnt LOW ohne Kurzschluss zwischen gegenüberliegenden Endstufen. Dieses Wired-AND-Verhalten ermöglicht Acknowledge, Multi-Controller-Arbitrierung und Clock Stretching.

SCL kann manchmal Push-Pull in einem Single-Controller-System ohne Clock-Stretching-Ziele sein; Dokumentieren Sie diese Ausnahme explizit. Für einen tragbaren kompatiblen I2C-Bus halten Sie SCL mit seinem Pull-up Open-Drain.

Verdrahtung, Masse und Spannungspegel

Verbinden Sie alle Geräte parallel: SDA zu SDA, SCL zu SCL und gemeinsamer Boden. Vermeiden Sie einen Stern mit langen Zweigen; Stubs fügen Kapazität, Reflexionen und Rauschempfindlichkeit hinzu. Halten Sie auf einer PCB Signale kurz, über eine kontinuierliche Erdebene und von schnellen Vermittlungsknoten fern.

Die Aufziehschiene stellt das HIGH-Niveau ein. Es muss kompatibel sein mit alle I/O, einschließlich eines unpowered Mikrocontrollers. Verbinden Sie ein 1,8 V-Teil nicht direkt mit 3,3 V-Klimmzügen, es sei denn, das Datenblatt erlaubt dies. Verwenden Sie einen I2C-geeigneten Pegelschieber mit Klimmzügen auf beiden Seiten, wenn seine Schaltung sie erfordert.

Interne Pull-up-Widerstände von Mikrocontrollern liegen oft bei 20 to 100 kΩ: Auf sehr kurzen Leitungen und bei niedriger Geschwindigkeit kann das ausreichen, für belastete Busse mit 100 oder 400 kHz sind sie meist zu hochohmig. Prüfen Sie den tatsächlichen Wert.

Adressierung: 7-Bit, nicht 8-Bit

Die meisten ICs verwenden eine 7-Bit Zieladresse. Das erste Byte auf dem Draht ist:

[ A6 A5 A4 A3 A2 A1 A0 | R/W ]

Die R/W Bit wird auf dem Bus hinzugefügt; es ist nicht Teil der 7-Bit-Bibliotheksadresse. Ein Ziel bei 0x68 erscheint als 0xD0 zum Schreiben und 0xD1 zum Lesen. Eine API fragt nach 0xD0 kann einer 8-Bit-Konvention folgen - überprüfen Sie sie, bevor Sie eine Adresse zweimal verschieben.

ADDR, SA0, oder SDO Pins vieler Sensoren wählen eine Adresse aus. Binden Sie sie an eine definierte Ebene und zeichnen Sie Adressen im Schaltplan auf. Wenn Ziele mit fester Adresse kollidieren, verwenden Sie einen I2C-Multiplexer, einen anderen Controller oder eine andere Teilevariante. Zehn-Bit-Adressierung existiert, ist aber selten; ein internes Sensorregister ist nicht die I2C-Adresse.

Geschwindigkeit, SCL und Clock Stretching

Die SCL-Frequenz ist eine maximale Timing-Rate, nicht garantierte Nutzlastrate: Adressen, Register, ACK/NACK-Bits, START/STOP-Bedingungen und interne Verzögerungen reduzieren den Durchsatz. Eine 400-kHz-Multiregisterübertragung dauert daher länger als ihre Bytezahl geteilt durch 400 kbit/s.

Ein Ziel kann SCL LOW halten, nachdem der Controller es freigegeben hat: Clock Stretching. Der Controller muss SCL probieren und innerhalb der Produkt-Timeout-Richtlinie auf HIGH warten. Überprüfen Sie die Kompatibilität, da einige Fahrer schlecht damit umgehen. Im Multi-Controller-Einsatz verliert das Gerät, das SDA freigibt, aber LOW liest, die Arbitrierung und stoppt.

Buskapazität und Anstiegszeit

Jede Leitung ist eine RC-Last: IC-Eingänge, Leiterbahnen, Kabel, Sonden, Anschlüsse und Streukapazität summieren sich. Wenn kein Gerät eine Linie LOW zieht, lädt der Pull-up diese Kapazität allmählich auf.

Für 30% bis 70% VDD Messung:

t_r ≈ 0.8473 × R_p × C_bus
R_p,max ≈ t_r,max / (0.8473 × C_bus)

Verwenden Sie Ohms, Farads und Sekunden. Dies gibt die maximal Pull-up-Widerstand; darüber ist der Anstieg zu langsam. Bei 400 kHz mit C_bus = 100 pF:

R_p,max ≈ 300 ns / (0.8473 × 100 pF) ≈ 3.54 kΩ

4.7 kΩ zieht wenig Strom, ist aber auch groß 300 ns mit 100 pF zu erfüllen. 3.3 kΩ ist ein besserer Ausgangspunkt, abhängig von LOW-Stromgrenzen und Messungen. Vorzugsweise Messkapazität an der Endmontage; andernfalls Eingangskapazität, Kabeldaten (pF/m), Steckverbinder und Leiterplattenrand hinzufügen. Eine Sonde fügt auch Kapazität hinzu.

Pull-up Sizing: ein Fenster, kein magischer Wert

Ein kleinerer Widerstand beschleunigt die Flanke, erhöht aber den Strom, während ein Gerät LOW antreibt. Die untere Grenze ist:

R_p,min ≈ (VDD − V_OL,max) / I_OL,max

für VDD = 3.3 V, V_OL,max = 0.4 V, und I_OL,max = 3 mA:

R_p,min ≈ (3.3 − 0.4) / 3 mA ≈ 967 Ω
R_p,min ≤ R_p ≤ R_p,max

Der ausgewählte Wert ist nur in diesem Fenster gültig. Wenn kein Fenster vorhanden ist, reduzieren Sie die Kapazität, senken Sie die Geschwindigkeit, verwenden Sie einen geeigneten I2C-Puffer oder verwenden Sie ein Fm + -fähiges Gerät mit größerem Senkenstrom. Wählen Sie nicht unten R_p,min Nur weil es zu funktionieren scheint: V_OL kann mehrdeutig werden und die Dissipation steigt.

LageStartpunktÜberprüfung
Kurze Leiterplatte, 3,3 V, 100 kHz4.7 to 10 kΩKapazität und bestehende Pullups
Kurze Leiterplatte, 3,3 V, 400 kHz2.2 to 4.7 kΩt_r und jedes Ziel I_OL
Kabel oder viele Moduleberechnet, oft niedrigerSenkstrom, EMV, Wellenform am Kabelende

Diese Bereiche ersetzen nicht die Berechnung für Ihre Assembly.

Messung und Fehlerbehebung

Beobachten Sie SDA und SCL am am weitesten vom Controller entfernten Endpunkt. Maßnahme t_r bis 70 % von VDD, und Kontrolle V_OL, Klingeln und SDA Stabilität, während SCL HIGH ist.

SymptomWahrscheinliche UrsachenAktionen
Keine Ziele gefundenfehlender Boden, falsche Adresse, getauschte SDA/SCLContinuity, Power, 7-Bit-Scan überprüfen
Linien immer HIGHfehlender Klimmzug oder falsche SchieneÜberprüfen Sie beide Widerstände und ihre Schiene
Leine festgefahrenZiel im Reset, Verdrahtungsfehler, unterbrochene TransaktionModule isolieren und das Segment zurücksetzen
Zufällige NACKslangsamer Anstieg, Rauschen, Überkapazität oder GeschwindigkeitMaßnahme t_r, Abnahme R_pSlow Bus
Fails nur mit allen Modulenparallele Klimmzüge zu starke oder kumulative KapazitätBerechnung des äquivalenten Widerstands und der Kapazität

Eine typische Wiederherstellung gibt SDA frei, erzeugt bis zu neun SCL-Pulse, dann einen STOP. Verwenden Sie es nur, wenn alle Datenblätter es zulassen; Segment-Reset kann robuster sein.

Pre-layout Checkliste

  1. Teilen sich alle Teile Masse und kompatible Busspannung?
  2. Haben SDA und SCL jeweils einen effektiven Pull-up, ohne zufällige Parallelzusätze?
  3. Sind Adressen eindeutig und in 7-Bit-Form aufgeführt?
  4. Wird die Geschwindigkeit von jedem Ziel, Shifter und Isolator unterstützt?
  5. Do R_p,min und R_p,max den gewählten Wert gebunden?
  6. Wird die Anstiegszeit auf dem Board mit echter Kapazität überprüft?

zugehöriger Rechner

Quellen

  • NXP Halbleiter, *UM10204 - I2C-Bus Spezifikation und Benutzerhandbuch *: Protokoll, elektrische Pegel und Sm / Fm / Fm + Timing.
  • Datenblätter für den verwendeten Controller, Ziele, Shifter, Puffer und Isolatoren: Sie haben Priorität für I_OL, V_OL, Eingangskapazität und Taktstreckunterstützung.