I²C

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

Un circuito interintegrado (I²C, del inglés Inter-Integrated Circuit) es un bus serie de datos desarrollado en 1982 por Philips Semiconductors (hoy NXP Semiconductors). Se utiliza principalmente internamente para la comunicación entre diferentes partes de un circuito, por ejemplo, entre un controlador y circuitos periféricos integrados.

El sistema original fue desarrollado por Philips a principios de 1980 con el fin de controlar varios chips en televisores de manera sencilla. Desde mediados de 1990 el I²C también es utilizado por algunos competidores para designar los sistemas compatibles I²C Philips, incluyendo Siemens AG (posteriormente Infineon Technologies AG), NEC, STMicroelectronics, Motorola (Freescale más adelante), Intersil, etc. Hay un total de mil circuitos integrados diferentes de más de 50 fabricantes (según datos de 2014).

Atmel introdujo por motivos de licencia la designación TWI (interfaz de dos hilos) actualmente utilizada por algunos otros fabricantes. Desde el punto de vista técnico, TWI e I²C son idénticos. Sin embargo, el 1 de octubre 2006, la patente original caducó, así que ya no hay derechos de autor para el uso del término I²C. I²C no es tampoco una marca comercial registrada de NXP Semiconductors, la protección de marca es sólo para el logotipo.

Historia[editar]

El bus I²C fue introducido en 1982 por Philips para la comunicación interna entre circuitos integrados como por ejemplo juegos de CD y televisiones. Para ello, fue desarrollada la familia de microcontrolador MAB8400, la cual poseía un controlador de bus I²C. La primera especificación estandarizada 1.0 fue publicada en 1992. Ésta sustituyó el estándar original de 100 kbps por un nuevo modo rápido con 400 kbps y expandió el espacio de direccionamiento a un modo de 10 bits, de tal manera que en vez de los 112 nodos originales, ahora es compatible con hasta 1136 nodos.

Con la versión 2.0 de 1998 llegó el modo de alta velocidad (Hs) con un máximo de 3,4 Mbps, aunque los requisitos de voltaje e intensidad de corriente fueron reducidos. La versión 3.0 de 2007 incluyó un nuevo modo denominado Fm+ (modo rápido mejorado) con una velocidad máxima de 1 Mbps que, al contrario que el modo Hs, utiliza el mismo protocolo que los modos de 100 y 400 kbps.

En el año 2012 fue establecido con la versión V.4 un modo aún más rápido, el Ufm (modo ultrarrápido), el cual es compatible con velocidades de transferencia unidireccionales de hasta 5 Mbps. En este mismo año fueron corregidos con la versión actual de V.5 los errores de la versión anterior. En abril de 2014 fue presentada la versión V.6 que volvió a corregir algunos errores.

Sistema de bus[editar]

El I²C está diseñado como un bus maestro-esclavo. La transferencia de datos es siempre inicializada por un maestro; el esclavo reacciona. Es posible tener varios maestros mediante un modo multimaestro, en el que se pueden comunicar dos maestros entre si, de modo que uno de ellos trabaja como esclavo. El arbitraje (control de acceso en el bus) se rige por las especificaciones, de este modo los maestros pueden ir turnándose.

Un ejemplo esquemático con un maestro (un microcontrolador) y tres nodos esclavos (un ADC, un DAC, y otro microcontrolador) con resistencias pull-up Rp.

Definición eléctrica[editar]

En el diagrama de la derecha se encuentran representados tres dispositivos. El I²C precisa de dos líneas de señal: reloj (CLK, Serial Clock) y la línea de datos (SDA, Serial Data). Ambas líneas precisan resistencias de pull-up hacia VDD. Cualquier dispositivo conectado a estas líneas es de drenador o colector abierto (Open Collector), lo cual en combinación con las resistencias pull-up, crea un circuito Wired-AND. El nivel alto debe ser de al menos 0,7 x VDD y el nivel bajo no debe ser más de 0,3 x VDD. Las resistencias en serie Rs (no representadas en el diagrama), en la entrada de los dispositivos, son opcionales y se usan como resistencias de protección. El Bus I²C trabaja con lógica positiva, esto quiere decir que un nivel alto en la línea de datos corresponde a un 1 lógico, el nivel bajo a un 0.

