I²C ( Inter-Integrated Circuit ; pronunciado como " eye - squared-see " o " eye-two-see "), también conocido como I2C e IIC , es un bus de comunicación serie síncrono , multi-maestro/multi-esclavo , de terminación simple , inventado en 1980 por Philips Semiconductors (ahora NXP Semiconductors ). [ 1 ] Se utiliza ampliamente para conectar circuitos integrados (CI) periféricos de baja velocidad a procesadores y microcontroladores en comunicaciones intra-placa de corta distancia.
El bus I²C se encuentra en una amplia gama de aplicaciones electrónicas donde la simplicidad y el bajo costo de fabricación son más importantes que la velocidad. Los componentes y sistemas de PC que utilizan I²C incluyen EEPROM de detección de presencia en serie (SPD) en módulos de memoria en línea dual (DIMM) y datos de identificación de pantalla extendida (EDID) para monitores a través de conectores VGA , DVI y HDMI . Las aplicaciones comunes de I²C incluyen la lectura de monitores de hardware, sensores, relojes en tiempo real , el control de actuadores, el acceso a DAC y ADC de baja velocidad , el control de pantallas LCD u OLED simples , el cambio de la configuración de la pantalla de la computadora (por ejemplo, retroiluminación, contraste, tono, balance de color) a través del canal de datos de pantalla y el cambio de volumen de los altavoces.
Una ventaja particular del protocolo I²C es la capacidad de un microcontrolador para controlar una red de chips de dispositivos con solo dos pines de E/S de propósito general . Muchas otras tecnologías de bus utilizadas en aplicaciones similares, como el bus de interfaz periférica serie (SPI), requieren más pines y señales para conectar múltiples dispositivos.
El bus de gestión del sistema (SMBus), definido por Intel y Duracell en 1994, es un subconjunto de I²C que define un uso más estricto. Uno de los objetivos de SMBus es promover la robustez y la interoperabilidad. Por consiguiente, los sistemas I²C modernos incorporan algunas políticas y reglas de SMBus, a veces compatibles con ambos protocolos , requiriendo una reconfiguración mínima mediante comandos o el uso de pines de salida. La gestión del sistema para PC utiliza SMBus, cuyos pines se asignan tanto en conectores PCI convencionales como en PCI Express .

Invención
En la patente europea EP0051332B1, Ad PMM Moelands y Herman Schutte figuran como inventores del bus I2C. Ambos trabajaban en 1980 como ingenieros de desarrollo en el laboratorio central de aplicaciones CAB de Philips en Eindhoven, donde el bus I2C se desarrolló como un "sistema de bus de dos hilos que comprende un hilo de reloj y un hilo de datos para interconectar varias estaciones". La patente estadounidense se concedió con el número US 4689740A . El nombre interno del bus fue inicialmente COMIC, que posteriormente se cambió a I2C. La patente se transfirió a Koninklijke Philips NV.
Diseño
Las patentes y especificaciones de I²C utilizaron los términos maestro/esclavo entre 1980 y 2021. [ 1 ] [ 3 ] En 2021, la revisión 7 de la especificación I²C cambió los términos a controlador/objetivo . [ 3 ] [ 4 ] Las definiciones técnicas de dichos dispositivos y sus funciones en un bus I²C permanecen sin cambios . [ 4 ]

I²C utiliza únicamente dos señales : la línea de datos serie (SDA) y la línea de reloj serie (SCL). Ambas son bidireccionales y se conectan mediante resistencias pull-up . [ 3 ] Los voltajes típicos utilizados son +5 V o +3,3 V, aunque se permiten sistemas con otros voltajes.
El diseño de referencia I²C tiene un espacio de direcciones de 7 bits , con una extensión de 10 bits que se usa con poca frecuencia. Algunos proveedores informan direcciones de 8 y 11 bits, ya que el bit menos significativo del primer byte de dirección se usa para diferenciar entre comandos de escritura y lectura. [ 5 ]
Las velocidades comunes del bus I 2 C son las siguientes: Modo estándar de 100 kbit/s y modo rápido de 400 kbit/s . También existe un modo de baja velocidad de 10 kbit/s , aunque se permiten frecuencias de reloj arbitrariamente bajas. Las revisiones posteriores de I²C pueden admitir más nodos y funcionar a velocidades superiores ( modo rápido de 400 kbit/s , modo rápido plus de 1 Mbit/s , modo de alta velocidad de 3,4 Mbit/s y modo ultrarrápido de 5 Mbit/s ). Estas velocidades se utilizan con mayor frecuencia en sistemas embebidos que en ordenadores personales.
Tenga en cuenta que las tasas de bits indicadas corresponden a las transferencias entre el controlador (maestro) y el dispositivo de destino (esclavo), sin considerar la extensión del reloj ni otros gastos generales del hardware. Los gastos generales del protocolo incluyen la dirección del dispositivo de destino y, posiblemente, la dirección de un registro dentro del dispositivo, así como los bits ACK/NACK por byte. Por lo tanto, la tasa de transferencia real de datos de usuario es menor de lo que implicarían dichas tasas máximas. Por ejemplo, si cada interacción con el dispositivo de destino permite transferir solo 1 byte de datos de forma ineficiente, la tasa de datos será inferior a la mitad de la tasa máxima.
El número de nodos que pueden existir en un bus I²C determinado está limitado por el espacio de direcciones y por la capacitancia total del bus de 400 pF , lo que restringe las distancias de comunicación prácticas a unos pocos metros. La impedancia relativamente alta y la baja inmunidad al ruido requieren un potencial de tierra común, lo que, a su vez, restringe su uso práctico a la comunicación dentro de la misma placa de circuito impreso o un pequeño sistema de placas.
Diseño de referencia
El diseño de referencia mencionado anteriormente es un bus con líneas de reloj (SCL) y de datos (SDA) con direccionamiento de 7 bits. El bus tiene dos funciones para los nodos: controlador (maestro) o destino (esclavo).
- Nodo controlador (maestro): Nodo que genera el reloj e inicia la comunicación con los objetivos (esclavos).
- Nodo objetivo (esclavo): Nodo que recibe la señal de reloj y responde cuando el controlador (maestro) se dirige a él.
El bus es multicontrolador, lo que significa que puede haber cualquier número de nodos controladores. Además, los roles de controlador y destino pueden cambiar entre mensajes (después de enviar una señal STOP).
Puede haber cuatro modos de funcionamiento potenciales para un dispositivo de bus determinado, aunque la mayoría de los dispositivos solo utilizan una única función y sus dos modos:
- Transmisión del controlador (maestro): El nodo controlador está enviando datos a un destino (esclavo).
- El controlador (maestro) recibe: El nodo controlador está recibiendo datos de un destino (esclavo).
- Transmisión del nodo objetivo (esclavo): El nodo objetivo está enviando datos al controlador (maestro).
- El nodo objetivo (esclavo) recibe datos: El nodo objetivo está recibiendo datos del controlador (maestro).
Además de los bits de datos 0 y 1, el bus I²C permite señales especiales de INICIO y PARADA, que actúan como delimitadores de mensajes y son distintas de los bits de datos. (Esto contrasta con los bits de inicio y parada utilizados en la comunicación serie asíncrona , que se distinguen de los bits de datos únicamente por su temporización).
El controlador se encuentra inicialmente en modo de transmisión del controlador enviando un START seguido de la dirección de 7 bits del objetivo con el que desea comunicarse, que finalmente va seguido de un solo bit que representa si desea escribir (0) o leer (1) del objetivo.
Si el dispositivo de destino existe en el bus, responderá con un bit ACK (activo en bajo para confirmar la recepción) para esa dirección. El controlador continúa entonces en modo de transmisión o recepción (según el bit de lectura/escritura que haya enviado), y el dispositivo de destino continúa en modo complementario (recepción o transmisión, respectivamente).
La dirección y los bytes de datos se envían con el bit más significativo primero. La condición de inicio se indica mediante una transición de alto a bajo de SDA con SCL alto; la condición de parada se indica mediante una transición de bajo a alto de SDA con SCL alto. Todas las demás transiciones de SDA se realizan con SCL bajo.
Si el controlador desea escribir en el dispositivo de destino, envía repetidamente un byte, mientras que el dispositivo de destino envía un bit de confirmación (ACK). (En esta situación, el controlador está en modo de transmisión y el dispositivo de destino en modo de recepción).
Si el controlador desea leer datos del dispositivo de destino, recibe repetidamente un byte de este, enviando un bit de confirmación (ACK) después de cada byte, excepto el último. (En esta situación, el controlador está en modo de recepción y el dispositivo de destino en modo de transmisión).
Una transacción I²C puede constar de varios mensajes. El controlador finaliza un mensaje con una condición STOP si se trata del final de la transacción, o bien puede enviar otra condición START para mantener el control del bus para otro mensaje (una transacción de "formato combinado").
protocolos de mensajes
I²C define los tipos básicos de transacciones, cada una de las cuales comienza con un INICIO y termina con un PARADA:
- Mensaje único en el que un controlador (maestro) escribe datos en un destino (esclavo).
- Mensaje único en el que un controlador (maestro) lee datos de un objetivo (esclavo).
- Formato combinado, donde un controlador (maestro) emite al menos dos lecturas o escrituras a uno o más destinos (esclavos).
En una transacción combinada, cada lectura o escritura comienza con una condición START y la dirección de destino. Las condiciones START posteriores a la primera también se denominan bits START repetidos . Los bits START repetidos no van precedidos de condiciones STOP, que es como los destinatarios saben que el siguiente mensaje forma parte de la misma transacción.
Cada dispositivo de destino solo responderá a determinados mensajes, tal como se especifica en su documentación de producto.
Los sistemas I²C puros admiten estructuras de mensajes arbitrarias. SMBus se limita a nueve de estas estructuras, como leer palabra N y escribir palabra N , que involucran un único destino. PMBus extiende SMBus con un protocolo de grupo , lo que permite enviar múltiples transacciones SMBus en un solo mensaje combinado. El STOP final indica cuándo deben surtir efecto estas acciones agrupadas. Por ejemplo, una operación PMBus podría reconfigurar tres fuentes de alimentación (utilizando tres direcciones de destino I²C diferentes ) , y sus nuevas configuraciones entrarían en vigor simultáneamente: al recibir el STOP.
Salvo contadas excepciones, ni I²C ni SMBus definen la semántica de los mensajes, como el significado de los bytes de datos. La semántica de los mensajes es específica de cada producto. Estas excepciones incluyen los mensajes dirigidos a la dirección de llamada general de I²C (0x00) o a la dirección de respuesta de alerta de SMBus, así como los mensajes que participan en el protocolo de resolución de direcciones (ARP) de SMBus para la asignación y gestión dinámica de direcciones.
En la práctica, la mayoría de los dispositivos utilizan modelos de control de solicitud-respuesta, donde uno o más bytes que siguen a una orden de escritura se interpretan como una orden o dirección. Estos bytes determinan cómo se procesan los bytes escritos posteriormente o cómo responde el dispositivo a las lecturas subsiguientes. La mayoría de las operaciones SMBus implican órdenes de un solo byte.
Ejemplo de mensajería: EEPROM 24C32

