Was passiert, wenn ich die Pullup-Widerstände auf I2C-Leitungen weglasse?

33

Gerade wurde mir klar, dass die I 2 C-Daten- und Taktleitungen (SDA und SCL) Pullup-Widerstände aufweisen müssen.

Nun, ich habe mit dem DS1307 RTC (siehe Datenblatt ) ein paar Uhren nach dem untenstehenden Schema gebaut. Beachten Sie, dass ich beide Pullup-Widerstände weggelassen habe.

Schematische Darstellung meiner Uhr ohne Pullup-Widerstände auf I2C-Leitungen

Beide Uhren funktionieren einwandfrei, eine von ihnen arbeitet seit mehr als 3 Monaten. Wie ist das möglich? Auf jeden Fall wollte ich wissen:

  1. Was passiert, wenn die I 2 C-Klimmzüge weggelassen werden?

  2. Kann das Fehlen von Pullups einen dieser beiden ICs in meinem Board beschädigen?

Ich habe nach Antworten gesucht, die meinen speziellen Fall des Anschlusses des ATmega328P an einen DS1307 RTC behandeln, wie in den von mir bereitgestellten Schaltplänen dargestellt, aber wenn die Frage nicht zu weit geht, wäre es hilfreich zu wissen, was passiert, wenn die Pullups im Allgemeinen weggelassen werden dh in anderen Szenarien des I 2 C-Betriebs.

PS. Ich habe das Netz durchsucht, um die Antwort zu finden, konnte aber nur Artikel über die Dimensionierung der Klimmzüge finden.

Update: Ich verwende Arduino IDE 1.03 und meine Firmware verarbeitet die RTC mithilfe der DS1307RTC Arduino lib (über ihre Funktionen RTC.read()und RTC.write()). Diese Bibliothek verwendet ihrerseits, Wire.hum mit der RTC zu sprechen.

Update 2: Im Folgenden finden Sie eine Reihe von Scope-Aufnahmen, die ich gemacht habe, um zu erläutern, wie die I 2 C ohne die externen Pullups funktioniert.

Zielfernrohr 1 Zielfernrohr 2

Update 3 (nach dem Hinzufügen von I 2 C-Pullups): Nachfolgend finden Sie eine weitere Reihe von Scope-Aufnahmen, die ich gemacht habe, nachdem ich den I 2 C-Leitungen (auf derselben Platine) geeignete (4K7) Pullup-Widerstände hinzugefügt habe . Die Anstiegszeiten sanken von ca. 5 µs auf 290 ns. I 2 C ist jetzt viel glücklicher.

Zielfernrohr 3 Zielfernrohr 4

Ricardo
quelle
2
Deaktiviert Ihr Code die Pullups an diesen Pins?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams SDA- und SCD-Pins (18 und 19) werden in meinem Code nicht direkt erwähnt. Ich behandle die RTC mit der DS1307RTC lib Arduino lib und ihren Funktionen RTC.read () und RTC.write ().
Ricardo
Diese Bibliothek verwendet wiederum Wire.h, um mit der RTC zu sprechen.
Ricardo
3
Ja, auf jeden Fall mit internen Klimmzügen. Beachten Sie die Kurven anstelle von scharfen Kanten.
Ignacio Vazquez-Abrams

Antworten:

28

1) Was passiert, wenn die I2C-Klimmzüge weggelassen werden?

Es erfolgt keine Kommunikation auf dem I 2 C-Bus. Überhaupt. Die MCU kann die I 2 C-Startbedingung nicht generieren . Die MCU kann die I 2 C-Adresse nicht übertragen.

Sie fragen sich, warum es 3 Monate lang funktioniert hat? Weiter lesen.

2) Das Fehlen von Pullups kann wahrscheinlich einen dieser beiden ICs in meinem Board beschädigen.

Wahrscheinlich nicht. In diesem speziellen Fall (MCU, RTC, sonst nichts) definitiv nicht.

3) Warum konnte die MCU überhaupt mit dem I 2 C-Slave-Gerät kommunizieren ? Für I 2 C sind Pull-up-Widerstände erforderlich. Sie wurden jedoch nicht in den Schaltplan aufgenommen.

