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.
Beide Uhren funktionieren einwandfrei, eine von ihnen arbeitet seit mehr als 3 Monaten. Wie ist das möglich? Auf jeden Fall wollte ich wissen:
Was passiert, wenn die I 2 C-Klimmzüge weggelassen werden?
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.h
um 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.
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.
Antworten:
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.
Wahrscheinlich nicht. In diesem speziellen Fall (MCU, RTC, sonst nichts) definitiv nicht.
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
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.
quelle
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.
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.
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.
quelle
You do have pull-ups, just not ones you expected.
- Ich denke du hast es geschafft. Vielen Dank!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.
quelle
Höchstwahrscheinlich funktioniert der I2C-Bus einfach nicht.
Höchst wahrscheinlich nicht.
quelle
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.
quelle
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.
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.
quelle
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
quelle