Un ejemplo específico es la EEPROM tipo 24C32 , que utiliza dos bytes de solicitud llamados Dirección Alta y Dirección Baja. (Por consiguiente, estas EEPROM no son compatibles con hosts SMBus puros, que solo admiten comandos o direcciones de un solo byte). Estos bytes se utilizan para direccionar bytes dentro del espacio de direcciones de la EEPROM de 32 kbit (o 4 kB ). El mismo direccionamiento de dos bytes también lo utilizan las EEPROM de mayor capacidad, como la 24C512, que almacena 512 kbit (o 64 kB). La escritura y lectura de datos en estas EEPROM utiliza un protocolo sencillo: se escribe la dirección y, a continuación, se transfieren los datos hasta el final del mensaje. La transferencia de datos puede causar problemas en el SMBus, ya que los bytes de datos no van precedidos de un contador y se pueden transferir más de 32 bytes a la vez. Las memorias EEPROM I²C de menos de 32 kbit, como la 24C02 de 2 kbit, se suelen utilizar en el bus SMBus con transferencias de datos de un solo byte, que son ineficientes, para solucionar este problema .
Un único mensaje se escribe en la EEPROM. Tras el comando START, el controlador envía la dirección del bus del chip con el bit de dirección desactivado ( write ), luego envía la dirección de dos bytes de los datos almacenados en la EEPROM y, a continuación, envía los bytes de datos que se escribirán a partir de esa dirección, seguidos de un comando STOP. Al escribir varios bytes, todos deben estar en la misma página de 32 bytes. Mientras la EEPROM está guardando esos bytes en la memoria, no responderá a más solicitudes I²C . (Esta es otra incompatibilidad con SMBus: los dispositivos SMBus siempre deben responder a sus direcciones de bus).
Para leer a partir de una dirección específica en la EEPROM, se utiliza un mensaje combinado. Tras un START, el controlador escribe primero la dirección del bus del chip con el bit de dirección desactivado ( write ) y, a continuación, los dos bytes de la dirección de datos de la EEPROM. Después, envía un START (repetido) y la dirección del bus de la EEPROM con el bit de dirección activado ( read ). La EEPROM responde entonces con los bytes de datos a partir de la dirección de datos especificada: un mensaje combinado (primero una escritura, luego una lectura). El controlador emite un ACK tras cada byte leído, excepto el último, y, a continuación, emite un STOP. La EEPROM incrementa la dirección tras cada byte de datos transferido; las lecturas de varios bytes pueden recuperar todo el contenido de la EEPROM mediante un único mensaje combinado.
capa física