Wahrscheinlich sind auf dem ATmega interne Klimmzüge aktiviert. Nach dem, was ich unter 1 gelesen habe , verfügt ATmega über interne 20-kΩ-Klimmzüge, die über die Firmware aktiviert oder deaktiviert werden können. 20 kΩ sind viel zu schwach für den I 2 C- Pullup . Wenn der Bus jedoch eine geringe Kapazität (physisch klein) hat und die Kommunikation langsam genug ist, können 20 kΩ den Bus weiterhin zum Laufen bringen. Dies ist jedoch keine gute zuverlässige Konstruktion im Vergleich zur Verwendung diskreter Pull-up-Widerstände.

1 Ich bin kein ATmega-Typ.

Update: In Reaktion I 2 C-Kurven, die dem OP hinzugefügt wurden
Die Kurven im OP haben eine sehr lange Anstiegszeitkonstante. So sehen I 2 C-Wellenformen normalerweise aus

Bildbeschreibung hier eingeben

PIC18F4550, Vcc = +5 V, 2,2 kΩ Klimmzüge. Wellenform zeigt SCL. Die Anstiegszeit auf SDA ist ungefähr gleich. Die physikalische Größe des Busses ist moderat: 2 Slave-Geräte, Leiterplattenlänge ≈100mm.

Nick Alexeev
quelle
Danke für deine Antwort! Ja, der ATmega hat Pullups, die in meinem Fall aktiviert sein müssen. Ich werde den Code und die Bibliotheken, die ich verwende, noch einmal überprüfen und das Board auch durch den Geltungsbereich führen. Ich hoffe, das wird die Dinge ein bisschen klären.
Ricardo
1
Möglicherweise möchten Sie dies zuerst mit dem Datenblatt Ihres Slave-Geräts überprüfen. Wenn ich mich recht erinnere, können die Pullups des ATMega zwischen 30 und 60.000 liegen (dies hängt von Vcc, der Temperatur und einer Reihe anderer Faktoren ab; man kann sich nicht wirklich auf sie verlassen, um einen zuverlässigen Widerstand zu erzielen). Sie möchten sicherstellen, dass Sie genügend Strom an den Slave senden, um eine ordnungsgemäße Logik zu gewährleisten. 1. Wenn der Widerstand zu groß ist, wird Ihr Slave-Gerät nicht ausreichend mit Strom versorgt und Sie befinden sich an derselben Stelle, an der Sie sich befinden jetzt.
AudiFanatic
4
@audiFanatic +1. Übrigens, IMO, einschließlich Pull-up-Widerstände in die Breakout-Boards und deren standardmäßige Installation ist ein Fehler. Stellen Sie sich vor, was passiert, wenn jemand mehrere Breakout-Boards an einem I2C-Bus hat. Jeder Pull-up beträgt normalerweise etwa 2,2 kΩ. Die Pull-up-Widerstände auf allen Breakout-Boards werden parallel angezeigt. Das kombinierte Hochziehen wird für I2C zu steif. [Mehr zu diesem potenziellen Problem hier und hier .]
Nick Alexeev
2
@ Ricardo Das ist kein zufriedener I2C-Bus für Ihre Scope-Aufnahmen [erste Reihe von Scope-Aufnahmen im OP]. Ich habe meiner Antwort auch eine Zielfernrohraufnahme hinzugefügt.
Nick Alexeev
3
Dieser Artikel enthält einige Wellenformen von guten und schlechten i2c-Signalen: dsscircuits.com/index.php/articles/…
ford
16

Die von Ihnen verwendete Bibliothek und die Bibliotheken, von denen sie abhängt (Wire), ermöglichen die internen Pull-ups des ATMega. Dies sind schwache Klimmzüge und ergänzen bei normaler Verwendung alle externen Klimmzüge (zwei Widerstände parallel). Aufgrund der relativ hohen Beständigkeit von 20k bis 70k verursachen sie keine großen Probleme mit externen im Einsatz.

Was passiert, wenn die I2C-Klimmzüge weggelassen werden?

Jetzt ohne externe Widerstände sind die schwachen internen Klimmzüge das Einzige, was die Linie in die Höhe treibt. Abhängig von Ihrem Board-Layout, der Geschwindigkeit Ihrer i2c-Leitung, wie oft Sie darauf zugreifen, externen Interferenzen usw. funktionieren sie möglicherweise nicht. Du hast Glück gehabt. Sie haben Klimmzüge, nur nicht die, die Sie erwartet haben.

Das Fehlen von Pullups kann wahrscheinlich einen dieser beiden ICs in meinem Board beschädigen.

