Jun 262016
 
18. Comunicación I2C
5 (100%) 2 votes

El bus de comunicaciones I2C es un protocolo que se efectúa por medio de DOS hilos. A través de estos dos hilos pueden conectarse diferentes dispositivos donde algunos de ellos serán MAESTROS en cuanto muchos otros dispositivos serán ESCLAVOS.

 

Para poder reconocer cada uno de los dispositivos conectados a los DOS hilos del bus de comunicaciones I2C, a cada dispositivo se le asigna una dirección. Así en este tipo de comunicaciones el MAESTRO es el que tiene la iniciativa en la transferencia y este es quien decide con quien se quiere conectar para enviar y recibir datos y también decide cuando finalizar la comunicación.

 

Los DOS hilos del BUS I2C son lineas de colector abierto donde una de las lineas lleva la señal de reloj y es conocida como (SCL), y la otra linea lleva los datos y es conocida como (SDA). Para que la comunicación funcione se deben utilizar unas resistencias PULL UP (resistencias conectadas a positivo) para asegurar un nivel alto cuando NO hay dispositivos conectados al BUS. Como se puede apreciar en la siguiente imagen:

i2c conexión

El número de dispositivos que pueden conectarse de esta forma y además la longitud del BUS es limitada por la capacidad de direccionamiento (de 7 a 10 bits) y por la máxima carga del BUS (400pF). La velocidad máxima estándar es de 100Kbps.

 

Videos:

 

 

La comunicación I2C funciona de la siguiente manera:

La transmisión de datos se inicia con un bit de inicio (START) y termina con un bit de finalización (STOP). El bit de START se reconoce porque la linea SDA pasa de un estado lógico alto para un estado lógico de bajo cuando la linea SCL esta en nivel alto. El STOP se establece cuando hay una transición de bajo a alto en la linea SDA, cuando SCL está en un nivel alto.

Secuancia de I2C

Cuando comienza la transmisión de datos, el MAESTRO envía la dirección del ESCLAVO con el cual se quiere comunicar, esta dirección puede ser de 7 o 10 bits con formato de byte (uno o dos bits respectivamente) Después de la dirección se adiciona 1 bit, que indica si se desea ESCRIBIR o LEER (R/W).

 

Cuando el Maestro envía estos DATOS para el esclavo. El ESCLAVO debe responderle al maestro con un bit de confirmación para informarle que escucho la solicitud del maestro y que esta a disposición de lo que él necesite. Este bit de confirmación se conoce como  (ACK). Si el maestro NO recibe este bit, la comunicación se interrumpe. Por otro lado, se puede dar el caso que un ESCLAVO está mandando alguna información al maestro, entonces el maestro también generará este bit de confirmación hacia el esclavo.

Tramas I2C

Puede darse el caso también de que una vez el MAESTRO se comunica con el ESCLAVO, el MAESTRO no abandone el BUS y continúe comunicándose con el ESCLAVO, para eso el MAESTRO debe generar una nueva condición de START que se conoce en la literatura como START REPETIDA (Sr), idéntica al START anterior solo que con un pulso de reconocimiento.

 

Para trabajar con el modulo de comunicación I2C, se deben configurar los siguientes registros: SSPCON, SSPCON2, SSPADD, SSPBUF, SSPSTAT SSPSR.

Si te está sirviendo de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




En CCS C PIC C, existen funciones que nos facilitan la implementación de este tipo de comunicación. Comencemos primero viendo el tipo de configuraciones que podemos llevar a cabo:

Para las configuraciones genéricas del i2c declaramos lo siguiente en el encabezado de nuestro programa:

 

Estas opciones pueden ir separadas por comas y pueden ser cualquiera de las siguientes opciones

Comunicacion i2c con PIC C

