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

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

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

Schema meiner Uhr ohne Pullup-Widerstände auf I2C-Leitungen

Beide Uhren funktionieren einwandfrei, eine davon läuft jetzt seit mehr als 3 Monaten. Wie ist das möglich? Jedenfalls wollte ich wissen:

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

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

Ich bin auf der Suche nach Antworten, die meinen speziellen Fall der Verbindung von ATmega328P mit einer DS1307-RTC wie in den von mir bereitgestellten Schaltplänen ansprechen, aber wenn die Frage nicht zu weit gefasst wird, 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 im Internet gesucht, 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 mit der DS1307RTC Arduino lib (über ihre Funktionen RTC.read()und RTC.write()). Diese Bibliothek wiederum verwendet Wire.h, um mit dem RTC zu sprechen.

Update 2: Unten ist eine Reihe von Scope-Aufnahmen, die ich gemacht habe, um zu erklären, wie der I 2 C ohne die externen Klimmzüge funktioniert.

Zielfernrohrschuss 1 Zielfernrohrschuss 2

Update 3 (nachdem I 2 C-Pullups hinzugefügt wurden): Unten ist eine weitere Serie von Scope-Aufnahmen, die ich gemacht habe, nachdem ich die richtigen (4K7) Pullup-Widerstände zu den I 2 C-Leitungen (auf derselben Platine) hinzugefügt hatte. Die Anstiegszeiten sanken von etwa 5 µs auf 290 ns. I 2 C ist jetzt viel glücklicher.

Zielfernrohrschuss 3 Zielfernrohrschuss 4

Deaktiviert Ihr Code die Pullups an diesen Pins?
@IgnacioVazquez-Abrams In meinem Code werden die SDA- und SCD-Pins (18 und 19) nicht direkt erwähnt. Ich handhabe die RTC mit der DS1307RTC lib Arduino lib und ihren Funktionen RTC.read() und RTC.write().
Diese Bibliothek verwendet wiederum Wire.h, um mit dem RTC zu kommunizieren.
Ja, definitiv mit internen Klimmzügen. Beachten Sie die Kurven anstelle von scharfen Kanten.

Antworten (7)

1) Was passiert, wenn die I2C-Pullups weggelassen werden?

Es findet keine Kommunikation auf dem I 2 C-Bus statt. Überhaupt. Die MCU wird nicht in der Lage sein, die I 2 C-Startbedingung zu erzeugen. Die MCU wird nicht in der Lage sein, die I 2 C-Adresse zu übertragen.

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

2) Das Fehlen von Pullups wird 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? I 2 C erfordert Pull-up-Widerstände. Aber sie wurden nicht in den Schaltplan aufgenommen.

Wahrscheinlich haben Sie interne Pull-ups auf dem ATmega aktiviert. Nach dem, was ich gelesen habe 1 , hat ATmega interne 20-kΩ-Pullups, die über die Firmware aktiviert oder deaktiviert werden können. 20 kΩ sind viel zu schwach für den I 2 C-Pullup. Aber wenn der Bus eine niedrige Kapazität hat (physikalisch klein) und die Kommunikation langsam genug ist, können 20 kΩ den Bus immer noch zum Laufen bringen. Dies ist jedoch im Vergleich zur Verwendung diskreter Pull-up-Widerstände kein gutes zuverlässiges Design.

1 Ich selbst bin kein ATmega-Typ.

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

Geben Sie hier die Bildbeschreibung ein

PIC18F4550, Vcc=+5V, 2,2kΩ Pullups. Wellenform zeigt SCL. Die Anstiegszeit bei SDA ist ungefähr gleich. Die physische Größe des Busses ist moderat: 2 Slave-Geräte, PCB-Länge ≈100 mm.

