La palabra I2c significa Inter Integrated Circuit, es decir cuando hablamos del Bus I2c, nos referimos a un Bus cuyo objetivo es la comunicación entre circuitos integrados.
El bus de comunicación I2C fue desarrollado por Philips en los años 80.
Características principales del Bus I2c
Estas son las principales características de que dispone del Bus I2c tanto a nivel Hardware como Software.
- Bus de serie síncrono: existe una sincronización entre la linea de datos(SDA) y la línea de reloj(SCL),la cual permite validar los datos, y una serie de opciones de control en el protocolo I2c que posteriormente explicaremos.
- Tanto la línea SDA y SCL deberán estar en PULL-UP.
- El sentido del enlace: será semidireccional, ya que existe solo una línea de datos que podrá utilizarse para el flujo de datos en ambos sentidos, pero nunca simultáneamente.
- Conexiones multipunto: se pueden conectar al Bus distintos dispositivos, pero no se pueden comunicar con ellos simultáneamente.
- El maestro: el maestro puede funcionar también como esclavo . Además los dispositivos pueden gobernar el Bus, ya que el maestro puede actuar como emisor o como receptor.
- Si mas de un maestro gobierna el Bus simultáneamente, debemos establecer un mecanismo de arbitraje o coordinación.
- Velocidad de transferencia: debemos adaptar la velocidad entra maestro-esclavo, la tasa máxima de transferencia máxima será entre 100 y 400 kilobits por segundo.
- Criterio de direccionamiento abierto: se establece con el fin de saber que esclavo se dirige al maestro.
El bus I2c define dos líneas y la referencia:
SDA(Serial Data): corresponde a la línea de datos, es una línea semibidireccional y se trata de una señal en colector abierto. Es gobernada por un emisor, que puede ser un maestro o esclavo.
SCL(Serial Clock): corresponde a la línea de sincronización o de reloj. SE trata también de una señal a colector abierto. Esta señal es gobernada por el maestro y corresponde a una de sus salidas, en cambio en el esclavo corresponde a la entrada y solo puede retenerla Una de sus misiones es establecer la sincronización entre Maestro-Esclavo.
Gnd: es la linea de referencia
Estados del Bus I2C
En el Bus I2C podemos encontrar diferentes estados:
Bus libre: en este estado las líneas SDA y SCL se mantienen a 1, sin que se produzca ninguna transferencia.
Condición de inicio: en el momento que el maestro inicia una transmisión de datos se produce la condición de inicio. Se corresponde a un cambio de alta a baja en la línea SDA, mientras que SCL se mantiene alta. En este momento el Bus está ocupado.
Condición de cambio: Este estado se produce en el momento que estando la línea SCL en baja, la línea SDA puece cambiar de estados. En este instante es cuando se produce la transmisión de los bits por parte del emisor, ya sea maestro o esclavo.
Dato válido: Una vez que se ha iniciado la transacción de datos, se define que el dato ha sido válido en el momento que pasa a la fase alta SCl. Es decir en este estado se considera que el dato emitido ha sido válido.
Parada: La parada se produce cuando la línea SCL se encuentra en alta, y se produce un cambio de baja a alta en la línea SDA. En este estado se indica el fin de la transferencia. posteriormente a este estado, se pasa al estado de bus libre de nuevo
Transacción de datos
La transacción de datos se compone de todos los eventos que se producen entre una condición de Inicio (Start) y parada (Stop).
Estas son las principales características de la transacción de datos.
- La unidad de transferencia se produce a nivel de 8 bits, los cuales tienen un orden de emisión empezando por el bit mas significativo y terminando por el menos significativo.
- Después de cada carácter se produce un reconocimiento por parte del receptor.
- El maestro es el que emite siempre el primer carácter, sus 7 bits mas significativos indican la dirección del esclavo al que se dirige, y el bit de menor peso, indica el sentido de la transferencia, si es escritura=0 y si es lectura =1.
- En una transacción de datos podemos cambiar el sentido si hacemos de nuevo una condición de reinicio direccionando de nuevo el mismo esclavo.
- Limitación de dispositivos: Ya que el Bus I2C tuvo mucho éxito, se fueron agotando las direcciones disponibles de bus I2c, y no se podian ofrecer nuevos circuitos I2c. Para ello se crearon direcciones que comenzaban por 1111, por ello ahora existen dos tipos de direcciones,: las normales de 7 bits como explique anteriormente y las ampliadas de 10 bits. En el caso de 10 bits, el direccionamiento del esclavo esta compuesto por la transferencia de dos caracteres, el primero comenzará por 11110XX(XX: los bits de mayor peso de la direccion de 10 bits), y el segundo caracter corresponde a los 8 bits inferiores de la dirección del esclavo.
Transacción de datos en C
#USE I2C: la librería I2C es la que contiene las funciones para implementar el Bus I2c, las funciones principales que contiene son I2C_START, I2C_STOP. I2C_READ, I2C_WRITE.
Ejemplo:
#use I2C(master, sda=PIN_B0, scl=PIN_B1)
#use I2C(slave,sda=PIN_C4,scl=PIN_C3 address=0xa0,NOFORCE_SW)
I2C_START(): Esta función manda una condición de inicio, cuando el dispositivo I2c está en modo master. Despues de la condición la linea SCL se mantiene a nivel bajo hasta que se llama a las funciones I2C_READ() O I2C_WRITE().
I2C_READ(): esta función nos permite leer un byte del Bus. En modo maestro esta opción genera los impulsos de reloj y en modo esclavo permanece a la espera de los impulsos.
Ejemplo:
i2c_start(); // condición de inicio
i2c_write(0xa1); // dirección del dispositivo
valor1 = i2c_read(); // Lee el primer Byte
valor2 = i2c_read(); // Lee segundo Byte
i2c_stop(); // condición de paro
I2C_WRITE(Byte): es la encargada de enviar un byte al interface I2c. En modo master la propia función genera la señal de reloj con los datos, y en modo esclavo espera la señal de reloj del master. Esta función devuelve el Bit de acuse de recibo (Ack).
Ejemplo:
i2c_start(); // condición de inicio
i2c_write(0xa0); // dirección del dispositivo
i2c_write(5); // envío de una orden al dispositivo
i2c_write(12); // envío de datos al dispositivo
i2c_stop(); // condición de paro
I2C_STOP(): Esta función envia una condicion de paro cuando el dispositivo I2c está en modo master.
Otras características del Bus I2c
El objetivo del Bit de reconocimiento es establecer un mecanismo de seguridad en las transferencias.
Todo esclavo receptor esta obligado a enviar dicho bit de reconocimiento. Si se produce un caso en el que el esclavo no envia dicho Bit, el maestro considerará que se ha producido algún tipo de fallo en el Bus y deberá establecer algún mecanismo de respuesta a dicho fallo.
Si el Bit de reconocimiento no es enviado en la fase de direccionamiento esto puede ser debido a:
- Que el circuito se encuentra ocupado realizando alguna operación, por ejemplo en los dispositivos que necesiten un tiempo de operación, por ejemplo una EEPROM necesita un tiempo para realizar la escritura.
- Que el circuito se encuentra ausente.
- Puede existir alguna anomalía en la linea
En cambio si el bit de reconocimiento está ausente en medio de una transferencia de datos, por lo general será tratado a una avería funcional.
¿Pero a que llamamos Bit de reconocimiento?
Principalmente consiste en que el receptor debe poner la línea de datos SDA a 0 mientras se produce el impulso SCL seguido del último bit de un carácter
Hay una excepción para que no se produzca el reconocimiento, y esto ocurre cuando el receptor es un maestro. La explicación es porque un esclavo emisor envia una serie de datos porque el maestro receptor se lo solicita, y el maestro receptor sabe los datos que desea.
La sincronización
La señal SCL es generada por un maestro. Si el maestro es emisor la señal de sincronía se interpreta para la validación de los bits volcados en la línea SDA.
Si en caso contrario el maestro actuase como receptor, SCL además de servir para indicar el instante en que el maestro toma los bits, también servirá para marcar la velocidad de envío del siguiente bit, esto quiere decir que el siguiente bit no es enviado hasta que se produzca una condición de cambio.
A este mecanismo la norma I2c le denomina sincronización, ya que un esclavo lento fuerza a un maestro de mayor velocidad a que siga su ritmo.
En algunos casos nos podemos encontrar el caso en que el esclavo es demasiado lento, ya que le sea imposible seguir la velocidad del maestro o que deba realizar algunos procesos que le consuman un tiempo y no se pueda dedicar a la comunicación con el maestro. Esto puede dar lugar a un fallo en la comunicación, para ello se han adoptado una serie de mecanismos:
En los casos que el maestro admita la sincronización, comprobará el estado de la línea SCL del bus, si al intentar activarla no se produce su activación esto significa que el esclavo le esta solicitando relentizar su velocidad. En este caso el maestro se encontrará a la espera con su SCL local activada y no lo considerará hasta que la linea SCL del Bus se encuentre alta.
En caso contrario los esclavos que admitan sincronización, se produce la acción contraria, este puede poner a baja su SCL local obligando a la linea SCL de Bus a estar en baja, y solo la liberará en el momento que se encuentre preparado para gestionar un nuevo Bit.
En la siguiente imagen podemos observar como se produce este mecanismo de sincronización.
La transferencia de alta velocidad
Actualmente podemos decir que la norma I2c tiene 3 modos de funcionamiento:
Normal: con tasas de velocidad de hasta 100kbps por segundo.
Rápido: Introducido en la revisión 1.0 de 1992 de hasta 400 kbps.
Alta velocidad: introducido en la revisión 2.0 de 1998, con tasas de velocidad de hasta 3.4 Mbps.
La compatibilidad es descendente , esto quiere decir que un dispositivo capaz de funcionar en modo de alta velocidad también lo hace en modo rápido y uno que trabaja en modo rápido también lo hará a velocidad normal.
El protocolo del modo de funcionamiento de alta velocidad no permite ni el arbitraje ni la sincronización bit a bit, ya que el objetivo que se busca en conseguir la máxima velocidad de transferencia.
Lógicamente todo maestro que trabaja en modo de alta velocidad debe realizar comunicaciones solo con circuitos que trabajen en modo de alta velocidad también.
Si el maestro soporta alta velocidad pero su funcionamiento es en modo inferior, solo podrá dirigirse a los circuitos en esos modos inferiores.
Todo circuito de Alta velocidad(HS) tiene la obligación de entrar en modo rápido en la puesta de alimentación . Si el maestro HS va a realizar una transación a velocidad rapida o normal lo hará como explicamos anteriormente, en caso contrario tiene que solicitar una petición de alta velocidad.
Como se puede apreciar en la siguiente imagen, en primer lugar se produce una condición de inicio, y posteriormente se emite el código de maestro HS sin bit de reconocimiento.
Por último en la siguiente imagen se especifican los 3 modos de funcionamiento con sus velocidades de transferencia correspondientes.
No hay comentarios:
Publicar un comentario