La directiva (#use i2c) tiene efecto en las funciones: I2C_START, I2C_STOP, I2C_READ. I2C_WRITE y I2C_POLL. Se utilizan funciones de Software a menos que se especifique FORCE_HW.

Como por ejemplo:

Las funciones asociadas al i2c son:

Para el modo maestro, esta función inicia la trasmisión. Después de la condición de arranque o START, el reloj es colocado en nivel lógico bajo hasta el momento en que se escriba con la función I2C_WRITE(); Si se llama otra función I2C_START antes que un I2C_STOP quiere decir que se está utilizando un START Repetido (Sr). Esta función depende de la respuesta del esclavo.

Finaliza la transmisión.

En esta función “DATO” es un entero de 8 bits que se envía por el bus. Cuando un dispositivo que es MAESTRO aplica esta instrucción , se genera una señal de reloj que marca la velocidad de transmisión del dato; Cuando un ESCLAVO aplica esta instrucción se queda esperando la señal de reloj que genere el MAESTRO.

Esta función devuelve el bit de reconocimiento ACK que le envía el receptor cuando la transmisión ha terminado: 0 indica ACK; 1 indica NOACK y 2 indica una colisión en el modo MULTIMASTER.

Para saber la dirección de la transmisión, se observa el bit de menor peso (LSB) del primer dato transmitido tras un START (Si el bit es “0” quiere decir que la información se está transmitiendo de MAESTRO a ESCLAVO)

Dato es un entero de 8 bits leído del BUS. Cuando un dispositivo que es MAESTRO aplica esta instrucción , se genera una señal de reloj que marca la velocidad de transmisión del dato; Cuando un ESCLAVO aplica esta instrucción se queda esperando la señal de reloj que genere el MAESTRO. No hay timeout por lo que esta instrucción se utiliza junto con i2c_poll() para prevenir bloqueos.

Opcionalmente se puede incluir un ACK donde  1 indica ACK; 0 indica NOACK

Se utiliza solo si el PIC tiene modulo SSP. Devuelve un TRUE(1) si se ha recibido el dato en el buffer y un FALSE(0) si no se ha recibido. Cuando devuelve el TRUE(1) la función i2c_read() guarda el dato recibido.

Se utiliza solo si el PIC tiene modulo SSP. Devuelve el estado del bus en modo ESCLAVO después de una interrupción.

Estado es un entero de 8 bits.

Se especifica la dirección del dispositivo en modo esclavo.

Ejemplo

Un proceso de temperatura tiene incorporado una tarjeta electrónica encargada de realizar el monitoramiento de la variable temperatura en el interior del proceso. Dicha tarjeta electrónica cuenta con PIC16F887, un LCD, un puerto de comunicación serial, un sensor I2C de temperatura (DS1621), cuenta con un reloj calendario de tiempo real I2C (DS1307) y cuenta además con una memoria EEPROM serie I2C(M24512). Se solicita al ingeniero de control realizar un programa en el PIC16F887, para que por medio de un menu en el computador, el usuario pueda tener la opción de leer la temperatura y la hora de lectura de la misma almacenando estos datos en la memoria EEPROM y que estos datos también se visualicen en el LCD. El Menú debe tener una segunda opción que le permita al usuario ver por el puerto serial los últimos datos almacenados en la EEPROM.

Circuito Electronico:

En el proteus vamos a necesitar los siguientes componentes: PIC16F887, RES, CAP, CRYSTAL, M24512, DS1621, DS1307 y LM016L.

I2CExample

Código de Implementación:

A continuación se muestra el procedimiento y todo el código de implementación del ejemplo. Recuerda que para poder ver el código es necesario que COMPARTAS el contenido de este post o te SUSCRIBAS con cualquiera de los tres botones que están abajo y automáticamente el Código de implementación queda desbloqueado para que lo pegues y lo copies en tu compilador.

Para solucionar este ejemplo vamos a crear tres librerías para manejar cada uno de los 3 esclavos del ejemplo.

EEPROM

En entradas pasadas habiamos utilizado la libreria de la EEPROM para guardar datos en ella, en este ejemplo vamos a crear nuestra propia librería para entender como programarla por i2c:

 

La EEPROM M24512 (click para ver datasheet)  tiene tres pines E2, E1, E0 que permiten establecer la dirección de este dispositivo, de esta manera el PIC se comunicara con la Memoria cuando el envíe por el i2c dicha dirección. Esta dirección es almacenada dentro de la EEPROM en un byte de control donde la parte alta de este byte siempre es fija (1010) y la parte baja corresponde a los estados logicos de E2, E1, E0, por ultimo viene el bit de escritura/lectura, como puede ser visto en la siguiente figura:

byte de control i2c

Lo que quiere decir que si el PIC envia 0xA0 el PIC estará escribiendo en la memoria, por otro lado si manda 0xA1h el PIC estará leyendo la memoria.

 

El formato de escritura de la EEPROM es mostrada en la hoja de datos en la pagina 15, donde después de la señal de START, se escribe la palabra de control para seleccionar el dispositivo y el modo de trabajo, dos bytes para la dirección de escritura y el dato a escribir.

 

A continuación se muestra la función de escritura que guardaremos en un archivo llamado EEPROM_24512.c

 

El proceso de escritura puede hacerse de 4 formas como mostrada en la pagina 19 del datasheet, nosotros utilizaremos la segunda forma “leer una dirección cualquiera (Random Address Read)” que es la más común y dicho proceso de lectura es muy similar con el de escritura solo que en este caso al final el MAESTRO debe enviar un NO ACK.

 

A continuación se muestra la segunda función que colocaremos en nuestra librería de EEPROM_24512.c

 

RELOJ DE TIEMPO REAL DS1307

Datasheet click aca. Este dispositivo es capaz de suministrar los segundos, minutos, horas, dia, mes y año en tiempo real (por medio de un cristal de cuarzo de 32.768Khz). Este dispositivo posee una serie de registros donde aparecen los datos necesarios (tabla 2 de la pagina 8 del datasheet). Estos datos son suministrados en BCD.

 

El ciclo de escritura de este dispositivo se inicia con la palabra 0xD0 y la lectura con 0xD1 (pagina 12). En la escritura el segundo byte es un puntero que indica la dirección del dato que queremos escribir (e la tabla 2). En el ciclo de lectura es igual que el de escritura solo que el ultimo byte debe indicar un NACK al Maestro. Con esto tan solo queda convertir los bytes leídos de bcd a binario.

 

Para el manejo del reloj de tiempo real vamos a crear una librería llamada DS1307.c con las siguientes funciones:

TERMOMETRO

El termometro digital i2c DS1621 (Clic aca Datasheet) permite medir una temperatura entre -55°C y 125°C como mostrado en la tabla 2 de la pagina 4 del datasheet. Este valor de temperatura es suministrado en dos Bytes. El byte alto es el valor entero con una resolución de 1°C y el segundo byte es el valor decimal con una resolución de 0.5°C.

 

El termómetro tiene tres pines los cuales sirven para darle la dirección al dispositivo (A2, A1, A0). En nuestro ejemplo tenemos la dirección (0x03). Al igual que la memoria EEPROM el termómetro tiene un byte de control donde se almacena la dirección y si se desea escribir o leer. Este byte de control posee en su parte alta un numero fijo (1001) y la parte baja viene dado por los pines de dirección (A2, A1, A0) y el ultimo bit (R/W) es de escritura o lectura.

 

En la pagina 10 del datasheet se muestran todos los comandos que se pueden usar con este dispositivo y la pagina 9 muestra ejemplos de como debe realizarse el envío de tramas por el i2c. Los comandos pueden ser 0xAA para lectura de la temperatura, 0xEE para el inicio de conversión.

 

A continuación se muestran las funciones que vamos a colocar en nuestra librería llamada TEMP_DS1621.c

 

PRINCIPAL

Dado que la temperatura es un dato tipo FLOAT, no se puede guardar este dato directamente en la EEPROM, por lo tanto vamos a utilizar una librería suministrada por CCS C llamada FLOATEE.c que nos permitirá guardar y leer datos tipo FLOAT en una EEPROM.

 

A continuación se muestra el programa principal el cual despliega un menú, donde si se digita “1” el pic lee la temperatura y la hora y las almacena en la memoria EEPROM mostrando estos datos en el LCD. Si el usuario presiona “2” el PIC lee la memoria y muestra los últimos 7 datos en el terminal serie.

>> DESCARGAR ARCHIVOS PROTEUS Y PICC <<

Bibliografia

  1. Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo Garcia Breijo,

 

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.




  4 Responses to “18. Comunicación I2C”

  1. cordial saludo.

    Sergio.

    la verdad esta muy completa la explicación y el largo del vídeo lo amerita lo explicaste como se debe hacer una tutoria virtual.
    tengo un problema pensé que lo podía solucionar pero no he sido capaz al comilar las librerias me pide una un instrucción inicial claro que estoy compilando con pic c 5.059, sera ese mi problema?, en manera de lo posible si me puedes guiar seria algo bueno mira el error que me sale.

    *** Error 128 “EEPROM_24512.c” Line 2(50,51): A #DEVICE required before this line
    1 Errors, 0 Warnings.
    Build Failed.

    Att: emerson palacio

    • Emerson no se porque te sale ese error, no entiendo que es lo que tienes en la linea 2. Estas seguro de estar compilando el programa principal?? No vaya ser que estes compilando la librería. Por Cierto ahí en la pagina están todos los archivos completos comprimidos en un .rar descargalos y compilalo para ver si te sale el mismo problema.

      • no ya me dio el error si era mio pensé que se debía compilar las librerías eran solo guardarlas, pero también poseía una librería hecha por alguien y por ende chocaba con tu librería, el problema era que ambas tenían el mismo nombre, solo borre la otra librería y listo, pero si me corrió perfecto, gracias por tu pronta solución.

        Att: emerson palacio.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

(required)

(required)