Está en la página 1de 5

Usando el bus I2C

A juzgar por mis correos electrnicos, es evidente que el bus I2C puede ser muy confuso para los recin llegados. Tengo un montn de ejemplos sobre el uso del bus I2C en el sitio web, pero muchos de stos estn utilizando los controladores de alto nivel y no muestran el detalle de lo que realmente est sucediendo en el autobs. Este breve artculo por lo tanto, trata de desmitificar el bus I2C, espero que no tienen el efecto contrario! El bus I2C fsica Esto es solo dos cables, llamado SCL y SDA. SCL es la lnea de reloj. Se utiliza para sincronizar todas las transferencias de datos a travs del bus I2C. SDA es la lnea de datos. El SCL y SDA lneas estn conectadas a todos los dispositivos en el bus I2C. Tiene que haber un tercer cable que es la tierra o 0 voltios. Tambin puede haber un cable 5volt es el poder se distribuye a los dispositivos. Ambas lneas SCL y SDA son "abrir el desage" los conductores. Lo que esto significa es que el chip puede conducir a su baja produccin, pero no se puede conducir en alto. Para la lnea para poder ir de alta debe proporcionar resistencias pull-up a la fuente de 5V. Debe haber una resistencia de la lnea SCL a la lnea de 5V y otro de la lnea SDA a la lnea de 5V. Slo es necesario un conjunto de resistencias pull-up para todo el bus I2C, y no para cada dispositivo, como se ilustra a continuacin:

El valor de las resistencias no es crtica. Yo he visto nada de 1K8 (1800 ohmios) a 47K (47,000 ohmios) que se utiliza. 1k8, 4k7 y 10k son los valores comunes, pero nada en este rango debera funcionar bien. Recomiendo 1k8 ya que esto le da el mejor rendimiento. Si las resistencias estn ausentes, las lneas SDA y SCL se encuentre siempre bajo - casi 0 voltios - y el bus I2C, no funcionar. Amos y esclavos Los dispositivos en el bus I2C son maestros o esclavos. El maestro siempre es el dispositivo que impulsa la lnea de reloj SCL. Los esclavos son los dispositivos que responden a la maestra. Un esclavo no puede iniciar una transferencia a travs del bus I2C, slo un maestro puede hacer eso. No puede haber, y por lo general son varios esclavos en el bus I2C, sin embargo, normalmente hay un solo maestro.Es posible tener varios patrones, pero no es habitual y no lo trataremos aqu. En el robot, el maestro ser el controlador y los esclavos sern los mdulos tales como el SRF08 o CMPS03. Los esclavos nunca iniciar una transferencia. Tanto el maestro y el esclavo puede transferir datos a travs del bus I2C, pero que la transferencia est siempre controlado por el maestro. El protocolo I2C fsica Cuando el maestro (el controlador) desea hablar con un esclavo (nuestro CMPS03 por ejemplo) se inicia mediante la emisin de una secuencia de arranque en el bus I2C. Una secuencia de arranque es una de las dos secuencias especiales definidas para el bus I2C, el otro es la secuencia de parada. La secuencia de inicio y secuencia de parada son especiales ya que estos son los nicos lugares donde la SDA (lnea de datos) est autorizado a cambiar mientras la lnea SCL (lnea de reloj) es alto. Cuando se estn transfiriendo datos, SDA debe permanecer estable y no cambia, mientras que SCL es alta. La secuencia de arranque y marca el comienzo y el final de una transaccin con el dispositivo esclavo.

Los datos se transfieren en secuencias de 8 bits. Los bits se colocan en la lnea SDA comenzando con el MSB (bit ms significativo). La lnea SCL es entonces pulso alto, bajo. Recuerde que el chip no son importantes vectores de la lnea de alta, simplemente se "suelta" de la misma y la resistencia realmente tira en alto. Por cada 8 bits transferidos, el dispositivo que recibe los datos enva un bit de reconocimiento, por lo que en realidad son nueve pulsos de reloj SCL para transferir cada byte de 8 bits de datos. Si el dispositivo receptor enva un bit ACK baja, que ha recibido los datos y est listo para aceptar otro byte. Si lo enva de vuelta una alta entonces es lo que indica que no puede aceptar ms datos y el maestro debe terminar la transferencia enviando una secuencia de parada.