Danke für deine Antwort! Ja, der ATmega hat Pullups, die in meinem Fall aktiviert werden müssen. Ich werde den Code und die Bibliotheken, die ich verwende, noch einmal überprüfen und das Board auch durch den Bereich bringen. Ich hoffe, das wird die Dinge ein wenig klären.
Vielleicht möchten Sie zuerst mit dem Datenblatt Ihres Slave-Geräts nachsehen. Wenn ich mich recht erinnere, können die Klimmzüge der ATMega irgendwo zwischen 30k und 60k liegen (es hängt von Vcc, Temperatur und einer Reihe anderer Faktoren ab; Sie können sich nicht wirklich auf einen zuverlässigen Widerstand verlassen). Sie möchten sicherstellen, dass Sie genügend Strom an den Slave senden, um eine ordnungsgemäße Logik 1 sicherzustellen. Wenn der Widerstand zu groß ist, erhält Ihr Slave-Gerät nicht genügend Strom und Sie befinden sich an derselben Stelle, an der Sie sich befinden jetzt.
Ich habe kürzlich I2C für einen Beschleunigungsmesser (Invensense MPU-6050) verwendet und die empfohlenen Klimmzüge waren weniger als 30k, wenn ich mich recht erinnere. Glücklicherweise hatte das von mir verwendete Breakout-Board sie eingebaut, sodass ich mir keine Sorgen machen musste. Für $7 ist dieser kleine Kerl unschlagbar; Sparkfun will 40 Dollar für denselben Chip und das Board hat nichts anderes drauf. Dieser hat Klimmzüge und 3,3-V-Regler, sodass ich ihn mit 5-V-Geräten verbinden kann. amazon.com/…
@audiFanatic +1. Übrigens, IMO, das Einschließen von Pull-up-Widerständen in die Breakout-Boards und deren standardmäßige Installation ist ein Fehler. Stellen Sie sich vor, was passiert, wenn jemand mehrere Breakout-Boards auf einem I2C-Bus hat. Jeder Pull-up beträgt normalerweise etwa 2,2 kΩ. Die Pull-up-Widerstände auf allen Breakout-Boards erscheinen parallel. Kombinierter Klimmzug wird für I2C zu steif. [Mehr zu diesem potenziellen Problem hier und hier .]
Stimmt, so habe ich mir das nie vorgestellt. Ich habe mich nicht wirklich darum gekümmert, weil ich nur eine Sache im Bus habe. Aber gut zu wissen für die Zukunft
Nur damit Sie wissen, dass ich ein paar Scope-Aufnahmen hinzugefügt habe, um zu verdeutlichen, was mit meinem Setup vor sich geht.
@Ricardo Das ist kein glücklicher I2C-Bus auf Ihren Scope-Aufnahmen [erster Satz von Scope-Aufnahmen im OP]. Ich habe meiner Antwort auch einen Zielfernrohrschuss hinzugefügt.
Dieser Artikel enthält einige Wellenformen guter und schlechter i2c-Signale: dsscircuits.com/index.php/articles/…
@nick kein Fehler. Eine Eigenschaft. Es ist einfacher, die zusätzlichen Klimmzüge zu deaktivieren, als sie einem Modul hinzuzufügen.
@Passerby Keine Funktion. Eine Fehlfunktion. Ein Fehler. Nicht jedem ist bewusst, dass zu viele Klimmzüge parallel ein Problem verursachen. (AudiFanatic wusste es zum Beispiel nicht. Dieses Problem mit Klimmzügen auf mehreren Breakout-Boards ist schon einmal auf EE.SE aufgetaucht.) Der einzig ehrliche Weg, es zu einem Feature zu machen, besteht darin, Pads für die Klimmzüge auf dem zu belassen Breakout-Board unbestückt, Pull-Up-Widerstände separat im Kit beilegen, Handbuch und Schaltplan für das Board um einen Absatz ergänzen.
@Passerby Warum machen Sparkfun und so etwas so, wie sie es tun? Sie wollen eine einfache Out-of-the-Box-Erfahrung. Viele ihrer Kunden verwenden nur ein Breakout-Board, sodass sie nicht auf das Problem paralleler Klimmzüge auf mehreren Breakout-Boards stoßen. Aber wenn sie darauf stoßen, sind sie vielleicht völlig verblüfft: „ Jedes kleine Board funktioniert separat gut, aber sie arbeiten nicht zusammen. wtf. “ Viele Breakout-Board-Benutzer sind neu im I2C. Der Zweck von Pull-up-Widerständen ist ihnen neu. Sie haben die I2C-Spezifikation noch nicht gelesen. Nichts für ungut.
@ford Der Link über gute und schlechte I2C-Signale ist großartig. Es befasst sich auch mit der Auswahl guter Pull-up-Widerstandswerte gemäß unserem eigenen speziellen Design (Anzahl der angeschlossenen Geräte und deren Kapazitäten). Danke!!
@audiFanatic: Drei Faktoren verhindern die Verwendung mit sehr schwachen Pullups: (1) Wenn ein Gerät Eingangsstrom gegen Masse ableitet, kann ein übermäßig schwacher Pullup ein Signal möglicherweise überhaupt nicht hochziehen; (2) Eingänge mit schwächeren Klimmzügen sind anfälliger für Rauschen als solche mit stärkeren; (3) Schwächere Klimmzüge werden Eingaben nicht so schnell hochziehen wie stärkere. Der Betrieb eines I2C-Busses mit 400 kbps erfordert ziemlich starke Pull-Ups; das Betreiben eines mit 1kbps wird es nicht. Sogar ein 100K-Pull-up wäre in vielen Fällen praktikabel, wenn man langsam genug arbeiten würde.