En la capa física , tanto las líneas SCL como SDA tienen un diseño de bus de drenaje abierto ( MOSFET ) o colector abierto ( BJT ), por lo que se necesita una resistencia de polarización para cada línea. Se obtiene un nivel lógico "0" al conectar la línea a tierra, y un nivel lógico "1" al dejar la línea flotando (salida de alta impedancia ) para que la resistencia de polarización la eleve a nivel alto. Una línea nunca se activa activamente a nivel alto. Este cableado permite que múltiples nodos se conecten al bus sin cortocircuitos por contención de señal. Los sistemas de alta velocidad (y algunos otros) pueden usar una fuente de corriente en lugar de una resistencia para elevar solo SCL o tanto SCL como SDA, para acomodar una mayor capacitancia del bus y permitir tiempos de subida más rápidos.
Una consecuencia importante de esto es que varios nodos pueden estar controlando las líneas simultáneamente. Si algún nodo mantiene la línea en estado bajo, esta permanecerá en ese estado. Los nodos que intentan transmitir un valor lógico (es decir, que dejan la línea en estado alto) pueden detectar esto y concluir que otro nodo está activo al mismo tiempo.
Cuando se utiliza en SCL, se denomina extensión de reloj y es un mecanismo de control de flujo para los dispositivos de destino. Cuando se utiliza en SDA, se denomina arbitraje y garantiza que solo haya un transmisor a la vez.
Cuando están inactivas, ambas líneas están en alto. Para iniciar una transacción, SDA se pone en bajo mientras que SCL permanece en alto. Es ilegal [ 3 ] : 14 transmitir un marcador de parada liberando SDA para que vuelva a flotar en alto (aunque dicho "mensaje nulo" suele ser inofensivo), por lo que el siguiente paso es poner SCL en bajo.
Excepto por las señales de inicio y parada, la línea SDA solo cambia mientras el reloj está en nivel bajo; la transmisión de un bit de datos consiste en hacer que la línea de reloj alcance un nivel alto mientras se mantiene la línea de datos estable al nivel deseado.
Mientras SCL está en nivel bajo, el transmisor (inicialmente el controlador) establece SDA al valor deseado y (tras un pequeño retardo para que el valor se propague) deja que SCL pase a nivel alto. A continuación, el controlador espera a que SCL pase a nivel alto; esto se retrasará debido al tiempo de subida finito de la señal SCL (la constante de tiempo RC de la resistencia de polarización y la capacitancia parásita del bus) y puede retrasarse adicionalmente debido a la dilatación del reloj del dispositivo de destino.
Una vez que SCL está en nivel alto, el controlador espera un tiempo mínimo (4 μs para I²C de velocidad estándar ) para asegurarse de que el receptor haya detectado el bit, y luego lo vuelve a poner en nivel bajo. Esto completa la transmisión de un bit.
Después de cada 8 bits de datos en una dirección, se transmite un bit de "acuse de recibo" en la otra dirección. El transmisor y el receptor intercambian roles durante un bit, y el receptor original transmite un único bit "0" (ACK). Si el transmisor ve un bit "1" (NACK) en su lugar, aprende que:
- (Si el controlador transmite al destino) El destino no puede aceptar los datos. No existe tal destino, el comando no se entiende o no puede aceptar más datos.
- (Si el destino transmite al controlador) El controlador desea que la transferencia se detenga después de este byte de datos.
Únicamente la línea SDA cambia de dirección durante los bits de reconocimiento; la línea SCL siempre está controlada por el controlador.
Después del bit de reconocimiento, la línea de reloj está en nivel bajo y el controlador puede hacer una de tres cosas:
- Comienza la transferencia de otro byte de datos: el transmisor activa SDA y el controlador envía un pulso alto a SCL.
- Enviar una señal de "Parada": Poner SDA en nivel bajo, dejar que SCL pase a nivel alto y luego dejar que SDA pase a nivel alto. Esto libera el bus I²C .
- Enviar un "Inicio repetido": Establecer SDA en alto, dejar que SCL pase a alto y luego volver a poner SDA en bajo. Esto inicia un nuevo mensaje del bus I²C sin liberar el bus.
Estiramiento del reloj mediante SCL
Una de las características más importantes del protocolo I²C es la extensión de reloj. Un dispositivo de destino puede mantener la línea de reloj (SCL) en nivel bajo tras recibir (o enviar) un byte, lo que indica que aún no está listo para procesar más datos. El controlador que se comunica con el dispositivo de destino puede no finalizar la transmisión del bit actual, sino que debe esperar hasta que la línea de reloj pase a nivel alto. Si el dispositivo de destino está realizando una extensión de reloj, la línea de reloj permanecerá en nivel bajo (debido a que las conexiones son de drenaje abierto ). Lo mismo ocurre si un segundo controlador, más lento, intenta controlar el reloj simultáneamente. (Si hay más de un controlador, normalmente todos menos uno perderán la arbitraje).
El controlador debe esperar hasta que observe que la línea de reloj pasa a nivel alto, y un tiempo mínimo adicional (4 μs para I 2 C estándar de 100 kbit/s ) antes de volver a poner la señal de reloj en nivel bajo.
Aunque el controlador también puede mantener la línea SCL en bajo durante el tiempo que desee (esto no está permitido desde la revisión 6 del protocolo, subsección 3.1.1), el término "extensión de reloj" se usa normalmente solo cuando los dispositivos de destino lo hacen. Si bien en teoría cualquier pulso de reloj puede extenderse, generalmente se utilizan los intervalos anteriores o posteriores al bit de acuse de recibo. Por ejemplo, si el dispositivo de destino es un microcontrolador , su interfaz I²C podría extender el reloj después de cada byte, hasta que el software decida si enviar un acuse de recibo positivo o un NACK.
La extensión de reloj es el único momento en I²C en el que el dispositivo de destino controla SCL. Muchos dispositivos no necesitan extender el reloj y, por lo tanto, tratan SCL simplemente como una entrada sin circuitos que la controlen. Algunos controladores, como los que se encuentran dentro de los ASIC personalizados , pueden no ser compatibles con la extensión de reloj; a menudo, estos dispositivos se denominan "interfaz de dos hilos" y no I²C .
Para maximizar el rendimiento del bus , SMBus impone límites a la duración de los relojes. Los hosts y los destinos que respetan estos límites no pueden bloquear el acceso al bus durante más de un breve período de tiempo, algo que no ofrecen los sistemas I²C puros .
Arbitraje mediante SDA
Cada controlador supervisa el bus en busca de bits de inicio y parada, y no inicia un mensaje mientras otro controlador mantiene el bus ocupado. Sin embargo, dos controladores pueden iniciar la transmisión casi simultáneamente; en este caso, se produce la arbitraje. El modo de transmisión de destino también puede arbitrarse cuando un controlador se dirige a múltiples destinos, pero esto es menos común. A diferencia de los protocolos (como Ethernet ) que utilizan retardos de retroceso aleatorios antes de emitir un reintento, I²C tiene una política de arbitraje determinista. Cada transmisor verifica el nivel de la línea de datos (SDA) y lo compara con los niveles esperados; si no coinciden, ese transmisor pierde el arbitraje y se desconecta de esta interacción de protocolo.
Si un transmisor establece SDA en 1 (sin generar señal) y un segundo transmisor lo establece en 0 (conexión a tierra), el resultado es que la línea está en nivel bajo. El primer transmisor observa entonces que el nivel de la línea es diferente al esperado y concluye que otro nodo está transmitiendo. El primer nodo que detecta esta diferencia es el que pierde la arbitraje: deja de generar SDA. Si es un controlador, también deja de generar SCL y espera una señal de parada; entonces puede intentar reenviar todo su mensaje. Mientras tanto, el otro nodo no ha detectado ninguna diferencia entre los niveles esperados y reales de SDA y, por lo tanto, continúa la transmisión. Puede hacerlo sin problemas porque hasta el momento la señal ha sido exactamente la esperada; ningún otro transmisor ha interrumpido su mensaje.
Si los dos controladores envían un mensaje a dos destinos diferentes, el que envía el mensaje a la dirección de destino más baja siempre "gana" la arbitraje en la etapa de direcciones. Dado que los dos controladores pueden enviar mensajes a la misma dirección de destino, y las direcciones a veces hacen referencia a múltiples destinos, en ocasiones el arbitraje debe continuar en las etapas de datos.
El arbitraje ocurre muy raramente, pero es necesario para una correcta compatibilidad con múltiples controladores. Al igual que con la extensión de reloj, no todos los dispositivos admiten arbitraje. Aquellos que sí lo hacen, generalmente se identifican como compatibles con la comunicación "multicontrolador".
Un caso que debe manejarse con cuidado en las implementaciones I²C con múltiples controladores es el de la comunicación entre ellos. Un controlador puede perder la arbitraje ante un mensaje entrante y debe cambiar su rol de controlador a receptor a tiempo para confirmar su propia dirección.
En el caso extremadamente raro de que dos controladores envíen simultáneamente mensajes idénticos, ambos considerarán la comunicación exitosa, pero el objetivo solo verá un mensaje. Por esta razón, cuando un objetivo puede ser accedido por múltiples controladores, cada comando reconocido por el objetivo debe ser idempotente o debe garantizarse que nunca será emitido por dos controladores al mismo tiempo. (Por ejemplo, un comando emitido por un solo controlador no necesita ser idempotente, ni es necesario que un comando específico lo sea cuando algún mecanismo de exclusión mutua garantiza que solo un controlador puede emitir ese comando en un momento dado).
Arbitraje en SMBus
Mientras que I²C solo actúa como árbitro entre controladores, SMBus utiliza el arbitraje en tres contextos adicionales, donde múltiples destinos responden al controlador y uno de ellos logra transmitir su mensaje.
- Aunque conceptualmente se trata de un bus de un solo controlador, un dispositivo de destino compatible con el protocolo de notificación al host actúa como controlador para realizar la notificación. Este dispositivo toma el control del bus y escribe un mensaje de 3 bytes en la dirección reservada "SMBus Host" (0x08), pasando su dirección y dos bytes de datos. Si dos dispositivos intentan notificar al host simultáneamente, uno de ellos perderá la arbitraje y deberá volver a intentarlo.
- Un sistema alternativo de notificación de objetivos utiliza la señal SMBALERT# independiente para solicitar atención. En este caso, el host realiza una lectura de 1 byte de la dirección reservada "SMBus Alert Response Address" (0x0C), que es una especie de dirección de difusión. Todos los objetivos que emiten la alerta responden con un byte de datos que contiene su propia dirección. Cuando un objetivo transmite correctamente su dirección (ganando la arbitraje frente a los demás), deja de generar esa interrupción. Tanto en este caso como en el anterior, la arbitraje garantiza que el mensaje de un objetivo será recibido y que los demás sabrán que deben volver a intentarlo.
- SMBus también admite un protocolo de resolución de direcciones, mediante el cual los dispositivos devuelven un identificador único de dispositivo (UDID) de 16 bytes. Varios dispositivos pueden responder; el que tenga el UDID más bajo será el que prevalezca y sea reconocido.
Arbitraje en PMBus
PMBus versión 1.3 extiende el protocolo de respuesta de alerta SMBus en su protocolo de "lectura de zona". [ 7 ] Los objetivos pueden agruparse en "zonas", y todos los objetivos de una zona pueden recibir una respuesta, la cual puede ser enmascarada (omitiendo información no deseada), invertida (de modo que la información deseada se envía como bits 0, los cuales ganan la arbitraje) o reordenada (de modo que la información más significativa se envía primero). El arbitraje garantiza que la respuesta de mayor prioridad sea la primera que se devuelva al controlador.
PMBus reserva las direcciones I2C 0x28 y 0x37 para lecturas y escrituras de zona, respectivamente.
Diferencias entre modos
Existen varios modos de funcionamiento posibles para la comunicación I²C . Todos son compatibles, ya que siempre se puede utilizar el modo estándar de 100 kbit/s , pero combinar dispositivos con capacidades diferentes en el mismo bus puede causar problemas, como se detalla a continuación:
- El modo rápido es altamente compatible y simplemente ajusta varios parámetros de temporización para alcanzar una velocidad de 400 kbit/s . Este modo es compatible con una amplia gama de dispositivos I²C , por lo que un controlador puede usarlo siempre que sepa que la capacitancia del bus y la fuerza de polarización lo permiten.
- El modo rápido plus alcanza hasta 1 Mbit/s mediante controladores más potentes (20 mA) y resistencias pull-up para lograr tiempos de subida y bajada más rápidos. La compatibilidad con dispositivos en modo estándar y rápido (con capacidad de pull-down de 3 mA) se puede lograr si se reduce la fuerza de las resistencias pull-up al comunicarse con ellos.
- El modo de alta velocidad ( 3,4 Mbit/s ) es compatible con dispositivos I²C normales en el mismo bus, pero requiere que el controlador tenga una resistencia pull-up activa en la línea de reloj, que se habilita durante las transferencias de alta velocidad. El primer bit de datos se transfiere con un flanco ascendente de reloj normal de drenaje abierto, que puede extenderse. Para los siete bits de datos restantes y el ACK, el controlador eleva el reloj en el momento adecuado y el destino puede no extenderlo. Todas las transferencias de alta velocidad van precedidas de un "código de controlador" de un solo byte a velocidad rápida o estándar. Este código cumple tres funciones:
- Indica a los dispositivos de destino de alta velocidad que cambien a reglas de temporización de alta velocidad,
- garantiza que los dispositivos de velocidad rápida o normal no intentarán participar en la transferencia (porque no coincide con su dirección), y
- Dado que identifica al controlador (existen ocho códigos de controlador, y cada controlador debe utilizar uno diferente), garantiza que el arbitraje se complete antes de la parte de alta velocidad de la transferencia, por lo que dicha parte no necesita tener en cuenta esa capacidad.
- El modo ultrarrápido es esencialmente un subconjunto de I²C de solo escritura , incompatible con otros modos, salvo que resulta sencillo añadirle soporte a un diseño de hardware de interfaz I²C existente . Solo se permite un controlador, que gestiona activamente las líneas de datos en todo momento para alcanzar una velocidad de transferencia de 5 Mbit/s . Se omiten la extensión de reloj, la arbitraje, las transferencias de lectura y las confirmaciones. Está pensado principalmente para pantallas LED animadas , donde un error de transmisión solo causaría una breve e insignificante alteración visual . Su similitud con otros modos de bus I²C se limita a:
- Las condiciones de inicio y parada se utilizan para delimitar las transferencias,
- El direccionamiento I2C permite que varios dispositivos de destino compartan el bus sin señales de selección de destino al estilo del bus SPI , y
- Se envía un noveno pulso de reloj por cada byte transmitido, lo que indica la posición de los bits de confirmación no utilizados.
Algunos proveedores ofrecen un modo Turbo no estándar con una velocidad de hasta 1,4 Mbit/s .
En todos los modos, la frecuencia del reloj está controlada por el/los controlador/es, y un bus más largo de lo normal puede funcionar a una velocidad inferior a la nominal mediante la reducción de la frecuencia del reloj .
interconexiones de circuitos

