Dies ist eine Folgefrage zu Was passiert, wenn ich die Pullup-Widerstände auf I2C-Leitungen weglasse?
Bei einer von mir entworfenen digitalen Wanduhr (unter Verwendung der DS1307 RTC und der ATmega328 MCU) habe ich versehentlich die Pull-up-Widerstände weggelassen, die an beide I2C-Leitungen angeschlossen werden müssen. Am Ende hatte ich das Glück, dass die internen Klimmzüge auf den ATmega I2C-Leitungen ausreichten, um die Kommunikation zwischen den Geräten (kaum) zu ermöglichen. Das Ergebnis waren lange Anstiegszeiten auf den I2C-Leitungenund Geschwindigkeitsreduzierung auf 32 kHz wie in den Scope-Aufnahmen unten zu sehen.
Bearbeiten: Tatsächlich beträgt die Frequenz genau 100 kHz - es gibt 2 Spitzen pro 20 us auf der grünen Spur. Anfangs dachte ich, es gäbe eine Reduzierung auf 32 kHz, weil mein Oszilloskop die Frequenz auf der gelben Spur berechnete.
Was mich jetzt verwundert, ist, wie die Geräte entschieden haben, dass 32 kHz für die Kommunikation ausreichen. Das Datenblatt DS1307 besagt, dass das Gerät eine Frequenz von 100 kHz auf dem I2C-Bus unterstützt. Wie kommt es, dass stattdessen 32 kHz verwendet wurden? Gibt es eine Art Handshake-Phase, in der die Frequenz eingestellt wird?
Am Ende lautet meine Frage wirklich: Wie wird die Taktfrequenz zwischen Master und Slave im I2C-Protokoll festgelegt?
Ich konnte diese Informationen im Internet nicht finden.
In diesem Fall verwende ich Arduino IDE 1.03 und meine Firmware verwaltet die RTC mithilfe der DS1307RTC Arduino lib (über ihre Funktionen RTC.read()
und RTC.write()
). Diese Bibliothek verwendet wiederum, Wire.h
um mit der RTC zu sprechen.