<\/a>Introducci\u00f3n<\/strong><\/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
Protocolo de comunicaci\u00f3n del bus I2<\/sup>C<\/strong><\/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
Protocolo de programaci\u00f3n para el bus I2<\/sup>C<\/strong><\/p>\n
Escritura en un dispositivo esclavo:<\/strong><\/p>\n
Como ejemplo, veamos un SRF08<\/a>, que tiene una direcci\u00f3n de bus fijada en f\u00e1brica de 0xE0. Para comenzar una medici\u00f3n de distancia con el SRF08 se debe escribir 0x51 en el registro de comando, ubicado en la direcci\u00f3n interna 0x00. La secuencia es la que sigue:<\/p>\n
Lectura desde un dispositivo esclavo:<\/strong><\/p>\n
Esta operaci\u00f3n es algo m\u00e1s complicada, pero no demasiado. Antes de leer datos desde el dispositivo esclavo, primero se le debe informar desde cu\u00e1l de sus direcciones internas se va a leer. De manera que una lectura desde un dispositivo esclavo en realidad comienza con una operaci\u00f3n de escritura en \u00e9l. Es igual a cuando se desea escribir en \u00e9l: Se env\u00eda la secuencia de inicio, la direcci\u00f3n de dispositivo con el bit de lectura\/escritura en bajo y el registro interno desde el que se desea leer. Ahora se env\u00eda otra secuencia de inicio nuevamente con la direcci\u00f3n de dispositivo, pero esta vez con el bit de lectura\/escritura en alto. Luego se leen todos los bytes necesarios y se termina la transacci\u00f3n con una secuencia de parada.<\/p>\n
Volviendo al ejemplo del m\u00f3dulo de br\u00fajula CMPS03, veamos c\u00f3mo se lee el registro de \u00e1ngulo:<\/p>\n
La secuencia se ver\u00e1 as\u00ed:<\/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