{"id":522,"date":"2019-06-24T01:41:52","date_gmt":"2019-06-24T01:41:52","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=522"},"modified":"2020-12-09T01:51:08","modified_gmt":"2020-12-09T01:51:08","slug":"descripcion-y-funcionamiento-del-bus-i2c","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/descripcion-y-funcionamiento-del-bus-i2c\/","title":{"rendered":"Descripci\u00f3n y funcionamiento del Bus I2C"},"content":{"rendered":"
<\/a>Introducci\u00f3n<\/strong><\/p>\n DEFINICI\u00d3N DE I2C (I2<\/sup>C):<\/strong> Abreviatura de Inter-IC (inter integrated circuits), un tipo de bus dise\u00f1ado por Philips Semiconductors a principios de los 80s, que se utiliza para conectar circuitos integrados (ICs). El I2<\/sup>C es un bus con m\u00faltiples maestros, lo que significa que se pueden conectar varios chips al mismo bus y que todos ellos pueden actuar como maestro, s\u00f3lo con iniciar la transferencia de datos. Este bus se utiliza dentro de una misma placa de un dispositivo.<\/p>\n El bus I2<\/sup>C, un est\u00e1ndar que facilita la comunicaci\u00f3n entre microcontroladores, memorias y otros dispositivos con cierto nivel de \u00abinteligencia\u00bb, s\u00f3lo requiere de dos l\u00edneas de se\u00f1al y un com\u00fan o masa. Fue dise\u00f1ado a este efecto por Philips y permite el intercambio de informaci\u00f3n entre muchos dispositivos a una velocidad aceptable, de unos 100 Kbits por segundo, aunque hay casos especiales en los que el reloj llega hasta los 3,4 MHz.<\/p>\n La metodolog\u00eda de comunicaci\u00f3n de datos del bus I2<\/sup>C es en serie y sincr\u00f3nica. Una de las se\u00f1ales del bus marca el tiempo (pulsos de reloj) y la otra se utiliza para intercambiar datos.<\/p>\n Descripci\u00f3n de las se\u00f1ales<\/strong><\/p>\n Las l\u00edneas SDA<\/strong> y SCL<\/strong> son del tipo drenaje abierto, es decir, un estado similar al de colector abierto, pero asociadas a un transistor de efecto de campo (o FET). Se deben polarizar en estado alto (conectando a la alimentaci\u00f3n por medio de resistores \u00abpull-up\u00bb) lo que define una estructura de bus que permite conectar en paralelo m\u00faltiples entradas y salidas.<\/p>\n <\/a><\/p>\n El diagrama es suficientemente autoexplicativo. Las dos l\u00edneas del bus est\u00e1n en un nivel l\u00f3gico alto cuando est\u00e1n inactivas. En principio, el n\u00famero de dispositivos que se puede conectar al bus no tiene l\u00edmites, aunque hay que observar que la capacidad m\u00e1xima sumada de todos los dispositivos no supere los 400 pF. El valor de los resistores de polarizaci\u00f3n no es muy cr\u00edtico, y puede ir desde 1K8 (1.800 ohms) a 47K (47.000 ohms). Un valor menor de resistencia incrementa el consumo de los integrados pero disminuye la sensibilidad al ruido y mejora el tiempo de los flancos de subida y bajada de las se\u00f1ales. Los valores m\u00e1s comunes en uso son entre 1K8 y 10K.<\/p>\n Protocolo de comunicaci\u00f3n del bus I2<\/sup>C<\/strong><\/p>\n Habiendo varios dispositivos conectados sobre el bus, es l\u00f3gico que para establecer una comunicaci\u00f3n a trav\u00e9s de \u00e9l se deba respetar un protocolo. Digamos, en primer lugar, lo m\u00e1s importante: existen dispositivos maestros y dispositivos esclavos. S\u00f3lo los dispositivos maestros pueden iniciar una comunicaci\u00f3n.<\/p>\n <\/a><\/p>\n La condici\u00f3n inicial, de bus libre, es cuando ambas se\u00f1ales est\u00e1n en estado l\u00f3gico alto. En este estado cualquier dispositivo maestro puede ocuparlo, estableciendo la condici\u00f3n de inicio (start). Esta condici\u00f3n se presenta cuando un dispositivo maestro pone en estado bajo la l\u00ednea de datos (SDA<\/strong>), pero dejando en alto la l\u00ednea de reloj (SCL<\/strong>).<\/p>\n El primer byte que se transmite luego de la condici\u00f3n de inicio contiene siete bits que componen la direcci\u00f3n del dispositivo que se desea seleccionar, y un octavo bit que corresponde a la operaci\u00f3n que se quiere realizar con \u00e9l (lectura o escritura).<\/p>\n Si el dispositivo cuya direcci\u00f3n corresponde a la que se indica en los siete bits (A0-A6) est\u00e1 presente en el bus, \u00e9ste contesta con un bit en bajo, ubicado inmediatamente luego del octavo bit que ha enviado el dispositivo maestro. Este bit de reconocimiento (ACK) en bajo le indica al dispositivo maestro que el esclavo reconoce la solicitud y est\u00e1 en condiciones de comunicarse. Aqu\u00ed la comunicaci\u00f3n se establece en firme y comienza el intercambio de informaci\u00f3n entre los dispositivos.<\/p>\n <\/a><\/p>\n Si el bit de lectura\/escritura (R\/W) fue puesto en esta comunicaci\u00f3n a nivel l\u00f3gico bajo (escritura), el dispositivo maestro env\u00eda datos al dispositivo esclavo. Esto se mantiene mientras contin\u00fae recibiendo se\u00f1ales de reconocimiento, y el contacto concluye cuando se hayan transmitido todos los datos.<\/p>\n <\/a><\/p>\n En el caso contrario, cuando el bit de lectura\/escritura estaba a nivel l\u00f3gico alto (lectura), el dispositivo maestro genera pulsos de reloj para que el dispositivo esclavo pueda enviar los datos. Luego de cada byte recibido el dispositivo maestro (quien est\u00e1 recibiendo los datos) genera un pulso de reconocimiento.<\/p>\n El dispositivo maestro puede dejar libre el bus generando una condici\u00f3n de parada (o detenci\u00f3n; stop en ingl\u00e9s).<\/p>\n Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condici\u00f3n de inicio en lugar de una condici\u00f3n de parada. Esta nueva condici\u00f3n de inicio se denomina \u00abinicio reiterado\u00bb y se puede emplear para direccionar un dispositivo esclavo diferente o para alterar el estado del bit de lectura\/escritura.<\/p>\n Definici\u00f3n de t\u00e9rminos:<\/strong><\/p>\n La comunicaci\u00f3n en m\u00e1s detalle<\/strong><\/p>\n Cuando el dispositivo maestro quiere comunicarse con un esclavo, produce una secuencia de inicio en el bus. La secuencia de inicio es una de las dos secuencias especiales que se han definido en el bus I2<\/sup>C; la otra es la secuencia de parada. Las secuencias de inicio y la de parada son especiales porque son los dos \u00fanicos casos en que se permite que la l\u00ednea de datos (SDA<\/strong>) cambie cuando la l\u00ednea de reloj (SCL<\/strong>) est\u00e1 alta. Cuando se est\u00e1n transmitiendo datos, la l\u00ednea SDA<\/strong> debe permanecer estable, y jam\u00e1s cambiar, mientras la l\u00ednea SCL<\/strong> est\u00e1 alta. Las secuencias de inicio y de parada se\u00f1alan el comienzo y el final de una transacci\u00f3n con los dispositivos esclavos.<\/p>\n Los datos se transfieren en secuencias de 8 bits. Estos bits se colocan en la l\u00ednea SDA<\/strong> comenzando por el bit de m\u00e1s peso (o m\u00e1s significativo). Una vez puesto un bit en SDA<\/strong>, se lleva la l\u00ednea SCL<\/strong> a alto. Debemos recordar que el chip no puede llevar la l\u00ednea a un estado alto, en realidad, lo que hace es \u00absoltarla\u00bb, y el que la pone en nivel l\u00f3gico alto es el resistor de polarizaci\u00f3n. Por cada 8 bits que se transfieren, el dispositivo que recibe el dato env\u00eda de regreso un bit de reconocimiento, de modo que en realidad por cada byte de dato se producen 9 pulsos sobre la l\u00ednea SCL<\/strong> (es decir, 9 pulsos de reloj por cada 8 bits de dato). Si el dispositivo que recibe env\u00eda un bit de reconocimiento bajo, indica que ha recibido el dato y que est\u00e1 listo para aceptar otro byte. Si retorna un alto, lo que indica es que no puede recibir m\u00e1s datos y el dispositivo maestro deber\u00eda terminar la transferencia enviando una secuencia de parada.<\/p>\n Direccionamiento de dispositivos en el bus I2<\/sup>C<\/strong><\/p>\n Lo m\u00e1s com\u00fan en los dispositivos para el bus I2<\/sup>C es que utilicen direcciones de 7 bits, aunque existen dispositivos de 10 bits. Este \u00faltimo caso es raro.<\/p>\n Una direcci\u00f3n de 7 bits implica que se pueden poner hasta 128 dispositivos sobre un bus I2<\/sup>C, ya que un n\u00famero de 7 bits puede ir desde 0 a 127. Cuando se env\u00edan las direcciones de 7 bit, de cualquier modo la transmisi\u00f3n es de 8 bits. El bit extra se utiliza para informarle al dispositivo esclavo si el dispositivo maestro va a escribir o va a leer datos desde \u00e9l. Si el bit de lectura\/escritura (R\/W) es cero, el dispositivo maestro est\u00e1 escribiendo en el esclavo. Si el bit es 1 el maestro est\u00e1 leyendo desde el esclavo. La direcci\u00f3n de 7 bit se coloca en los 7 bist m\u00e1s significativos del byte y el bit de lectura\/escritura es el bit menos significativo.<\/p>\n El hecho de colocar la direcci\u00f3n de 7 bits en los 7 bits m\u00e1s significativos del byte produce confusiones entre quienes comienzan a trabajar con este bus. Si, por ejemplo, se desea escribir en la direcci\u00f3n 21 (hexadecimal), en realidad se debe enviar un 42, que es un 21 desplazado un bit hacia arriba. Tambi\u00e9n se pueden tomar las direcciones del bus I2<\/sup>C como direcciones de 8 bit, en las que las pares son de s\u00f3lo escritura y las impares son de s\u00f3lo lectura. Para dar un ejemplo, el integrado de br\u00fajula magn\u00e9tica CMPS03<\/a> es fijado en f\u00e1brica en la direcci\u00f3n 0xC0 ($C0). La direcci\u00f3n 0xC0 se utiliza para escribir en \u00e9l y la direcci\u00f3n 0xC1 es para leer de \u00e9l.<\/p>\n Protocolo de programaci\u00f3n para el bus I2<\/sup>C<\/strong><\/p>\n Lo primero que ocurre en un bus I2<\/sup>C es que el dispositivo maestro env\u00eda una secuencia de inicio. Esto alerta a los dispositivos esclavos, poni\u00e9ndolos a la espera de una transacci\u00f3n. \u00c9stos quedan atentos para ver si se trata de una solicitud para ellos. A continuaci\u00f3n el dispositivo maestro env\u00eda la direcci\u00f3n de dispositivo. El dispositivo esclavo que posee esa direcci\u00f3n continuar\u00e1 con la transacci\u00f3n, y los otros ignorar\u00e1n el resto de los intercambios, esperando la pr\u00f3xima secuencia de inicio.<\/p>\n Habiendo direccionado ya el dispositivo esclavo, lo que debe hacer ahora el maestro es enviar la ubicaci\u00f3n interna o n\u00famero de registro desde el que desea leer o al que va a escribir. La cantidad depende, obviamente, de qu\u00e9 dispositivo es y de cu\u00e1ntos registros internos posee. Algunos dispositivos muy simples no tienen ninguno, pero la mayor\u00eda s\u00ed los poseen.<\/p>\n Siguiendo con el ejemplo del CMPS03, \u00e9ste posee 16 ubicaciones internas, numeradas desde el 0 al 15. Otro dispositivo, el medidor ultras\u00f3nico de distancia SRF08, tiene 36 registros.<\/p>\n Una vez que el maestro ha enviado la direcci\u00f3n del dispositivo en el bus I2<\/sup>C y la direcci\u00f3n del registro interno del dispositivo, puede enviar ahora el byte o bytes de datos. El dispositivo maestro puede seguir enviando bytes al esclavo, que normalmente ser\u00e1n puestos en registros con direcciones sucesivas, ya que el esclavo incrementa autom\u00e1ticamente la direcci\u00f3n del registro interno despu\u00e9s de recibir cada byte. Cuando el maestro ha terminado de escribir datos en el esclavo, env\u00eda una secuencia de parada que concluye la transacci\u00f3n.<\/p>\n Escritura en un dispositivo esclavo:<\/strong><\/p>\n\n
\n
\n