Esta es una pregunta de seguimiento para ¿Qué sucede si omito las resistencias pullup en las líneas I2C?
En un reloj de pared digital que diseñé (usando el DS1307 RTC y el ATmega328 MCU), accidentalmente omití las resistencias de pull-up que deben estar conectadas a ambas líneas I2C. Al final tuve la suerte de que los pull-ups internos en las líneas ATmega I2C fueron suficientes para (apenas) permitir la comunicación entre los dispositivos. El resultado fueron largos tiempos de subida en las líneas I2C y reducción de velocidad a 32kHz como se ve en las tomas de alcance a continuación.
Editar: En realidad, la frecuencia es exactamente de 100 kHz, hay 2 picos por cada 20us en la línea verde. Inicialmente pensé que había una reducción a 32 kHz porque mi alcance calculó la frecuencia en la traza amarilla.
Lo que me desconcierta ahora es que los dispositivos decidieron que 32 kHz era suficiente para que se produjera la comunicación. El La hoja de datos de DS1307 dice que el dispositivo admite una frecuencia de 100 kHz en el bus I2C. ¿Cómo es que terminó usando 32kHz? ¿Hay algún tipo de fase de apretón de manos en la que se establezca la frecuencia?
Al final, mi pregunta realmente es esta: ¿Cómo se establece la frecuencia de reloj entre maestro y esclavo en el protocolo I2C?
No pude encontrar esa información buscando en la Red.
En caso de que esto importe, estoy usando Arduino IDE 1.03 y mi firmware maneja el RTC usando el DS1307RTC Arduino lib (a través de sus funciones RTC.read()
y RTC.write()
). Esa lib a su vez usa Wire.h
para hablar con el RTC.