Qu tan rpido? El reloj estndar (SCL) de velocidad para I2C de hasta 100 KHz. Philips se define velocidades ms rpidas: modo rpido, que es a modo de velocidad de 400 KHz y de alta que es hasta 3.4MHz. Todos nuestros mdulos estn diseados para funcionar a velocidades de hasta 100 KHz. Hemos probado nuestros mdulos de hasta 1 MHz pero esto tiene un pequeo retraso de algunos Estados unidos entre cada byte transferido. En los robots prcticos, nunca hemos tenido ninguna necesidad de utilizar altas velocidades de SCL. Mantenga SCL igual o inferior a 100 KHz y luego olvidarse de l. Dispositivo I2C Abordar todas las direcciones I2C son 7 bits o 10 bits. El uso de direcciones de 10 bits es raro y no se trata aqu. Todos nuestros mdulos y los chips comunes que va a utilizar tendr 7 direcciones de bit. Esto significa que usted puede tener hasta 128 dispositivos en el bus I2C, ya que un nmero de 7 bits puede ser de 0 a 127. Cuando se enva la direccin de 7 bits, todava siempre envan 8 bits. El bit extra se utiliza para informar al esclavo si el maestro est escribiendo en l o la lectura de la misma. Si el bit es igual a cero es maestro est escribiendo en el esclavo. Si el bit es 1, el maestro est leyendo desde el esclavo. La direccin de 7 bits se coloca en la parte superior de 7 bits del byte y el de lectura / escritura (R / W) es poco en el LSB (bit menos significativo).

La colocacin de la direccin de 7 bits en la parte superior de 7 bits del primer byte es una fuente de confusin para los recin llegados. Esto significa que para escribir a la direccin 21, en realidad se debe enviar 42, que es de 21 movido por un poco. Es probable que sea ms fcil pensar en las direcciones del bus I2C como direcciones de 8 bits, incluso con las direcciones de slo escritura, y las direcciones impares como la direccin de lectura para el mismo dispositivo. Para tomar nuestro CMPS03 por ejemplo, esto es en la direccin 0xC0 ($ C0). Usted usa 0xC0 escribir en el CMPS03 y 0xC1 a leer de l. As que la lectura / escritura de bits slo hace que sea una direccin de par / impar. El Protocolo de Software I2C Lo primero que va a suceder es que el maestro enviar una secuencia de arranque. Esto alertar a todos los dispositivos esclavos en el bus que una transaccin est comenzando y que debe escuchar en encajona que es para ellos. A continuacin, el maestro enviar a la direccin del dispositivo. El esclavo que coincida con esta direccin continuar con la transaccin, cualquier otro se ignora el resto de esta transaccin y esperar a la prxima. Despus de haber examinado el dispositivo esclavo al maestro ahora debe enviar la ubicacin interna o nmero de registro en el interior del esclavo que desea escribir o leer. Este nmero es, obviamente, depende de lo que el esclavo es en realidad y el nmero de registros internos que tiene. Algunos dispositivos muy simples no tienen ninguna, pero la mayora, incluyendo a todos nuestros mdulos. Nuestra CMPS03 tiene 16 ubicaciones numeradas 0-15. El SRF08 tiene 36. Despus de haber enviado la direccin I2C y la direccin del registro interno de los maestros ahora pueden enviar el byte de datos (o de bytes, no tiene por qu ser slo uno). El maestro puede continuar enviando los bytes de datos a los esclavos y estos normalmente se colocan en los siguientes registros porque el esclavo incrementar automticamente la direccin del registro interno despus de cada byte. Cuando el maestro ha terminado de escribir todos los datos al esclavo, ste enva una secuencia de parada que se complete la transaccin. As que para escribir en un dispositivo esclavo: 1. Enviar una secuencia de arranque 2. Enviar la direccin I2C del esclavo con el bit R / W (incluso la direccin) 3. Enviar el nmero de registro interno que desee escribir en 4. Enviar el byte de datos