Selbst ohne die internen Klimmzüge wird ein Mangel an Klimmzügen keinen IC beschädigen. Der interne Aufbau der SCI- und SDA-Leitungen des i2c-Geräts ähnelt NPN-Transistoren. Sie sind Open Collectors , im Wesentlichen stromgesteuerte / geschaltete Dioden.

Das Letzte, was Sie jedoch beachten müssen, wenn die internen Pull-ups eingeschaltet sind, wenn Ihr ATMega auf 5 V ist und das i2c-Gerät ein Gerät ist, das nur 3,3 V unterstützt, kann zu Problemen führen. Oder wenn Sie die internen Pull-ups eingeschaltet haben und externe Widerstände an 3,3 V oder eine andere Spannung angeschlossen sind, kann dies ebenfalls zu Problemen führen. Im Wesentlichen handelt es sich um einen absichtlich ignorierten Fehler in der Wire-Bibliothek.

Passant
quelle
4
+1 - You do have pull-ups, just not ones you expected.- Ich denke du hast es geschafft. Vielen Dank!
Ricardo
Nur damit Sie wissen, dass ich ein paar Scope-Shots hinzugefügt habe, um zu verdeutlichen, was mit meinem Setup los ist.
Ricardo
2
@ Ricardo yep, die sehen, bei 33khz. Ein Drittel der niedrigsten von i2c spezifizierten Geschwindigkeit, und das Signal ist immer noch sehr schlecht. Bei 100 kHz oder 400 kHz hätten Sie keine funktionierende Kommunikation. Toll ist jedoch, dass viele i2c-Geräte mit einem Bruchteil der maximalen Geschwindigkeit arbeiten. Denken Sie daran, die internen Pullups können bis zu 70 kOhm betragen, ein typischer i2c-Widerstand ist 4,7 k
Passant am
8

Im Allgemeinen benötigen Sie die Pullup-Widerstände für eine I 2 C-Schnittstellenschaltung. Wenn die Schnittstelle an beiden Enden der Drähte wirklich die volle Spezifikation I 2 C aufweist, können die Signalleitungen ohne die Widerstände niemals den hohen Pegel erreichen. Sie können niedrig bleiben oder einen Zwischenpegel erreichen, der durch den Leckstrom in den Teilen an jedem Ende bestimmt wird. Der Grund dafür ist, dass true I 2 C ein Open-Drain-Bus ist.

Einige Geräte verfügen möglicherweise tatsächlich über chipinterne Pullup-Widerstände im Bereich von 20 K bis 100 K Ohm, um die Schnittstellenstifte auf einem hohen inaktiven Pegel zu halten, wenn die I 2 C-Schnittstelle des Teils nicht verwendet wird. Für einfache und kurze Schnittstellen können diese Pullup-Widerstände gerade ausreichen, um den Strom bereitzustellen, der zum Hochziehen der Leitungen erforderlich ist, während Takte und / oder Daten signalisiert werden.

Es ist schwer zu sagen, aus Ihrem Schaltplan, aber in einigen Fällen I 2 C-Schnittstellen werden mit Allzweck-I / O-Port-Pins implementiert und dann in der Software Bit-Banged. Manchmal kann es vorkommen, dass der Implementierer die E / A-Pins in dieser Konfiguration nicht mit einer Open-Drain-Methode bedient. Dies spielt möglicherweise eine Rolle, warum eine Schnittstelle ohne Pullup-Widerstände zu funktionieren scheint.

Am Ende des Tages sind Sie es wahrscheinlich sich selbst schuldig, die Signalisierung einer Ihrer früheren Uhren mit einem Oszilloskop zu überprüfen, um festzustellen, ob die Einsen und Nullen auf der Schnittstelle innerhalb der angegebenen Spannungspegel funktionieren. Dann werden Sie sicher wissen, ob Sie mit dieser Implementierung einfach unglaublich glücklich waren oder ob einer der Faktoren, die ich oben erwähnt habe, eine Rolle spielt.

Michael Karas
quelle
4

Was passiert, wenn die I2C-Pullups nicht ausgeführt werden?

Höchstwahrscheinlich funktioniert der I2C-Bus einfach nicht.

Das Fehlen von Pullups kann wahrscheinlich einen dieser beiden ICs in meinem Board beschädigen.

Höchst wahrscheinlich nicht.

