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.
Beide Uhren funktionieren einwandfrei, eine davon läuft jetzt seit mehr als 3 Monaten. Wie ist das möglich? Jedenfalls wollte ich wissen:
Was passiert, wenn die I 2 C-Klimmzüge weggelassen werden?
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.
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.
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
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.
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.
You do have pull-ups, just not ones you expected.
- Ich denke, du hast es auf den Punkt gebracht. Danke!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 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.
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.
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
Ignacio Vazquez-Abrams
Ricardo
Ricardo
Ignacio Vazquez-Abrams