Pulso y estado del bus[editar]

La señal de reloj siempre es generada por el maestro. Para cada modo especificado, está predeterminado respectivamete un pulso de reloj máximo permitido. En general, también pueden ser utilizadas señales de reloj más lentas, siempre y cuando sean compatibles con la interfaz del maestro. Sin embargo, algunos circuitos integrados (por ejemplo, un conversor o convertidor de señal analógica-digital) requieren una frecuencia mínima con el fin de funcionar correctamente. En la tabla siguiente se muestran los porcentajes máximos permisibles de reloj.

Modo Velocidad de transmisión máxima Dirección
Standard Mode (Sm) 0,1 Mbit/s Bidireccional
Fast Mode (Fm) 0,4 Mbit/s Bidireccional
Fast Mode Plus (Fm+) 1,0 Mbit/s Bidireccional
High Speed Mode (Hs-mode) 3,4 Mbit/s Bidireccional
Ultra Fast-mode (UFm) 5,0 Mbit/s Unidireccional

Si el esclavo necesita más tiempo que el dictado por el reloj del maestro, puede mantener, entre la transferencia de bytes individuales, la señal de reloj en nivel bajo o low (clock-stretching) para frenar de este modo al maestro.

Los datos (bits individuales) sólo son válidos si su nivel lógico no cambia durante una fase de reloj alta. Las excepciones son el inicio, la parada, y la señal de inicio repetida o reset. La señal de arranque es un flanco descendiente en SDA mientras SCL se encuentra en nivel alto. La señal de parada es un flanco ascendiente en SDA mientras SCL está en en nivel alto. La señal de reset se comporta de igual manera que la señal de incio.

Una unidad de datos consta de 8 bits = 1 octeto (los cuales puede ser interpretados como un valor o como una dirección, dependiendo del protocolo) y un bit de ACK. Este bit de confirmación (Acknowledge) es señalizado por un esclavo como NACK (not acknowledge) con un nivel alto, durante un nivel bajo en SDA y el noveno nivel alto de SCL (que sigue siendo generado por el maestro). El esclavo debe poner un nivel bajo en SDA antes de que SCL cambie a nivel alto, de lo contrario otros participantes podrían interpretar esto como una señal de arranque.

Direccionamiento[editar]

La dirección de I²C estándar es el primer byte enviado por el maestro, aunque los primeros 7 bits representan la dirección y el octavo bit (R/W-Bit) es el que comunica al esclavo si debe recibir datos del maestro (low/bajo) o enviar datos al maestro (high/alto). Por lo tanto, I²C utiliza un espacio de direccionamiento de 7 bits, lo cual permite hasta 112 nodos en un bus (16 de las 128 direcciones posibles están reservadas para fines especiales).

Cada uno de los circuitos integrados con capacidad de soportar un I²C tiene una dirección predeterminada por el fabricante, de la cual los últimos tres bits (subdirección) pueden ser fijados por tres pines de control. En este caso, pueden funcionar en un I²C hasta 8 circuitos integrados. Si no es así, los circuitos integrales (que precisan ser idénticos) deben ser controlados por varios buses I²C separados.

Debido a la escasez de direcciones, se introdujo más tarde un direccionamiento de 10 bits. Es compatible con el estándar de 7 bits mediante el uso de 4 de las 16 direcciones reservadas. Ambos modos de direccionamiento pueden ultilizarse simultánemente, lo que permite hasta 1136 nodos en un único bus.

Protocolo de transferencia[editar]

El inicio de una transmisión es indicado por la señal de incio del maestro, seguido de la dirección. Ésta es confirmada por el ACK-Bit del esclavo correspondiente. En función del R/W-Bit se escriben bytes de datos (datos al esclavo) o se leen (datos al maestro). El ACK es enviado desde el esclavo al escribir, y desde el maestro al leer. El último byte „leído“ es reconocido por el maestro como un NACK (not acknowledge), para indicar el final de una transmisión. Una transmisión es finalizada por la señal de parada. Como alternativa, puede ser enviada una señal de reset al arranque de una nueva transmimsión, sin necesidad de parar la transmisión anterior con una señal de parada.