I²C es popular para la interconexión de circuitos periféricos a sistemas de prototipado, como Arduino y Raspberry Pi . I²C no utiliza un conector estandarizado; sin embargo, los diseñadores de placas han creado diversos esquemas de cableado para las interconexiones I²C . Para minimizar los posibles daños causados por conectar conectores de 0,1 pulgadas al revés, algunos desarrolladores han sugerido utilizar conexiones alternas de señal y alimentación con los siguientes esquemas de cableado: (GND, SCL, VCC, SDA) o (VCC, SDA, GND, SCL). [ 8 ]
La gran mayoría de las aplicaciones utilizan I²C tal como fue diseñado originalmente: circuitos integrados periféricos conectados directamente a un procesador en la misma placa de circuito impreso, y por lo tanto a distancias relativamente cortas de menos de 30 cm (1 pie) , sin conector. Sin embargo, mediante un controlador diferencial, una versión alternativa de I²C puede comunicarse hasta 20 metros (posiblemente más de 100 metros) a través de cable CAT5 u otro tipo de cable. [ 9 ] [ 10 ]
Varios conectores estándar transmiten señales I²C . Por ejemplo, el UEXT , el iPack de 10 pines [ 11 ] y los conectores Lego Mindstorms NXT 6P6C transmiten I²C . [ 12 ] [ 13 ] [ 14 ] [ 15 ] Todos los conectores HDMI y la mayoría de los conectores DVI y VGA transmiten datos DDC2 a través de I²C . Además, los conectores 8P8C y un cable CAT5, normalmente utilizado para la capa física de Ethernet, a veces pueden utilizarse para transmitir señales I²C codificadas diferencialmente [ 16 ] o amplificadas de un solo extremo . [ 17 ]
Almacenamiento en búfer y multiplexación
Cuando un sistema cuenta con numerosos dispositivos I²C , puede ser necesario incluir búferes o multiplexores de bus para dividir segmentos grandes en segmentos más pequeños. Esto puede ser necesario para mantener la capacitancia de un segmento de bus por debajo del valor permitido o para separar varios dispositivos con la misma dirección mediante un multiplexor. Existen diversos tipos de multiplexores y búferes, y todos deben tener en cuenta que las líneas I²C son bidireccionales. Los multiplexores pueden implementarse con conmutadores analógicos, que permiten conectar un segmento con otro. Los conmutadores analógicos mantienen la bidireccionalidad de las líneas, pero no aíslan la capacitancia de un segmento de otro ni proporcionan capacidad de almacenamiento en búfer.
Los buffers se pueden usar para aislar la capacitancia de un segmento de otro y/o permitir que la señal I²C se transmita a través de cables o pistas más largas. Los buffers para líneas bidireccionales como I²C deben usar uno de varios esquemas para evitar el enganche. I²C es de drenaje abierto, por lo que los buffers deben generar un nivel bajo en un lado cuando detectan un nivel bajo en el otro. Un método para evitar el enganche consiste en que un buffer tenga niveles de entrada y salida cuidadosamente seleccionados, de modo que el nivel de salida de su controlador sea superior a su umbral de entrada, impidiendo que se active a sí mismo. Por ejemplo, un buffer puede tener un umbral de entrada de 0,4 V para detectar un nivel bajo, pero un nivel de salida bajo de 0,5 V. Este método requiere que todos los demás dispositivos en el bus tengan umbrales compatibles y, a menudo, implica que no se pueden conectar en serie varios buffers que implementen este esquema.
Como alternativa, existen otros tipos de búferes que implementan amplificadores de corriente o que registran el estado (es decir, qué lado puso el bus a nivel bajo) para evitar el enganche. El método de estado generalmente implica que se crea un pulso no deseado durante una transferencia cuando un lado pone el bus a nivel bajo, luego el otro lo pone a nivel bajo y, finalmente, el primer lado lo libera (esto es común durante una confirmación I²C) .
Compartir el SCL entre varios autobuses
Cuando se dispone de un único controlador, es posible que varios buses I²C compartan la misma línea SCL. [ 18 ] [ 19 ] Los paquetes en cada bus se envían uno tras otro o simultáneamente. Esto es posible porque la comunicación en cada bus se puede subdividir en periodos cortos alternos con SCL alta seguidos de periodos cortos con SCL baja. Además, el reloj se puede extender si un bus necesita más tiempo en un estado.
Las ventajas incluyen el uso simultáneo de dispositivos con la misma dirección y el ahorro de conexiones, o un mayor rendimiento mediante el uso simultáneo de varias líneas de datos.
Tabla de estados de línea
Estas tablas muestran los distintos estados atómicos y operaciones de bits que pueden producirse durante un mensaje I 2 C.
Estructura de direccionamiento
Direccionamiento de 7 bits
Direccionamiento de 10 bits
Direcciones reservadas en el espacio de direcciones de 7 bits
Dos grupos de 8 direcciones cada uno están reservados para funciones especiales:
- Desde:
0000 000hasta0000 111 - Desde:
1111 000hasta1111 111
Además, las 112 direcciones restantes están designadas para clases específicas de dispositivos, y algunas de ellas están reservadas por normas relacionadas o por uso común.
SMBus reserva algunas direcciones adicionales. En particular, 0001 000está reservada para el host SMBus, que pueden usar dispositivos con capacidad de controlador; 0001 100es la "dirección de respuesta de alerta SMBus" que el host consulta después de una interrupción fuera de banda; y 1100 001es la dirección predeterminada que usan inicialmente los dispositivos con capacidad de asignación dinámica de direcciones.
Direcciones no reservadas en el espacio de direcciones de 7 bits
Aunque el MSB 1111está reservado para el ID del dispositivo y el direccionamiento de destino (esclavo) de 10 bits, también lo utilizan los dispositivos dependientes de la pantalla VESA DDC , como los dispositivos señaladores . [ 23 ]
Formato de transacción
Una transacción I²C consta de uno o más mensajes . Cada mensaje comienza con un símbolo de inicio y la transacción finaliza con un símbolo de parada. Los símbolos de inicio posteriores al primero, que inician un mensaje pero no una transacción, se denominan símbolos de inicio repetidos .
Cada mensaje es de lectura o escritura. Una transacción que consta de un solo mensaje se denomina transacción de lectura o de escritura. Una transacción que consta de varios mensajes se denomina transacción combinada. La forma más común de esta última consiste en un mensaje de escritura que proporciona información de dirección dentro del dispositivo, seguido de un mensaje de lectura.
Muchos dispositivos I²C no distinguen entre una transacción combinada y los mismos mensajes enviados como transacciones separadas, pero no todos. El protocolo de identificación del dispositivo requiere una única transacción; los dispositivos de destino tienen prohibido responder si detectan un símbolo de parada. Los modos de configuración, calibración o autodiagnóstico que provocan una respuesta anómala del dispositivo de destino también suelen finalizarse automáticamente al término de la transacción.
Diagrama de tiempos