Die Bibliothek, die Sie verwenden, und die Bibliotheken, von denen sie abhängt (Wire), aktivieren die internen Pullups des ATMega. Dies sind schwache Klimmzüge und ergänzen bei normalem Gebrauch alle externen Klimmzüge (zwei parallel geschaltete Widerstände). Aufgrund des relativ hohen Widerstands von 20k bis 70k verursachen sie keine großen Probleme mit externen im Einsatz.

Was passiert, wenn die I2C-Pullups weggelassen werden?

Jetzt ohne externe Widerstände sind die schwachen internen Pull-Ups das einzige, was die Leitung hoch treibt. Abhängig von Ihrem Board-Layout, der Geschwindigkeit Ihrer i2c-Leitung, wie oft Sie darauf zugreifen, externen Störungen usw. funktionieren sie möglicherweise, möglicherweise nicht. Du hast Glück gehabt. Du hast Klimmzüge, nur nicht die, die du erwartet hast.

Das Fehlen von Pullups wird wahrscheinlich einen dieser beiden ICs in meinem Board beschädigen?

Selbst ohne die internen Pull-Ups wird das Fehlen von Pull-Ups keinem IC schaden. Der interne Aufbau der SCl- und SDA-Leitungen des i2c-Geräts ähnelt NPN-Transistoren. Sie sind Open Collectors , im Wesentlichen stromgesteuerte/geschaltete Dioden.

Als letztes ist jedoch zu beachten, dass es zu Problemen kommen kann, wenn die internen Pull-ups eingeschaltet sind, wenn Ihr ATMega auf 5 V liegt und das i2c-Gerät ein reines 3,3-V-Gerät ist. 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.

+1 - You do have pull-ups, just not ones you expected.- Ich denke, du hast es auf den Punkt gebracht. Danke!
Nur damit Sie wissen, dass ich ein paar Scope-Aufnahmen hinzugefügt habe, um zu verdeutlichen, was mit meinem Setup vor sich geht.
@ Ricardo ja, sehe diese bei 33 kHz. Ein Drittel der niedrigsten i2c-Spezifikationsgeschwindigkeit, und das Signal ist immer noch sehr schlecht. Bei 100 kHz oder 400 kHz hätten Sie keine funktionierende Kommunikation. Das Tolle ist jedoch, dass viele i2c-Geräte mit einem Bruchteil der maximalen Geschwindigkeit arbeiten. Denken Sie daran, dass die internen Pullups bis zu 70 kOhm betragen können, ein typischer i2c-Widerstand beträgt 4,7 kOhm

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 ein voll spezifiziertes I 2 C ist, werden die Signalleitungen ohne die Widerstände niemals in der Lage sein, auf den hohen Pegel zu gehen. Sie können niedrig bleiben oder auf ein Zwischenniveau gehen, das durch den Leckstrom in den Teilen an jedem Ende bestimmt wird. Der Grund dafür ist, dass echter I 2 C ein Open-Drain-Bus ist.