Todos los bytes son transferidos de esta manera como „Most Significant Bit First“ (bit más significativo primero).

Para el modo de alta velocidad (High-Speed-Mode) es enviado un código del maestro a través del modo estándar o rápido, antes de cambiar al aumento de frecuencia.

Uso[editar]

Una de las propiedades del I²C es el hecho de que un microcontrolador puede controlar toda una red de circuitos integrados con sólo dos I/O-Pins (Input/Output) y un software muy simple. Los buses de este tipo fueron realizados ya que una proporción significativa del precio de un circuito integrado y la placa de circuito depende del tamaño de la carcasa y del número de pines. Una carcasa grande tiene más pines, necesita más espacio en la placa de circuito y tiene más conexiones que podrían fallar. Todo esto aumenta los costes de desarrollo, producción y pruebas.

Aunque es más lento que los sistemas de bus más nuevos, I²C es beneficioso (debido al bajo coste) para los sistemas periféricos que no necesitan ser rápidos. A menudo es usado para la transmisión de datos de control y configuración. Por ejemplo para control de volumen, conversor de señal analógica-digital o digital-analógica con baja tasa de frequencia de muestreo, relojes a tiempo real, pequeños espacios de memoria o conmutadores bidireccionales y multiplexores. Incluso los sensores electrónicos integran con frecuencia un convertidor analógico-digital con un I²C.

Es posible añadir o retirar microcontroladores al bus durante su funcionamiento (Hot-Pluggin).

También es utilizado como base para ACCESS.bus y monitores de interfaz VESA (DCC, Display Data Channel). El SMBus (del fabricante Intel) para la comunicación de componentes de la placa base, se parece mucho al bus I²C. La mayoría de los circuitos integrados soportan ambos buses.

El protocolo I²C tuvo gran importancia en el pasado en el área de las tarjetas chip. La tarjeta sanitaria utilizada en Alemania hasta finales del 2014 era una tarjeta I²C, es decir, debajo de la superficie dorada del chip, se encontraba una simple I²C-EEPROM, que podía ser leída y escrita por el lector de tarjetas a través de un protocolo de bus I²C.

Estabilidad[editar]

El protocolo del I²C es por definición bastante simple, pero a la vez muy susceptible a las interferencias. Este hecho limita su uso únicamente a entornos de poca interferencia, en los cuales no se ha de esperar nigún tipo de ruido, problemas de compatibilidad electromagnética o diafonías, ni problemas de contacto (clavijas, enchufes). Asimismo, no es adecuado como puente entre grandes distancias, como suele ser típico para los buses de campo, por ejemplo.

Sin embargo, el bus puede ser implementado por conductores especiales a un mayor nivel de intensidad de corriente o tensión, gracias a lo cual la posible longitud de potencia y la distancia de señal de ruido aumenta. Una mayor distancia de ruido es posible a través de una implementación sobre la capa física del bus CAN, la cual opera con señales diferenciales de colector abierto (drenador abierto). Las irregularidades tanto de la señal SDA como de la señal SCL provocan que los datos sean transmitidos incorrectamente. Estas irregularidades a menudo no se pueden detectar, especialmente si son producidas en la señal SDA. Únicamente con perturbaciones o irregularidades de corto tiempo, como por ejemplo muy por encima de la frecuencia de señal, el sistema puede hacerse más estable a través de señales de procesamiento.

Un problema importante dentro de la especificación de un I²C es la falta de un tiempo de espera, que en ocasiones puede conducir a que los microcontroladores se bloqueen. Si un esclavo se encuentra empujando la línea de datos a "0" y el reset restablece al maestro, esta línea de datos permanece indefinidamente en "0". De este modo, todo el bus I²C permanece bloqueado con todos los microcontroladores conectados. A no ser que el esclavo tenga un propio reset, este bloqueo puede ser resuelto únicamente por pulsos de reloj generados manualmente, es decir, apagar o encender el suministro de energía.

Alternativas[editar]

Véase también[editar]

Enlaces externos[editar]

NXP Semiconductors (PDF, engl.; 1,4 MB)