5. [Opcionalmente, enviar ms bytes de datos] 6. Enviar la secuencia de parada. Por ejemplo, usted tiene un SRF08 en la direccin por defecto de fbrica de 0xE0. Para iniciar el SRF08 que van deber escribir 0x51 al registro de comandos en el 0x00 de esta manera: 1. Enviar una secuencia de arranque 2. Enviar 0xE0 (direccin I2C del SRF08 con el bit R / W bajo (incluso la direccin) 3. Enviar 0x00 (direccin interna del registro de comandos) 4. Enviar 0x51 (el comando para iniciar el SRF08 que van) 5. Enva la secuencia de parada . La lectura del esclavo Esto es un poco ms complicado - pero no demasiado ms. Antes de leer los datos desde el dispositivo esclavo, debe decir cul de sus direcciones internas que desee leer. Por lo que una lectura del esclavo en realidad comienza por escribir en l. Esta es la misma que cuando se quiere escribir en l: Se enva la secuencia de arranque, la direccin I2C del esclavo con el bit R / W bajo (incluso la direccin) y el nmero de registro interno que desee escribir. Ahora le enviaremos otra secuencia de inicio (a veces llamado un reinicio) y la direccin I2C de nuevo - esta vez con el bit de lectura. A continuacin, leer los bytes de datos que quieras y poner fin a la transaccin con una secuencia de parada. As que para leer el rumbo de la brjula como un byte del mdulo CMPS03: 1. Enviar una secuencia de arranque 2. Enviar 0xC0 (direccin I2C del CMPS03 con el bit R / W bajo (incluso la direccin) 3. Enviar 0x01 (direccin interna del registro de rodamiento) 4. Enviar una secuencia de empezar de nuevo (inicio repetido) 5. Enviar 0xC1 (I2C direccin de la CMPS03 con alto el bit R / W (direccin impar) 6. Leer byte de datos de CMPS03 7. Enva la secuencia de parada. La secuencia de poco se ver as:

Espere un momento Eso es casi lo de simple de comunicaciones I2C, pero hay una complicacin ms. Cuando el maestro est leyendo desde el esclavo, el esclavo que coloca los datos en la lnea SDA, pero es el maestro que controla el reloj. Qu pasa si el esclavo no est listo para enviar los datos! Con dispositivos como memorias EEPROM esto no es un problema, pero cuando el dispositivo esclavo en realidad es un microprocesador con otras cosas que hacer, puede ser un problema. El microprocesador en la unidad esclava tendr que ir a una rutina de interrupcin, salvo sus registros de trabajo, saber lo que la direccin del maestro quiere leer, obtener los datos y colquelo en su registro de transmisin. Esto puede tomar muchas nos ocurra, mientras tanto el maestro est felizmente enviando pulsos de reloj en la lnea SCL que el esclavo no puede responder. El protocolo I2C ofrece una solucin para esto: el esclavo se le permite mantener la lnea SCL bajo! Esto se conoce como reloj de estiramientos. Cuando el esclavo recibe el comando de lectura del maestro que tiene la baja lnea de reloj. El microprocesador recibe los datos solicitados, la coloca en el registro de transmisin y libera la lnea de reloj que permite la resistencia de pull-up para finalmente sacar de alta. Desde el punto de vista de maestros, se emitir el primer pulso de reloj de la lectura, haciendo SCL alta y luego verificar si realmente se ha ido alto. Si su todava baja, entonces el esclavo que la celebracin de la baja y el maestro debe esperar hasta que se va de alta antes de continuar. Por suerte, los puertos I2C en la mayora de los microprocesadores se encargar de esto automticamente. A veces, sin embargo, el maestro I2C es una simple coleccin de subrutinas y hay unas pocas implementaciones por ah que ignoran por completo el reloj de estiramiento. Ellos trabajan con cosas como EEPROM, pero no con los

esclavos del reloj del microprocesador que utilizan el estiramiento. El resultado es que los datos errneos se lee en el esclavo. Cuidado! Ejemplo de cdigo maestro Este ejemplo muestra cmo implementar un maestro I2C software, incluyendo reloj de estiramientos. Est escrito en C para el procesador PIC, pero no debera ser aplicable a la mayora de los procesadores con pequeos cambios en las definiciones de pines de E / S. Es adecuado para el control de todos nuestros mdulos I2C robot basado. Ya que las lneas SCL y SDA son del tipo drenaje abierto, se utiliza el control de tres estados registro para controlar la salida, manteniendo el registro de salida baja. Los pines del puerto todava tienen que ser ledos, sin embargo, por lo que son definidos como SCL_IN y SDA_IN. Esta definicin y la inicializacin es probablemente todo lo que necesitas para cambiar de un procesador diferente. # Define SCL TRISB4 / / bus I2C SDA # define TRISB1 / / # define SCL_IN RB4 / / # define SDA_IN RB1 / / Para inicializar los puertos establecidos de Resistentes a la salida a 0 y los registros de tres estados a una que desactiva las salidas y les permite ser tirado por alto las resistencias. SDA SCL = = 1;SCL_IN SDA_IN = = 0; entre Utilizamos una rutina pequeo retraso SDA y SCL cambios para dar una secuencia clara en el bus I2C. Esto no es ms que una llamada a subrutina y retorno. i2c_dly vaco (void) { } Los siguientes 4 funciones proporcionan el comienzo primitivo, parada, leer y escribir secuencias. Todas las transacciones I2C se puede construir a partir de estos. i2c_start vaco (void) { SDA = 1 / / bit i2c inicio de la secuencia i2c_dly (); SCL = 1; i2c_dly (); SDA = 0; i2c_dly (); SCL = 0; i2c_dly (); } i2c_stop vaco (void) { SDA = 0; / / bit i2c detener la secuencia i2c_dly (); SCL = 1; i2c_dly (); SDA = 1; i2c_dly (); } sin firmar i2c_rx caracteres (char ack) { char x, d = 0; SDA = 1; for (x = 0; x <8; x + +) { d <<= 1; do { SCL = 1; } while (SCL_IN == 0); / / esperar a que cualquier reloj SCL se extiende i2c_dly (); if (SDA_IN) d | = 1, SCL = 0; } if (ACK) SDA = 0; ms SDA = 1; SCL = 1; i2c_dly (); / / enviar (N) bits ACK SCL = 0; SDA = 1; regreso d; } poco i2c_tx (sin signo d char) { char x; b poco esttica; for (x = 8, x, x -) { if (d & 0x80) SDA = 1; ms SDA = 0; SCL = 1; d <<= 1 , SCL = 0; } SDA = 1; SCL = 1; i2c_dly ();

b = SDA_IN / / posible bit ACK SCL = 0; retorno b; } Las 4 funciones primitivas anteriores se puede poner fcilmente juntos para formar completar las transacciones I2C . Aqu est y ejemplo para iniciar un SRF08 que van en cm: i2c_start (); / / enviar inicio de la secuencia i2c_tx (0xE0); / / direccin I2C SRF08 con el bit R / W claro i2c_tx (0x00); / / SRF08 comando de registro de direcciones i2c_tx (0x51); / / comando para iniciar van en cm i2c_stop (); / / enviar detener la secuencia Ahora, despus de esperar 65mS para el que van a completar (he dejado a ti) el siguiente ejemplo muestra cmo leer el valor del sensor de luz desde el registro 1 y el resultado de los registros de rango 2 y 3. i2c_start (); / / enviar inicio de la secuencia i2c_tx (0xE0), direccin / / I2C SRF08 con el bit R / W claro i2c_tx (0x01); / / SRF08 sensor de luz la direccin de registro i2c_start (); / / enviar una secuencia de reinicio i2c_tx (valor 0xE1 ); / / direccin I2C SRF08 con R / W bit LightSensor i2c_rx = (1); / / obtener el sensor de luz y enviar reconocer. Direccin del registro interno se incrementar automticamente. RangeHigh = i2c_rx (1); / / obtener el byte alto de la gama y enviar reconocer. RangeLow = i2c_rx (0); / / obtener el byte bajo de la gama - en cuenta que no reconocen la . ltimo byte i2c_stop (); / / enviar secuencia de parada

También podría gustarte