EL BUS I2C Para simplificar la interconexión de dispositivos al microprocesador, Philips desarrolló un sencillo bus bidireccional basado en dos hilos por el que se trasmiten los datos vía serie y lo llamó El Bus I2C.
EL Bus I2C (Inter- Integrated Circuits) fue desarrollado al principio de los 80s. Su propósito original fue el de proporcionar una manera fácil de conectar un CPU a los chips periféricos en un equipo de TV.
EL PROBLEMA A RESOLVER: Los dispositivos periféricos en sistemas embebidos se conectan al mControlador como dispositivos de E/S mapeados en memoria usando las líneas paralelas del bus de dirección y de datos. Esto produce una gran cantidad de pistas en el PCB para enrutar las líneas de direcciones y de datos, sin mencionar un número de decodificadores de direcciones y lógica adicional para conectar todo. Muchas líneas de control implican que el sistema sea más susceptible a perturbaciones por Interferencia Electromagnética (EMI) y Descarga Electrostática (ESD).
Las características más importantes del bus I2C son: SubComunicación serial, utilizando un conductor para manejar el timming (SCL) (pulsos de reloj) y otro para intercambiar datos (SDA), que transportan información entre los dispositivos conectados al bus.
Las líneas SDA (Serial Data) y SCL (Serial Clock) etán conectadas a la fuente de alimentación a través de las resistencias de pull-up. Cuando el bus está libre, ambas líneas están en nivel alto.
Los dispositivo puede ser considerado como Mastero (Master) o esclavo (Slave).
El Maestro es el dispositivo que inicia la transferencia en el bus y genera la señal de Clock.
El Slave (esclavo) es el dispositivo direccionado.
(Gp:) Maestro (Gp:) Esclavo1 (Gp:) Esclavo2 (Gp:) Esclavo3 (Gp:) SDA (Gp:) SCL
Transmisión de bits
Los bits de datos van por SDA Por cada bit de información es necesario un pulso de SCL Los datos sólo pueden cambiar cuando SCL está a nivel bajo
Los datos transitan en la bajada del reloj El dato es recibido en el borde de bajada del reloj El bit más significativo se envía primero El nodo que recibe debe manejar un acknowledge (bajo en SDA) después de completado el byte El nodo maestro siempre genera el reloj
Cada dispositivo es reconocido por una única dirección (si es un microcontrolador, LCD, memoria o teclado) y cualquiera puede operar como transmisor o receptor de datos, dependiendo de la función del dispositivo.
Un display es solo un receptor de datos mientras que una memoria recibe y transmite datos. Las características más importantes del bus I2C son:
Sub
Trasferencia de datos:
Los datos y direcciones que se transmiten por SDA son de 8 bits.
Tras cada bloque debe recibirse una señal de reconocimiento.
. Las características más importantes del bus I2C son:
La cantidad de dispositivos que se pueden conectar al bus está limitada, solamente, por la máxima capacidad permitida de 400 pF.
El bus permite la conexión de varios Masters, ya que incluye un detector de colisiones.
El protocolo de transferencia de datos y direcciones posibilita diseñar sistemas completamente definidos por software.
Las características más importantes del bus I2C son:
La especificación original, o modo de estandar, fue para transferencia de datos hasta 100 Kbps.
El bus serial I2C ha sido extendido para soportar velocidades de hasta 3.4 Mbits/s. Combinado con una función de desplazamiento del nivel de voltaje, en modo High-speed (Hs-mode) ofrece una solución ideal para los sistemas de tecnología mezclada, donde las altas velocidades y la variedad de voltajes (5 V, 3 V o menor) son comúnmente usados.
El reloj determina la velocidad de transmisión de los datos. Las características más importantes del bus I2C son:
Los modos de transferencia de datos del bus I2C Modo Estándar (S-mode) aproximadamente a 100 kBits/Seg. Modo Rápido (F-mode) aproximadamente a 400kbits/Seg. Modo Alta velocidad (Hs-mode) mas de 3,4 Mbits/Seg.
Las características más importantes del bus I2C son:
Definiciones o términos utilizados en relación con las funciones del bus I2C Maestro (Master): Dispositivo que determina la temporización y la dirección del tráfico de datos en el bus. Es el único que aplica los pulsos de reloj en la línea SCL. Cuando se conectan varios dispositivos maestros a un mismo bus la configuración obtenida se denomina "multi-maestro". Esclavo (Slave): Cualquier dispositivo conectado al bus incapaz de generar pulsos de reloj. Reciben señales de comando y de reloj proveniente del dispositivo maestro. Bus Desocupado (Bus Free): Estado en el cual ambas líneas (SDA y SCL) están inactivas, presentando un estado lógico alto. Unicamente en este momento es cuando un dispositivo maestro puede comenzar a hacer uso del bus. Comienzo (Start): Sucede cuando un dispositivo maestro hace ocupación del bus, generando esta condición. La línea de datos (SDA) toma un estado bajo mientras que la línea de reloj (SCL) permanece alta. Parada (Stop): Un dispositivo maestro puede generar esta condición dejando libre el bus. La línea de datos toma un estado lógico alto mientras que la de reloj permanece también en ese estado.
Dato Válido (Valid Data): Sucede cuando un dato presente en la línea SDA es estable mientras la línea SCL está a nivel lógico alto. Formato de Datos (Data Format): La transmisión de datos a través de este bus consta de 8 bits de datos (ó 1 byte). A cada byte le sigue un noveno pulso de reloj durante el cual el dispositivo receptor del byte debe generar un pulso de reconocimiento, conocido como ACK (del inglés Acknowledge). Esto se logra situando la línea de datos a un nivel lógico bajo mientras transcurre el noveno pulso de reloj. Dirección (Address): Cada dispositivo diseñado para funcionar en este bus dispone de su propia y única dirección de acceso, que viene pre-establecida por el fabricante. Hay dispositivos que permiten establecer externamente parte de la dirección de acceso. Esto permite que una serie del mismo tipo de dispositivos se puedan conectar en un mismo bus sin problemas de identificación. La dirección 00 es la denominada "de acceso general", por la cual responden todos los dispositivos conectados al bus. Lectura/Escritura (Bit R/W): Cada dispositivo dispone de una dirección de 7 bits. El octavo bit (el menos significativo ó LSB) enviado durante la operación de direccionamiento corresponde al bit que indica el tipo de operación a realizar. Si este bit es alto el dispositivo maestro lee información proveniente de un dispositivo esclavo. En cambio, si este bit fuese bajo el dispositivo maestro escribe información en un dispositivo esclavo.
Definiciones o términos utilizados en relación con las funciones del bus I2C
Terminología básica del Bus I2C
Respaldo Tecnológico: Tanto Philips como como otros fabricantes de dispositivos compatibles con I2C disponen de una amplia gama de circuitos integrados, incluyendo memorias RAM y EEPROM, microcontroladores, puertos de E/S, codificadores DTMF, tranceptores IR, conversores A/D y D/A, relojes de tiempo real, calendarios, etc
Dado que no siempre se requiere alta velocidad de transferencia de datos este bus es ideal para sistemas donde es necesario manejar información entre muchos dispositivos y, al mismo tiempo, se requiere poco espacio y líneas de circuito impreso. Por ello es común ver dispositivos I2C en video grabadoras, sistemas de seguridad, electrónica automotriz, televisores, equipos de sonido y muchas otras aplicaciones más.
Incluso, y gracias a que el protocolo es lo suficientemente simple, usualmente se ven dispositivos I2C insertados en sistemas microcontrolados que no fueron diseñados con puertos I2C, siendo el protocolo generado por el firmware.
También hay dispositivos de adaptación que permiten conectar buses originalmente paralelos a sistemas I2C. Tal es el caso del chip PCD 8584 de Philips el cual incorpora en el chip todo lo necesario para efectuar dicha tarea.
Hay, además, circuitos integrados cuya única misión es adaptar los niveles presentes en el bus I2C y TTL, permitiendo resolver fácil y rápidamente la interconexión de dispositivos de dicha familia con el I2C. Respaldo Tecnológico:
El protocolo del Bus I2C
Formato del Mensaje Un protocolo orientado a BIT Handshaking Bidireccional
Maestro envía datos a un esclavo
Transferencia de datos: SubEl Maestro genera la condición de Start. Cada palabra puesta en el bus SDA debe tener 8 bits, la primera palabra transferida contiene la dirección del Esclavo seleccionado.
Tras el envío del start o inicio, en los siguientes 7 bits se codifica la dirección del dispositivo. Y el octavo bit indica si se hace lectura(1) o escritura(0).
Después de cada 8 bits, el master debe esperar una señal de reconocimiento como respuesta por parte del esclavo, lee el estado de la línea SDA, si vale 0 (impuesto por el esclavo), el proceso de transferencia continúa. Si vale 1, indica que el circuito direccionado no valida la comunicación, entonces, el Maestro genera un bit de stop para liberar el bus I2C.
Este acuse de recibo se denomina ACK (acknowledge) y es una parte importante del protocolo I2C. Al final de la transmisión, el Maestro genera la condición de Stop y libera el bus I2C, las líneas SDA y SCL pasan a estado alto.
Inicio de transmisión La transmisión la inicia el maestro Flanco de bajada en SDA con SCL a nivel alto Cuando nadie accede al bus hay un nivel alto en SCL y SDA
Condiciones de START y STOP: Una vez finalizada la comunicación se debe informar de esta situación (condición de Stop). La línea SDA pasa a nivel alto mientras SCL permanece en estado alto. START: la línea SDA cae a cero mientras SCL permanece en nivel alto. A partir de este momento comienza la transferencia de datos.
Start y Stop Start SDA baja cuando el reloj (SCL) es alto Stop SDA sube cuando SCL es alto (Normalmente no hay transición cuando el reloj es alto) (Gp:) SDA baja antes que SCL (Gp:) SCL alta antes que SDA
Enviando a un Esclavo
Eventos del bus I2C : leyendo un Acknowledge de un Esclavo Cuando se ha transmitido al bus un byte de dirección o de dato éste debe ser RECONOCIDO por el o los esclavos. En el caso de una dirección: Si la dirección concuerda con la propia entonces ese esclavo y solamente ese esclavo enviará un acuse de recibido de la dirección con un ACK. También se responde con un ACK en el caso de un byte transmitido a un esclavo ya direccionado . El esclavo que va a dar un ACK pone a bajo la línea SDA inmediatamente después de la recepción del octavo bit, o, en caso de un byte de dirección , inmediatamente después de la evaluación de su dirección. Esto significa que tan pronto como el maestro baja SCL para completar la transmisión del bit (1), SDA será puesto a bajo por el esclavo (2). El maestro ahora emite un pulso de reloj en la línea SCL (3) El esclavo liberará la línea SDA hasta la terminación de este pulso (4) de reloj. El Bus queda disponible de nuevo para que el maestro continúe enviando datos o generar una condición de STOP. En caso de que un dato vaya a ser escrito al esclavo, este ciclo debe completarse antes de que se genere una condición STOP. El esclavo estará bloqueando el bus (la línea SDA es mantenida en bajo por el esclavo) hasta que el maestro haya generado un pulso de reloj en la línea SCL.
Reconocimiento (Acknowledge) :
Reconocimiento El bit de reconocimiento es obligatorio en la transferencia de datos. El pulso de reloj correspondiente al bit de reconocimiento (ACK) es generado por el Master. El Transmisor desbloquea la línea SDA ("1") durante el pulso de reconocimiento. El receptor debe poner a "0" la línea SDA durante el pulso ACK de modo que siga siendo "0" durante el tiempo que el master genera el pulso "1" de ACK. Normalmente un receptor cuando ha sido direccionado esta obligado a generar un ACK después de que cada byte a sido recibido. Cuando un dispositivo esclavo no genera el bit ACK (porque esta haciendo otra cosa y no puede atender el Bus) debe mantener el esclavo la línea SDA a nivel "1" durante el bit ACK. El Master entonces puede generar una condición de STOP abortando la transferencia de datos o repetir la condición de Inicio enviando una nueva transferencia de datos. Si un Esclavo-receptor que esta direccionado no desea recibir mas bytes, el master debe detectar la situación y no enviar mas bytes. Esto se indica porque el esclavo no genera el bit ACK en el primer byte que sigue. El esclavo pone la línea SDA a "1" lo que es detectado por el Master el cual genera la condición de Stop o repite la condición de Inicio. Si un Master-receptor esta recibiendo datos de un Esclavo-transmisor debe generar un bit ACK tras cada byte recibido de transmisor, para finalizar la transferencia de datos no debe generar el ACK tras el ultimo byte enviado por el esclavo. El esclavo-transmisor debe permitir desbloquear la línea SDA generando el master la condición de Stop o de Inicio.
Transferencia completa
RELACIÓN ENTRE LOS NIVELES DE SDA Y SCL Todos los maestros deben generar una subida en la línea SCL (2), leer el nivel en SDA (3) y generar una caida en la línea SCL (4).
El Esclavo no debe cambiar el dato durante el tiempo que SCL es alto ( de lo contrario podría generarse una condición START o STOP imprevista) .
Durante (1) y (5), el esclavo puede cambiar el estado de la línea SDA. En total está secuencia debe ser realizada 8 veces para completar el byte dato. Los bytes siempre son transmitidos con el Bit Más Significativo primero.
Maestro lee datos de un esclavo
Eventos del Bus I2C : Recibiendo un byte de un Esclavo Una vez que el esclavo ha sido direccionado y el esclavo ha reconocido ésto, el maestro puede recibir un byte del esclavo si el bit R/W en la dirección se puso en modo READ ( puesto a 1) La sintaxis del protocolo es la misma que cuando se transmite un byte a un esclavo, excepto que ahora no se le permite al maestro tocar la línea SDA. Previo al envió por la línea SCL,de los 8 pulsos de reloj necesarios para el envió del byte , el maestro libera la línea SDA. Ahora el esclavo tomará el control de esta línea. La línea se irá a alto si se desea transmitir un 1 o si el esclavo desea mandar un 0, se mantiene en bajo.
Para operar un esclavo sobre el Bus I2C solo son necesarios seis simples códigos, suficientes para enviar o recibir información. Un bit de Inicio 7-bit o 10-bit de direccionamiento Un bit R/W que define si el esclavo es transmisor o receptor Un bit de reconocimiento Mensaje dividido en bytes Un bit de Stop
Las líneas SDA y SCL son del tipo drenador abierto, similares a las de colector abierto pero asociadas a un transistor de efecto de campo (ó FET).. Se deben poner en estado alto (conectar a la alimentación por medio de resistores Pull-Up) para construir una estructura de bus tal que se permita conectar en paralelo múltiples entradas y salidas Esquema básico de conexiones
Esquema básico de conexiones Características de una conexión en colector abierto
Permite conectar varias fuentes de datos a un mismo hilo Nivel alto en el bus Si ningún dispositivo accede al bus Si ningún dispositivo transmite un cero Nivel bajo en el bus Si un dispositivo pone un nivel bajo Si dos dispositivos escriben a la vez siempre prevalecen los ceros AND cableada Si un dispositivo escribe un nivel alto pero lee un cero indica que otro dispositivo está también accediendo al b
Esquema básico de conexiones Inconvenientes de la conexión en colector abierto
Las capacidades de la línea se cargan a través del pull-up Se puede solucionar utilizando una carga activa en lugar de un resistor
Esquema básico de conexiones Las dos líneas de comunicación disponen de niveles lógicos altos cuando están inactivas. De entrada el número de dispositivos que se puede conectar al bus es ilimitado, pero las líneas tienen una especificación de capacidad de carga máxima de 400pF.
Terminación de Bus
El bus I2C Ejemplo de una configuración del bus I2C usando dos microcontroladores
Configuración Multi-Maestro Cuando el MCU1 emite una condición start e enviá una dirección, todos los esclavos escucharán ( incluyendo a MCU2 el cual en ese momento es considerado un esclavo también) . Si la dirección no concuerda con la dirección del CPU2, este dispositivo debe mantenerse de regreso a cualquier actividad hasta que el bus se desocupe de nuevo después de una condición stop. As long as the two MCU's monitor what is going on on the bus (start and stop) and as long as they are aware that a transaction is going on because the last issued command was not a STOP, there is no problem. Let's assume one of the MCU's missed the START condition and still thinks the bus is idle, or it just came out of reset and wants to start talking on the bus which could very well happen in a real-life scenario. This could lead to problems.
Protocolo multimaestro Con dos maestros en el bus existe posibilidad de conflicto
Arbitración: procedimiento para asegurar que sólo un maestro tiene el control del bus en un instante Si un maestro está utilizando el bus no puede ser interrumpido por otro. Desde START hasta STOP Si dos maestros intentan comenzar a utilizar el bus a la vez: Conexión del bus en colector abierto ?? prevalecen los ceros A la vez que ponen datos en el bus, escuchan la línea. Si un maestro está intentando enviar un nivel alto y lee un nivel bajo Existe otro maestro utilizando el bus Deja de transmitir esperando que la línea quede libre (condición de STOP)
Configuración Multi-Maestro
Ejemplo de aplicaciones del Bus I2C
LECTOR DE SMARTCARDS Conexión de una EEPROM serial y un Reloj de tiempo real, con bus I2C, para su uso en un lector de smartcards Ejemplo de aplicaciones del Bus I2C
El bus I2C Conexión de medidores ultrasónico de distancias a un mC Basic Stamp 2 usando el bus I2C. El módulo SRF10 es un medidor ultrasónico de distancias miniatura para robots que representa la ultima generación en sistemas de medidas de distancias por sonar.
El sensor es capaz de detectar objetos a una distancia de 6 m con la facilidad de conectarse al microcontrolador mediante un bus I2C, por lo que se pueden conectar cuantos sensores sean necesarios en el mismo bus.
Con una alimentación unica de 5V, solo requiere 15 mA, para funcionar y 3mA mientras esta en reposo. Ejemplo de aplicaciones del Bus I2C
El bus I2C Para el programador, el sensor SRF10 se comporta de la misma manera que las EEPROM de las series 24xx, con la excepción de que la dirección I2C es diferente. La dirección por defecto de fábrica del sensor es 0xE0. El usuario puede cambiar esta dirección con 16 direcciones diferentes: E0, E2, E4, E6, E8, EA, EC, EE, F0, F2, F4, F6, F8, FA, FC o FE, por lo que es posible utilizar hasta 16 sensores sobre un mismo bus I2C.
Además de las direcciones anteriores, todos los sonares conectados al bus I2C responderán a la dirección 0 -al ser la dirección de atención general. Esto significa que escribir un comando de medición de la distancia para la dirección 0 de I2C (0x00) iniciará las mediciones en todos los sensores al mismo tiempo. Ejemplo de aplicaciones del Bus I2C
Esquema del circuito para la conexión de dos sensores ultrasónicos SRF08 al controlador Basic Stamp 2 Ejemplo de aplicaciones del Bus I2C
Dispositivos I2C con el PICAXE WRITEI2C
Sintáxis: WRITEI2Clocation,(variable,…) – Location es una variable /constante que especifica la dirección de un byte o palabra – Variable(s) contiene el byte(s) de dato que se va a escribir Función: Escribe a la localidad I2C el contenido de la variable(s). READI2C
Sintáxis: READI2C location,(variable,…) – Location es una variable /constante que especifica la dirección de un byte o palabra – Variable(s) recibe el byte(s) leido(s). Funcción: Lee la localidad I2C contenida en la(s) variable(s). I2CSLAVE
Sintáxis: I2CSLAVE slave, speed, address
– Slave es la dirección i2c del esclavo – Speed es la palabra i2cfast (400kHz) o i2cslow (100kHz) a 4Mhz Address es la palabra i2cbyte o i2cword
Función: El comando i2cslave es usado para configurar las terminales PICAXE para usar el I2C y para definir el tipo de dispositivo I2C a ser direccionado Instrucciones en Basic del PICAXE par usar el bus I2C