- La transferencia de datos se inicia con una condición de inicio (S) señalada por el hecho de que SDA se pone en nivel bajo mientras que SCL permanece en nivel alto.
- SCL se pone en nivel bajo y SDA establece el primer nivel de bit de datos mientras mantiene SCL en nivel bajo (durante el tiempo de la barra azul).
- Los datos se muestrean (reciben) cuando SCL sube para el primer bit (B1). Para que un bit sea válido, SDA no debe cambiar entre un flanco ascendente de SCL y el siguiente flanco descendente (durante todo el tiempo de la barra verde).
- Este proceso se repite: SDA realiza la transición mientras SCL es bajo y los datos se leen mientras SCL es alto (de B2 a Bn).
- Al último bit le sigue un pulso de reloj, durante el cual la señal SDA se pone en nivel bajo en preparación para el bit de parada .
- Se señala una condición de parada (P) cuando aumenta SCL, seguido de un aumento de SDA.
Para evitar la detección de marcadores falsos, existe un retardo mínimo entre el flanco descendente de SCL y el cambio de SDA, y entre el cambio de SDA y el flanco ascendente de SCL. El tiempo de retardo mínimo depende de la velocidad de transferencia de datos utilizada. Cabe destacar que un mensaje I²C que contiene n bits de datos (incluidos los acuses de recibo) contiene n + 1 pulsos de reloj.
Diseño de software
I²C se presta a un diseño de software de "controlador de bus". El software para los dispositivos conectados se escribe para llamar a un "controlador de bus" que gestiona el hardware I²C de bajo nivel . Esto permite que el código del controlador para los dispositivos conectados se pueda portar fácilmente a otro hardware, incluso a un diseño basado en manipulación de bits.
Soporte del sistema operativo
- En AmigaOS se puede usar el componente i2c.resource [ 25 ] para AmigaOS 4.x y MorphOS 3.x o la biblioteca compartida i2c.library de Wilhelm Noeker para sistemas más antiguos.
- Los desarrolladores de Arduino pueden utilizar la biblioteca "Wire".
- Los desarrolladores de CircuitPython y MicroPython pueden usar las clases busio.I2C o machine.I2C, respectivamente.
- Maximite admite comunicaciones I 2 C de forma nativa como parte de su MMBasic.
- PICAXE utiliza los comandos i2c y hi2c.
- eCos es compatible con I²C para diversas arquitecturas de hardware.
- ChibiOS/RT es compatible con I²C para diversas arquitecturas de hardware.
- FreeBSD , NetBSD y OpenBSD también proporcionan un marco de trabajo I²C , con soporte para una serie de controladores y sensores comunes.
- Desde OpenBSD 3.9 (lanzado el 1 de mayo de 2006 ( 2006-05-01 ) ), un subsistema central i2c_scan sondea todos los chips sensores posibles a la vez durante el arranque, utilizando un esquema de ponderación ad hoc y una función de caché local para leer los valores de registro de los objetivos I2C ; [ 26 ] esto permite sondear sensores en hardware i386/amd64 comercial de propósito general durante el arranque sin ninguna configuración por parte del usuario ni un retraso de sondeo perceptible; los procedimientos de coincidencia de los controladores individuales solo tienen que depender de un "nombre descriptivo" basado en cadenas para la coincidencia; [ 27 ] como resultado, la mayoría de los controladores de sensores I2C se habilitan automáticamente por defecto en las arquitecturas aplicables sin efectos negativos en la estabilidad; los sensores individuales, tanto I2C como de otro tipo, se exportan al espacio de usuario a través del marco sysctl hw.sensors . A partir de marzo de 2019 OpenBSD cuenta con más de dos docenas de controladores de dispositivos en I2C que exportan algún tipo de sensor a través del marco hw.sensors , y la mayoría de estos controladores están completamente habilitados por defecto en
GENERIClos núcleos i386/amd64 de OpenBSD. - En NetBSD , existen más de dos docenas de dispositivos de destino I²C que cuentan con sensores de monitorización de hardware, accesibles a través del marco de trabajo sysmon envsys como listas de propiedades . En hardware de propósito general, cada controlador debe realizar su propio sondeo; por lo tanto, todos los controladores para los destinos I²C están deshabilitados de forma predeterminada en NetBSD en
GENERIClas compilaciones i386/amd64.
- Desde OpenBSD 3.9 (lanzado el 1 de mayo de 2006 ( 2006-05-01 ) ), un subsistema central i2c_scan sondea todos los chips sensores posibles a la vez durante el arranque, utilizando un esquema de ponderación ad hoc y una función de caché local para leer los valores de registro de los objetivos I2C ; [ 26 ] esto permite sondear sensores en hardware i386/amd64 comercial de propósito general durante el arranque sin ninguna configuración por parte del usuario ni un retraso de sondeo perceptible; los procedimientos de coincidencia de los controladores individuales solo tienen que depender de un "nombre descriptivo" basado en cadenas para la coincidencia; [ 27 ] como resultado, la mayoría de los controladores de sensores I2C se habilitan automáticamente por defecto en las arquitecturas aplicables sin efectos negativos en la estabilidad; los sensores individuales, tanto I2C como de otro tipo, se exportan al espacio de usuario a través del marco sysctl hw.sensors . A partir de marzo de 2019 OpenBSD cuenta con más de dos docenas de controladores de dispositivos en I2C que exportan algún tipo de sensor a través del marco hw.sensors , y la mayoría de estos controladores están completamente habilitados por defecto en
- En Linux , el protocolo I²C se gestiona mediante un controlador de dispositivo específico para el dispositivo y otro para el adaptador I²C ( o SMBus ) al que está conectado. Cientos de estos controladores forman parte de las versiones actuales del kernel de Linux.
- En Mac OS X , existen alrededor de dos docenas de extensiones del kernel I2C que se comunican con sensores para leer voltaje, corriente, temperatura, movimiento y otros datos de estado físico.
- En Microsoft Windows , I²C se implementa mediante los controladores de dispositivo correspondientes de gran parte del hardware disponible en la industria. Para dispositivos HID integrados/ SoC , Windows 8 y versiones posteriores cuentan con un controlador de bus I²C integrado. [ 28 ]
- En Windows CE , I²C se implementa mediante los controladores de dispositivo correspondientes de gran parte del hardware disponible en la industria.
- Unison OS, un sistema operativo en tiempo real POSIX para IoT, es compatible con I²C para diversas arquitecturas de hardware de microcontroladores y microprocesadores.
- En RISC OS , I²C se proporciona mediante una interfaz I²C genérica desde el controlador de E/S y es compatible con el sistema de módulos del sistema operativo.
- En los sistemas operativos Sinclair QDOS y Minerva QL , I²C es compatible mediante un conjunto de extensiones proporcionadas por TF Services.
- En Zephyr OS , I2C es compatible a través de la API del controlador de dispositivo i2c. [ 29 ] Esta API proporciona una interfaz genérica para comunicarse con dispositivos I2C , lo que permite admitir una amplia gama de dispositivos I2C .
Herramientas de desarrollo
Al desarrollar o solucionar problemas en sistemas que utilizan I²C , la visibilidad a nivel de las señales de hardware puede ser importante.
Adaptadores de host
Existen diversas soluciones de hardware de adaptadores I²C para conectar un controlador o dispositivo I²C a ordenadores con sistemas operativos Linux , Mac o Windows . La mayoría son adaptadores USB a I²C . No todos requieren controladores o API propietarias .
Analizadores de protocolo
Los analizadores de protocolo I2C son herramientas que muestrean un bus I2C y decodifican las señales eléctricas para proporcionar una visión de nivel superior de los datos que se transmiten en el bus.
Analizadores lógicos
Al desarrollar o solucionar problemas del bus I²C , el análisis de las señales de hardware resulta fundamental. Los analizadores lógicos son herramientas que recopilan, analizan, decodifican y almacenan señales, permitiendo visualizar las formas de onda de alta velocidad con tranquilidad. Estos analizadores muestran marcas de tiempo de cada cambio de nivel de señal, lo que facilita la detección de problemas de protocolo. La mayoría de los analizadores lógicos tienen la capacidad de decodificar las señales del bus en datos de protocolo de alto nivel y mostrar datos ASCII.
Sistemas de cable populares
En varios módulos comerciales, hay algunos conectores y asignaciones de pines principales: [ 30 ]
- Qwiic : presentado por Sparkfun en 2017, utiliza conectores JST SH de 4 pines y 1,0 mm [ 31 ].
- Distribución de pines: GND, Vcc (3,3 V), SDA, SCL
- STEMMA QT : introducido por Adafruit en 2018, no es necesariamente [ 32 ] compatible con Qwiic, debido a que permite un rango de voltaje más amplio (3V–5V); el tamaño de la placa del dispositivo está estandarizado.
- Asignación de pines: GND, Vcc (3V–5V), SDA, SCL
- STEMMA : de Adafruit, utiliza conectores JST PH de 2,0 mm de 4 pines (los conectores de 3 pines están destinados al uso analógico/PWM) [ 33 ].
- Asignación de pines: GND, Vcc (3V–5V), SDA, SCL
- Grove : de Seeed Studio , utiliza conectores propietarios de 4 pines y 2,0 mm, conocidos como serie A2005 o 1125S-4P [ 34 ].
- Asignación de pines: GND, Vcc (3,3/5 V), SDA, SCL
- Gravity : de DFRobot utiliza conectores JST PH de 4 pines y 2,0 mm, el mismo conector que STEMMA pero con un uso de pines diferente [ 35 ].
- Asignación de pines: SDA, SCL, GND, Vcc (3,3/5 V)
- Interfaz nodeLynk : utiliza conectores Molex SL 70553 de 4 pines y 2,54 mm.
- Asignación de pines: SCL, SDA, Vcc (5V), GND
- Breakout Garden : de Pimoroni, utiliza un conector de borde de 5 pines y 2,54 mm en una placa de circuito impreso de 1,6 mm de grosor; la distribución de pines es compatible con el cabezal de Raspberry Pi.
- Distribución de pines: Vcc (de 2V a 6V), SDA, SCL, no utilizado/interrupción, GND
- UEXT : de Olimex , es un conector de cabezal encapsulado de 5x2 y 2,54 mm que implementa conjuntamente I²C , SPI y UART .
- Interfaz Pmod : de Digilent , un conector de cabezal de 6 pines de una sola línea de 2,54 mm, utilizado para I²C , SPI o UART; frecuentemente enplacas FPGA.
- Distribución de pines ("tipo 6", la variante I2C ) : no utilizado/GPIO/interrupción de esclavo a maestro, no utilizado/GPIO/reset, SCL, SDA, GND, Vcc (3,3 V)
Limitaciones
La asignación de direcciones de destino es una debilidad de I²C . Siete bits son insuficientes para evitar colisiones de direcciones entre los miles de dispositivos disponibles. Lo que mitiga el problema de las colisiones de direcciones entre diferentes fabricantes y permite la conexión a varios dispositivos idénticos es que los fabricantes dedican pines que se pueden usar para establecer la dirección de destino en una de las opciones de dirección disponibles para cada dispositivo. Lo habitual son dos o tres pines, y en muchos dispositivos, existen tres o más opciones de cableado por pin de dirección. [ 36 ] [ 37 ] [ 38 ]
Las direcciones I²C de 10 bits aún no se utilizan ampliamente, y muchos sistemas operativos host no las admiten. [ 39 ] Tampoco lo es el complejo esquema "ARP" de SMBus para la asignación dinámica de direcciones (excepto para las tarjetas PCI con presencia de SMBus, para las cuales es necesario).
La configuración automática del bus es un problema relacionado. Una dirección determinada puede ser utilizada por varios dispositivos incompatibles con el protocolo en diferentes sistemas, y casi ningún tipo de dispositivo puede detectarse en tiempo de ejecución. Por ejemplo, puede ser utilizada por una EEPROM0x51 24LC02 o 24C32 , con direccionamiento incompatible; o por un RTC PCF8563 , que no se puede distinguir de forma fiable de ninguno de los dos (sin cambiar el estado del dispositivo, lo que podría no estar permitido). Los únicos mecanismos de configuración fiables disponibles para los hosts implican mecanismos fuera de banda, como las tablas proporcionadas por el firmware del sistema, que enumeran los dispositivos disponibles. Nuevamente, este problema puede abordarse parcialmente mediante ARP en sistemas SMBus, especialmente cuando se utilizan identificadores de proveedor y producto, pero esto no ha tenido mucho éxito. La versión Rev. 3 de la especificación I²C añade un mecanismo de ID de dispositivo.
I²C admite un rango limitado de velocidades. Los hosts que admiten velocidades de varios megabits son poco comunes. La compatibilidad con la velocidad Fm+ de 1 Mbit/s está más extendida, ya que su electrónica son variantes simples de la que se usa a velocidades más bajas. Muchos dispositivos no admiten la velocidad de 400 kbit/s (en parte porque SMBus aún no la admite). Los nodos I²C implementados por software (en lugar de hardware dedicado) pueden ni siquiera admitir la velocidad de 100 kbit/s ; por lo tanto, rara vez se puede usar todo el rango definido en la especificación. Todos los dispositivos deben admitir, al menos parcialmente, la velocidad más alta utilizada o podrían detectar erróneamente su dirección de dispositivo.
Los dispositivos pueden extender los ciclos de reloj para adaptarlos a sus necesidades específicas, lo que puede reducir el ancho de banda necesario para los dispositivos más rápidos e incrementar la latencia al comunicarse con otras direcciones de dispositivo. La capacitancia del bus también limita la velocidad de transferencia, especialmente cuando no se utilizan fuentes de corriente para disminuir los tiempos de subida de la señal.
Debido a que I²C es un bus compartido, existe la posibilidad de que cualquier dispositivo falle y bloquee todo el bus. Por ejemplo, si algún dispositivo mantiene la línea SDA o SCL en estado bajo, impide que el controlador envíe comandos de INICIO o PARADA para reiniciar el bus. [ 40 ] Por lo tanto, es común que los diseños incluyan una señal de reinicio que proporcione un método externo para reiniciar los dispositivos del bus. Sin embargo, muchos dispositivos no tienen un pin de reinicio dedicado, lo que obliga al diseñador a incorporar un circuito que permita reiniciar los dispositivos si es necesario.
Debido a estas limitaciones (gestión de direcciones, configuración del bus, posibles fallos, velocidad), pocos segmentos del bus I²C admiten siquiera una docena de dispositivos. En cambio, es común que los sistemas tengan varios segmentos más pequeños. Uno podría estar dedicado al uso con dispositivos de alta velocidad para una gestión de energía de baja latencia. Otro podría utilizarse para controlar algunos dispositivos donde la latencia y el rendimiento no son factores importantes; y otro segmento podría utilizarse únicamente para leer chips EEPROM que describen tarjetas de expansión (como el estándar SPD utilizado con módulos DRAM).
En sistemas de muy baja potencia, las resistencias de polarización pueden consumir más energía que el resto del diseño combinado. En estos sistemas, las resistencias suelen alimentarse mediante una fuente de voltaje conmutable, como una entrada/salida digital (DIO) de un microcontrolador. Las resistencias de polarización también limitan la velocidad del bus y suponen un pequeño coste adicional. Por ello, algunos diseñadores están optando por otros buses serie que no requieren resistencias de polarización, como I3C o SPI .
Tecnologías derivadas
I²C es la base del ACCESS.bus , la interfaz VESA Display Data Channel (DDC), el System Management Bus ( SMBus), el Power Management Bus (PMBus) y el Intelligent Platform Management Bus (IPMB, uno de los protocolos de IPMI ). Estas variantes presentan diferencias en los rangos de voltaje y frecuencia de reloj, y pueden incluir líneas de interrupción .
Los sistemas de alta disponibilidad ( AdvancedTCA , MicroTCA ) utilizan I²C redundante de dos vías para la gestión de la unidad de almacenamiento. La capacidad de I²C para múltiples controladores es un requisito en estos sistemas.
TWI (Interfaz de dos cables) o TWSI (Interfaz serie de dos cables) es esencialmente el mismo bus implementado en varios procesadores de sistema en chip de Atmel y otros proveedores. [ 41 ] Los proveedores usan el nombre TWI, aunque I²C no es una marca registrada desde el 7 de noviembre de 2014. [ 42 ] La protección de marca registrada solo existe para el logotipo correspondiente (ver esquina superior derecha), y las patentes de I²C ya han caducado. Según Microchip Technology , TWI e I²C tienen algunas diferencias. Una de ellas es que TWI no admite el byte START. [ 43 ]
En algunos casos, el uso del término "interfaz de dos hilos" indica una implementación incompleta de la especificación I²C . Una limitación común es la falta de compatibilidad con arbitraje o extensión de reloj, aunque sigue siendo útil para un único controlador que se comunica con dispositivos sencillos que nunca extienden el reloj.
El estándar de interfaz de sensor MIPI I3C (I3C) es un desarrollo de I2C , en desarrollo en 2017. [ 44 ]
Revisiones
Véase también
Referencias
- 1 2 3 4 Patente NL 8005976A , "Sistema de bus de dos cables que comprende un cable de reloj y un cable de datos para interconectar varias estaciones", asignada a Philips Electronics NV
- ↑ "MCP23008" . Microchip . 26 de mayo de 2021. Archivado del original el 26 de mayo de 2021.
- 1 2 3 4 5 6 7 "Especificación I 2 C-bus Rev 7" (PDF) . NXP Semiconductors . 1 de octubre de 2021. Archivado del original (PDF) el 6 de octubre de 2022.
- 1 2 "¿Qué es un dispositivo 'controlador' I3C y por qué se cambió el nombre del dispositivo 'maestro' I3C?" . MIPI Alliance . Introducción a MIPI I3C . Consultado el 27 de abril de 2025 .
- ↑ "Direccionamiento esclavo I2C de 7, 8 y 10 bits" . Total Phase . Archivado del original el 1 de junio de 2013. Consultado el 29 de abril de 2018 .
- ↑ " EEPROM de bus I²C serie de 8 Kbit (PDF)" ( PDF ) . STMicroelectronics . Octubre de 2017. Archivado (PDF) del original el 18 de octubre de 2019. Consultado el 19 de noviembre de 2019 .
- ↑ Uso de los protocolos ZONE_READ y ZONE_WRITE (PDF) (Nota de aplicación). Revisión 1.0.1. System Management Interface Forum. 7 de enero de 2016. AN001. Archivado (PDF) del original el 22 de septiembre de 2017.
- ↑ "¿Existe alguna guía definitiva sobre la asignación de pines I2C? No busco un "ESTÁNDAR"" . StackExchange.
- ↑ Nota de aplicación AN11075 de NXP: Control de señales de bus I2C a través de cables de par trenzado con PCA9605 (PDF) , 16/08/2017, archivada del original (PDF) el 16/08/2017.
- ↑ Vasquez, Joshua (16 de agosto de 2017), Dando el salto fuera de la plataforma: Una introducción a I2C a través de cables largos , archivado del original el 16 de agosto de 2017
- ↑ Formato de tablero apilable iPack , 19/08/2017, archivado del original el 19/08/2017
- ↑ Ferrari, Mario; Ferrari, Giulio (29 de abril de 2018). Construyendo robots con LEGO Mindstorms NXT . Syngress. págs. 63–64 . ISBN 9780080554334Archivado del original el 29 de abril de 2018.
- ↑ Gasperi, Michael; Hurbain, Philippe (2010), "Capítulo 13: Comunicación del bus I²C " , Extreme NXT: Llevando LEGO MINDSTORMS NXT al siguiente nivel , ISBN 9781430224549
- ↑ Philo. "Conector NXT" Archivado el 20 de agosto de 2017 en Wayback Machine
- ↑ Sivan Toledo. "Interfaz I2C, parte 1: Adición de puertos de E/S digitales". Archivado el 12 de agosto de 2017 en Wayback Machine . 2006
- ↑ "Envío fiable de I2C a través de cables Cat5" Archivado el 18/08/2017 en Wayback Machine
- ↑ "Conectores y cables de bus I2C" Archivado el 18/08/2017 en Wayback Machine
- ↑ "Múltiples buses I2C · Wiki de Testato/SoftwareWire" . GitHub .
- ↑ "Compartir el bus I2C | Microchip" .
- ↑ " Tabla de asignación de direcciones I2C" ( PDF) (Guía de selección). Philips Semiconductors . 24 de agosto de 1999. Archivado del original (PDF) el 16 de octubre de 2017. Consultado el 1 de octubre de 2017 .
- ↑ Manual de datos IC12: Periféricos I2C, código de pedido de Philips 9397 750 00306
- ↑ "Especificación del bus de administración del sistema (SMBus)" (PDF) . Versión 3.0. System Management Interface Forum. 2014-12-20. pp. 81–82 . Archivado (PDF) del original el 29-01-2016 . Consultado el 01-12-2017 .
- 1 2 "Estándar VESA Display Data Channel Command Interface (DDC/CI)" (PDF) . Versión 1.1. VESA . 29-10-2004. págs. 15–16 . Archivado (PDF) del original el 09-09-2016 . Recuperado el 01-12-2017 .
- ↑ "Especificación de la interfaz de gestión de plataforma inteligente de segunda generación V2.0" (PDF) . Revisión del documento 1.1. Intel, NEC, Hewlett-Packard y Dell. 1 de octubre de 2013. pág. 563. Archivado (PDF) del original el 27 de marzo de 2016. Consultado el 1 de diciembre de 2017. La
parte de 7 bits de la dirección esclava para el BMC es 0010_000b.
- ↑ Componente i2c.resource Archivado el 24/07/2011 en Wayback Machine para AmigaOS 4.x.
- ↑ Theo de Raadt (29 de mayo de 2015). "/sys/dev/i2c/i2c_scan.c#probe_val" . Referencia cruzada BSD del superusuario . OpenBSD . Consultado el 4 de marzo de 2019 .
static u_int8_t probe_val[256]; - ↑ Constantine A. Murenin (21/05/2010). "5.2. Escaneo del bus I2C a través de i2c_scan.c". Sensores de hardware de OpenBSD: monitorización ambiental y control de ventiladores ( tesis de maestría en matemáticas ). Universidad de Waterloo : UWSpace. hdl : 10012/5234 . ID del documento: ab71498b6b1a60ff817b29d56997a418.
- ↑ Introducción a HID sobre I2C
- ↑ "Bus de circuitos integrados interconectados (I2C) — Documentación del proyecto Zephyr" .
- ↑ "El zoológico de conectores: ecosistemas I2C" . 4 de mayo de 2022.
- ↑ "Qwiic" .
- ↑ "Sistema Qwiic Connect: Preguntas frecuentes" . www.sparkfun.com . SparkFun Electronics . Consultado el 20 de diciembre de 2024 .
- ^ "¿Qué es STEMMA? | Adafruit STEMMA y STEMMA QT | Sistema de aprendizaje Adafruit" .
- ↑ "Representación de pines I2C (Grove de Seeed Studio)" . 22 de abril de 2024.
- ↑ "Diagrama de pines I2C (de DFRobot Gravity)" . 22 de abril de 2024.
- ↑ El LTC4151 de Linear Technology, archivado el 9 de agosto de 2017 en Wayback Machine , tiene dos pines para la selección de direcciones, cada uno de los cuales se puede conectar a un nivel alto o bajo o dejar sin conectar, ofreciendo 9 direcciones diferentes.
- ↑ El MAX7314 de Maxim, archivado el 13/07/2017 en Wayback Machine, tiene un solo pin para la selección de dirección que se puede conectar a nivel alto o bajo o a SDA o SCL, ofreciendo 4 direcciones diferentes.
- ↑ El UCD9224 de TI, archivado el 7 de noviembre de 2017 en Wayback Machine, utiliza dos canales ADC que discriminan doce niveles cada uno para seleccionar cualquier dirección válida de 7 bits.
- ↑ Delvare, Jean (16 de agosto de 2005). "Re: [ PARCHE 4/5 ] agregar i2c_probe_device e i2c_remove_device" . linux-kernel (Lista de correo). Archivado del original el 17 de agosto de 2016.
- ↑ Arne Pahl, Stefan Dickmann (2022), Garbe, Heyno (ed.), Análisis de perturbaciones de sensores causadas por IEMI , pp. 159–165 , doi : 10.15488/12572 , consultado el 4 de julio de 2025
- ↑ avr-libc: Ejemplo que utiliza la interfaz de dos cables (TWI) Archivado el 27/05/2007 en Wayback Machine .
- ↑ "TESS -- Error" . tmsearch.uspto.gov . Archivado del original el 24 de febrero de 2018. Consultado el 29 de abril de 2018 .
- ↑ "¿Qué es TWI? Cómo configurar TWI para la comunicación I2C" (PDF) . Microchip Technology. 2018.
- ↑ Thornton, Scott (29/11/2017). "El circuito interintegrado mejorado (I3C)" . Consejos sobre microcontroladores . Archivado del original el 3/02/2018.
- ↑ Patente estadounidense 4689740 , "Sistema de bus de dos cables que comprende un cable de reloj y un cable de datos para interconectar varias estaciones", emitida el 25 de agosto de 1987, asignada a US Philips Corporation.
- ↑ "Philips demanda a ocho empresas más por infracción de patente de bus I2C" . EE Times . 17 de octubre de 2001. Archivado del original el 2 de abril de 2021.
- ↑ Especificación I 2 C-bus Rev 2.0; Philips Semiconductors; diciembre de 1998; archivado.
- ↑ Especificación I 2 C-bus Rev 2.1; Philips Semiconductors; enero de 2000; archivado.
- ↑ Especificación I 2 C-bus Rev 3; NXP Semiconductors; 19 de junio de 2007; Archivado.
- ↑ Especificación I 2 C-bus Rev 4; NXP Semiconductors; 13 de febrero de 2012; Archivado.
- ↑ Especificación I 2 C-bus Rev 5; NXP Semiconductors; 9 de octubre de 2012; Archivado.
- ↑ "Especificación I 2 C-bus Rev 6" (PDF) . NXP Semiconductors . 4 de abril de 2014. Archivado del original (PDF) el 26 de abril de 2021.
Lecturas adicionales
Enlaces externos
- Especificación oficial I²C Rev 6 (gratuita) - NXP
- Introducción y manual detallados de I²C .
- Cálculo de la resistencia pull-up I²C - TI
- Efectos de la variación de las resistencias pull-up de I²C (capturas de osciloscopio de I²C de 5 V con 9 resistencias pull-up diferentes)
- Autobuses en serie