Esta es una pregunta de seguimiento de ¿Qué ocurre si omito las resistencias pullup en las líneas I2C?
En un reloj de pared digital que diseñé (usando el RTC DS1307 y el MCU ATmega328), accidentalmente omití las resistencias pull-up que deben ser conectadas a ambas líneas I2C. Al final tuve la suerte de que los pull-ups internos en las líneas I2C del ATmega eran 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 la velocidad a 32kHz como se ve en las tomas de alcance de abajo.
Editar: En realidad, la frecuencia es exactamente de 100kHz - hay 2 picos por 20us en la traza verde. Al principio pensé que había una reducción a 32kHz porque mi osciloscopio calculaba la frecuencia en la traza amarilla.
Lo que me desconcierta ahora es cómo los dispositivos decidieron que 32kHz era suficiente para que la comunicación tuviera lugar. El Hoja de datos del DS1307 dice que el dispositivo soporta una frecuencia de 100kHz en el bus I2C. ¿Cómo es que terminó usando 32kHz en su lugar? ¿Existe algún tipo de fase de apretón de manos en la que se establece la frecuencia?
Al final, mi pregunta es realmente esta: ¿Cómo se establece la frecuencia de reloj entre el maestro y el esclavo en el protocolo I2C?
No he podido 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()
). Esta librería utiliza a su vez Wire.h
para hablar con el RTC.
4 votos
El estándar para I2C es aquí
1 votos
¿No podría ser que usted codificara arbitrariamente esa frecuencia sin saberlo?
0 votos
@Warren Esa referencia es realmente útil, gracias. No pude conseguir que Google me llevara a LA ESPECIAL. En cambio, me llevó al artículo de Wikipedia y a otros documentos tangenciales. Aun así, no pude entender cómo se determina la velocidad. Creo que lo que quiero saber está en la sección 3.1.7 Sincronización del reloj Pero agradecería mucho que alguien me lo explicara en términos más sencillos, ya que todavía está un poco por encima de mi cabeza.
0 votos
@Dzarda - Eso es exactamente lo que quería saber. Cómo se está codificando la frecuencia (si es que realmente lo es)?
1 votos
En tu sistema el DS1307 es un esclavo y su línea SCL es sólo una entrada. La frecuencia la establece el maestro, el MCU. Quien escribió el firmware para ello decidió la velocidad que quería. No hay negociación, está codificada.
0 votos
@Warren - Ya veo. Es un buen comienzo para buscar la respuesta en mi código y las librerías que utiliza. Gracias. Además, lo que estoy entendiendo es que la sincronización del reloj sólo se produce cuando hay más de un maestro involucrado. ¿Es eso cierto? Creo que podría insinuar eso al leer la especificación.
1 votos
Si la mayoría de los sistemas tienen un solo maestro, la sincronización del reloj sólo tiene sentido en un entorno multimaster.