Einige Geräte haben möglicherweise On-Chip-Pullup-Widerstände im Bereich von 20 K bis 100 K Ohm, nur um die Schnittstellenstifte auf einem hohen inaktiven Pegel zu halten, wenn die I 2 C-Schnittstelle auf dem Teil 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 aus Ihrem Schaltplan schwer zu erkennen, aber in einigen Fällen werden I 2 C-Schnittstellen unter Verwendung von Allzweck-E / A-Port-Pins implementiert und dann in Software Bit-Banged. Manchmal betreibt der Implementierer die E/A-Pins in dieser Konfiguration möglicherweise nicht mit einer Open-Drain-Methode, und dies kann einen Faktor dafür spielen, 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 zu sehen, ob die Einsen und Nullen auf der Schnittstelle innerhalb der spezifizierten Spannungspegel arbeiten. Dann wissen Sie sicher, ob Sie mit dieser Implementierung einfach unglaubliches Glück hatten oder ob einer der oben genannten Faktoren eine Rolle spielt.

Was passiert, wenn die I2C-Pullups weggelassen werden?

Höchstwahrscheinlich wird der I2C-Bus einfach nicht funktionieren.

Das Fehlen von Pullups wird wahrscheinlich einen dieser beiden ICs in meinem Board beschädigen?

Höchst wahrscheinlich nicht.

Ihre I2C-Leitungen werden überhaupt nicht funktionieren. Wenn ich mich nicht irre, gibt I2C nur niedrige Signale aus, kehrt sie aber nicht in einen hohen Zustand zurück, weshalb Sie diese Widerstände benötigen.

Ein Mangel an Klimmzügen sollte keinen IC beschädigen.

I2C-Pins sind Open-Drain.

I2C ist ein TTL-Logik-Protokoll; Ihre Daten- und Taktleitungen sind also Open-Drain. Mit anderen Worten, die I2C-Hardware kann diese Leitungen nur niedrig treiben; 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 – Mit CircuitLab erstellter Schaltplan


Wie du sehen kannst; 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 ich bereits erwähnt habe, kann die TTL-Logik die Leitungen nicht hochtreiben. Wenn dies nicht vorhanden wäre, würde der Ausgang in der Schwebe bleiben und es ist nicht vorhersehbar, was Sie am Ausgang sehen können (nach allem, was Sie wissen, könnte Ihre Mikrowelle oder die durch ein bestimmtes zuckerfreies Gummibärchen verursachten Darmstörungen Ihrer Mitarbeiter verursachen der Wert zu schwanken).

Wenn Sie nun 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 Ausgänge sowohl hoch als auch niedrig treiben kann.

Schön, dass es geholfen hat.
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 oder (wahrscheinlicher) Open-Drain-CMOS - in beiden Fällen fehlt der Transistor, der das Signal hochziehen würde, in der Ausgangsstufe der Quelle, daher sind Pull-up-Widerstände erforderlich Ziehen Sie die Signale hoch. Es ist möglich, dass der Mikrocontroller interne Pull-ups auf diesen Pints ​​hat.
-1 Wie Peter Bennett sagte, ist ein Großteil dieser Antwort einfach falsch. TTL-Signale als "Open-Drain" zu bezeichnen, ist das Werbegeschenk.
Beachten Sie, dass I2C mit TTL Vorteile bietet, nämlich dass Sie häufig keine Pegelumsetzer benötigen, um Komponenten mit unterschiedlichen Versorgungsspannungen zu handhaben, die an denselben Bus angeschlossen sind. Bei TTL -Eingangsstufen reicht es oft aus, die Pullup-Spannung auf die höchste akzeptierte Eingangsspannung des Chips mit der niedrigsten Spannung einzustellen . Auf CMOS würde das nicht funktionieren.
@BenVoigt: Nein - es ist falsch, die Konfiguration "erfordert einen Pull-up-Widerstand" "TTL" zu nennen, da diese Anordnung entweder mit CMOS oder TTL getroffen 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 Dem stimme ich voll und ganz zu. Meine Kommentare beziehen sich darauf, was TTL wirklich ist, nicht auf die verwirrte Version in dieser Antwort. Sie sagten, dass TTL vs. CMOS keine Rolle spielt, aber obwohl die Eingangsschwelle nur tangential mit schwachen Pullups zusammenhängt, ist sie in einzelnen Schaltungen von Bedeutung.

Wenn ich I2C mit einem Mikro als Master, der den Takt liefert, bitbange, konnte ich den SCL ohne Pullup fahren.

SDA muss jedoch OC mit Pullup sein, damit das Slave-Gerät herunterziehen und richtig reagieren kann.

Grüße