[Bus I2C] Sincronización de la señal de reloj

La señal de reloj generada por el master debe cumplir unos tiempos mínimos. Por ejemplo para 100 kHz: SCL al menos 4,7 μs en 0 y 4 μs en 1. Éstos pueden ser tiempos muy cortos para determinados slave que necesitan mas tiempo para procesar el dato de la línea SDA.

El slave puede ralentizar la cadencia de SCL si su tratamiento de los datos bit a bit es más lento que el del master. Para ello fuerza a 0 SCL, lo que obliga al master a permanecer en un estado de espera, y la vuelve a liberar, es decir desbloquear, cuando está listo para tratar otro bit, ya sea para leerlo o escribirlo, para continuar la transferencia de datos.

Generalizando

La sincronización del reloj se realiza gracias a la conexión AND de todos los dispositivos del bus a la línea SCL. Esto significa que un flanco de bajada de un Master en SCL hace que la línea pase a 0, manteniéndola en ese estado. Sin embargo un flanco de subida no cambia el estado de SCL si otro reloj esta todavía en nivel bajo 0. Por lo tanto SCL permanecerá a 0 tanto como el periodo mas largo de cualquier dispositivo cuyo nivel sea 0. Los dispositivos que tienen un periodo mas corto de reloj 0 entran en un periodo de espera.

Cuando todos los dispositivos conectados al bus han terminado con su periodo 0, es decir están preparados para el tratamiento de un nuevo bit, la línea del reloj se desbloquea y pasa a nivel 1. Por lo que hay que diferenciar entre los estados de reloj de los dispositivos y los estados de la línea SCL.

Resumiendo: La sincronización de la línea SCL se genera a través de…

… la señal a 0 por el dispositivo con el mas largo periodo, es decir el dispositivo mas lento, de nivel a 0 y …

… la señal a 1 por el dispositivo con el mas corto periodo, es decir el dispositivo mas rápido, de nivel a 1.

Si un dispositivo fuerza la línea SCL a 0, el master aunque la quiera poner a 1 no lo consigue hasta que todos los dispositivos que la fuerzan a 0 la liberen, es decir la pongan a 1.

Cuando un receptor lee el bit SDA con SCL a 1, mientras trata dicha información fuerza SCL a 0 hasta que esta listo para tratar el siguiente bit.