Das Photon
quelle
3

Ihre I2C-Leitungen funktionieren überhaupt nicht. Wenn ich mich nicht irre, aktiviert I2C nur niedrige Signale, versetzt sie jedoch nicht wieder in einen hohen Zustand, weshalb Sie diese Widerstände benötigen.

Das Fehlen von Klimmzügen sollte keinen IC beschädigen.

Funkyguy
quelle
I2C-Pins sind offener Drain.
Matt Young
1

I2C ist ein TTL-Logikprotokoll; Ihre Daten- und Taktleitungen sind also offen. Mit anderen Worten, die I2C-Hardware kann diese Leitungen nur auf einen niedrigen Pegel bringen. Sie bleiben schwebend, wenn sie keine Null sind. Hier kommen die Pull-up-Widerstände ins Spiel. Dies ist ein vereinfachtes Diagramm, aber arbeiten Sie für eine Sekunde mit mir.

schematisch

simulieren Sie diese Schaltung - Schaltplan erstellt mit CircuitLab


Wie du siehst; Der Pull-up-Widerstand wird benötigt, um sicherzustellen, dass am Ausgang eine logische 1 angezeigt wird, wenn die TTL-Logik den Ausgang nicht auf LOW treibt. Wie bereits erwähnt, kann die TTL-Logik die Leitungen nicht hochfahren. Wenn dies nicht vorhanden wäre, würde die Ausgabe schweben und es ist unvorhersehbar, was Sie an der Ausgabe sehen könnten (soweit Sie wissen, könnten Ihre Mikrowelle oder die Darmstörungen Ihrer Mitarbeiter, die durch einen bestimmten zuckerfreien Gummibärchen verursacht werden, dazu führen der zu schwankende Wert).

Wenn Sie I2C in Software mit einem Mikrocontroller implementieren würden, wäre dies wahrscheinlich kein allzu großes Problem, da höchstwahrscheinlich CMOS-Logik verwendet wird, die die Ausgänge sowohl hoch als auch niedrig steuern kann.

audiFanatic
quelle
1
Ich bin froh, dass es geholfen hat.
AudiFanatic
2
Ob die Geräte TTL- oder CMOS-Logik verwenden, spielt keine Rolle - normale TTL- und normale CMOS-Ausgänge ziehen das Signal sowohl nach oben als auch nach unten. Die I2C-Signale sind entweder Open-Collector-TTL-Signale oder (wahrscheinlicher) Open-Drain-CMOS-Signale. In beiden Fällen fehlt der Transistor, der das Signal hochziehen würde, in der Ausgangsstufe der Source, weshalb Pull-up-Widerstände erforderlich sind ziehen Sie die Signale hoch. Es ist möglich, dass der Mikrocontroller interne Klimmzüge auf diesen Pint hat.
Peter Bennett
3
-1 Wie Peter Bennett sagte, ist ein Großteil dieser Antwort einfach falsch. Das Nennen von TTL-Signalen "Open-Drain" ist das Werbegeschenk.
Joe Hass
Beachten Sie, dass das Ausführen von I2C mit TTL einige Vorteile hat: Sie benötigen häufig keine Pegelumsetzer, um Komponenten mit unterschiedlichen Versorgungsspannungen zu handhaben, die an denselben Bus angeschlossen sind. Das einfache Einstellen der Pullup-Spannung auf die höchste akzeptierende Eingangsspannung des Chips mit der niedrigsten Spannung ist bei TTL- Eingangsstufen um ein Vielfaches ausreichend . Auf CMOS würde das nicht funktionieren.
Ben Voigt
@BenVoigt: Nein - Das Aufrufen der Konfiguration "erfordert einen Pull-up-Widerstand" "TTL" ist falsch, da diese Anordnung entweder mit CMOS oder TTL vorgenommen werden kann und der DS1307 ein CMOS-Teil ist. Das Maxim-Datenblatt gibt eindeutig an, dass die Ausgänge Open Drain sind, und das Blockdiagramm zeigt einen FET für einen Ausgang.
Peter Bennett
0

Wenn ich I2C mit einem Mikro als Master, der die Uhr liefert, knallte, war ich in der Lage, die SCL ohne Pullup zu fahren.

SDA muss jedoch OC mit Pullup sein, damit das Slave-Gerät herunterfahren und ordnungsgemäß reagieren kann.

Grüße

Wayne
quelle