I2C AVR Comunicación serial TWI 


Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0

TWI AVR es el módulo para la comunicación serial I2C AVR del microcontrolador AVR, en el AVR a la comunicación serial I2C se le llama TWI que viene de las siglas en inglés de interfaz serial a 2 hilos, en la comunicación I2C o TWI se utilizan 2 hilos a lo que se conoce como bus I2C o en el caso del AVR se le llama bus TWI, a estos hilos se conectan los dispositivos que se puedan comunicar mediante el protocolo I2C, por uno de los hilos se enviará una señal de reloj para la sincronización y por el otro hilo se enviarán o recibirán datos, se pueden conectar varios dispositivos de los que uno de ellos será el maestro, es el que generará la señal de reloj además de decidir cuando se inicia o finaliza la comunicación y si la comunicación será de recepción o transmisión de datos, los demás dispositivos conectados al bus I2C se conocen como esclavos.

Cada uno de los dispositivos tiene una dirección, cuando el maestro necesita comunicarse con alguno de los esclavos lo hará enviando la dirección del esclavo a través del bus I2C, cuando el esclavo reciba su dirección podrá comunicarse con el maestro, el maestro ademas tiene que enviar un bit mediante el cual le indica al esclavo si quiere enviarle un dato o quiere recibir un dato del esclavo.

I2C TWI AVR ATMEGA88 SCL SDAEl microcontrolador AVR cuenta con el módulo TWI el que se utilizará para la comunicación serial I2C AVR, el microcontrolador AVR puede  ser utilizado como maestro o como esclavo en la comunicación serial I2C AVR.

Los pines que se utilizan en la comunicación serial I2C AVR son los nombrados como SDA serial data y SCL serial clock, el pin SDA es para enviar o recibir los datos, y el pin SCL es para la señal de reloj, a estos pines se les debe conectar mediante unas resistencias que pueden ser de 4,7K a la tensión de alimentación del microcontrolador AVR, o también se puede habilitar las resistencias internas pull up de estos pines, con lo que ya no se necesita utilizar las resistencias externas para la comunicación I2C AVR; los pines de los demás dispositivos conectados al bus I2C también están nombrados como SDA y SCL, cuando no se estén comunicando estos pines estarán normalmente en alto o a 1.

La velocidad de comunicación puede ser desde  100Kbps en el modo estandar o normal, aunque puede llegar en el modo rápido hasta los 400Kbps y en la alta hasta mas de 3Mbps, esto dependerá de los dispositivos utilizados, para ello es recomendable revisar sus hojas de datos, en el ATMEGA88 según su hoja de datos puede llegar hasta los 400Khz.

En la imagen se tiene la distribución de pines del ATMEGA88, se han resaltado las ubicaciones de los pines SCL y SDA.

La comunicación I2C se realiza de la siguiente manera

  • La señal del pin SDA del maestro pasa de un alto a un bajo mientras la señal su pin SCL esté a un alto, esto es el inicio de la comunicación I2C, al iniciar la comunicación se genera una señal de reloj por el pin SCL del maestro y se empieza a enviar los datos por el pin SDA en grupos de 8 bits o un byte, que es lo mismo.
  • El maestro enviará primero la dirección de identificación del esclavo con el que se quiera comunicar junto con el bit de escritura lectura, si el maestro quiere enviar o escribir un dato este bit será 0, si el maestro quiere leer o recibir un dato este bit será 1, la dirección del esclavo normalmente sera de 7 bits aunque también hay direcciones de 10bits.
  • Cada vez que el esclavo reciba un byte el esclavo responderá enviando un bit en bajo o 0 al maestro para indicar que se ha establecido la comunicación, este es un bit de confirmación de que hay comunicación y se le llama ACK, si la comunicación no se establece el valor del bit ACK será un 1.
  • Luego de haber enviado la dirección del esclavo y haber recibido el maestro el bit de confimación ACK el maestro enviará la dirección del registro del esclavo que se quiera leer o escribir, el esclavo responderá enviando al maestro el bit de confirmación ACK.
  • Luego el maestro enviará el dato si lo que se quiere es enviar o escribir un dato en el el registro del esclavo, el esclavo responderá enviando al maestro el bit de confirmación ACK; pero si lo que se quiere es que el maestro recibirá o  lea algún dato desde algún registro del esclavo, ocurrirá que si la recepción es correcta es maestro enviará al esclavo el bit de confirmación ACK.
  • Por último y para finalizar la comunicación la señal del pin SDA pasará de un bajo a un alto mientras la señal de reloj en el pin SCL este en un alto, en ese momento se deja de generar la señal de reloj y la comunicación habrá terminado.

Las conexiones tienen que hacerse de tal manera que los nombres de los pines coincidan, en la siguiente imagen se muestra como será la conexión para la comunicación I2C AVR, al ser utilizado el AVR como maestro, con otros dispositivos capaces de comunicarse con el protocolo I2C.

I2C AVR conexiones sda scl

La intensión de esta sección es ver como utilizar el módulo TWI en la comunicación serial I2C AVR para hacerlo trabajar con otros dispositivos, para mas información sobre la comunicación I2C se puede visitar este enlace, este otro y muchos mas.

I2C AVR PROGRAMACIÓN

Para programar la comunicación serial I2C AVR se recomienda mucho leer la hoja de datos del AVR utilizado, es lo mejor que se puede hacer, como referencia se verá para el ATMEGA88, para lo que se utilizan los siguientes registros: el registro TWBR, el registro TWCR, el registro TWSR, el registro TWDR, el registro TWAR, y el registro TWAMR.

El registro TWBR cuando  el microcontrolador AVR es utilizado como maestro, en este registro se cargará el valor con el que se elige la velocidad de transmisión de los datos, esto es los baudios o la cantidad de bits por segundo que se enviarán en la comunicación I2C AVR.

El valor a cargar en el registro TWBR se calcula con la siguiente fórmula que se encuentra en la hoja de datos, que dependerán de la velocidad elegida, de la frecuencia del oscilador utilizado y de un prescaler para la frecuencia del oscilador, el prescaler puede ser 1, 4, 16 o 64, se elige mediante las combinaciones de los bits 1 y 0 del registro TWSR.

Velocidad=Fosc/(16+2*(TWBR)*prescaler)

Esta formula se puede reacomodar para obtener la siguiente fórmula:

TWBR=((Fosc/Velocidad)-16)/(2*prescaler)

Si se quiere por ejemplo una velocidad d 100Khz, y el oscilador es de 8Mhz, con un prescaler de 1, si en la fórmula anterior se reemplaza y se despeja se tendrá:

TWBR=((8000000/400000)-16)/(2*1)

de donde:

TWBR=2

Por lo que para obtener un una velocidad de 400Khz se tendrá que cargar el registro TWBR con 2.

El registro TWCR este es el registro de control del módulo TWI para la comunicación I2C AVR

I2C AVR TWCR

El bit7 TWINT este es el bit de reconocimiento de que ha ocurrido una interrupción en caso de que esta este habilitada la interrupción del módulo TWI al poner a uno el bit0 TWIE, en el caso de no habilitar las interrupciones este será el bit mas utilizado ya que mediante la verificación del estado de este bit se podrá conocer si se ha iniciado correctamente la comunicación I2C AVR, o también si se ha detenido la comunicación, o también si se han enviado o recibido los datos correctamente.

El bit6 TWEA al poner este bit a 1 se habilita el uso del bit de reconocimiento ACK

El bit5 TWSTA Al poner este bit a 1 se da inicio a la comunicación I2C AVR

El bit4 TWSTO Al poner este bit a 1 se para o termina la comunicación I2C AVR.

El bit3 TWWC este bit se pone a 1 automáticamente indicando un error cuando se quiere enviar o recibir un dato mientras no se dan las condiciones apropiadas.

El bit2 TWEN Al poner este bit a 1 se habilita el uso del módulo TWI para la comunicación serial, mientras este bit esté a 0 no se podrá utilizar la comunicación I2C AVR.

El bit1 este  bit se pone a 0 ya que no se utiliza.

El bit0 TWIE Habilita el uso de la interrupción del módulo TWI.

El registro TWSR este registro se utiliza para averiguar en que estado se encuentra el módulo TWI cuando se realiza la comunicación serial I2C AVR, en este registro también se encuentran los bits mediante los cuales se elige el prescaler para obtener la velocidad de la comunicación I2C AVR.

I2C AVR TWSR

Bit7 a bit3 estos 5 bits trabajan en forma automática generando diferentes combinaciones, dependiendo de las combinaciones permite conocer en que estado se encuentra la comunicación I2C AVR, para ello en la hoja de datos del  AVR utilizado se tienen unas tablas con lo que indican esta combinaciones, la siguiente es por ejemplo para el caso cuando el ATMEGA88 se comporta  como maestro y está enviando un dato al esclavo:

I2C AVR estado del TWI

Si las combinaciones de estos bits es por ejemplo 0x08 quiere decir que se ha dado el inicio de la comunicación I2C AVR, las combinaciones de estos bits son utilizadas dentro del programa para verificar que la comunicación  transcurre con normalidad.

El bit2 no se utiliza se pone a 0.

Los bits 1 y 0 con las combinaciones de estos bits se elige el prescaler a utilizar para obtener la frecuencia de transmisión, de donde se obtiene el valor a cargar en el registro TWBR, las combinaciones son las siguientes:

I2C AVR prescaler

El registro TWDR en la comunicación I2C AVR en este registro se pondrá el dato que se quiera transmitir hacia el esclavo, y también donde se encontrará el dato recibido desde el esclavo, tiene esta doble función.

El registro TWAR en los bits del 7 al 1 de este registro se colocará la dirección del microcontrolador AVR cuando este es utilizado como esclavo, el bit0 es para una llamada  general, al poner el bit0 a 0 el microcontrolador responderá solo si el maestro envía su dirección, al poner este bit a 1 el AVR esclavo responde cuando el maestro envíe la dirección 0x00.

I2C AVR PROGRAMACIÓN en el ATMEL STUDIO

Para la programación de la comunicación serial I2C AVR, cuando el AVR sea el maestro se utilizará el ATMEL STUDIO, en este caso se comentará como se puede proceder para utilizar el módulo TWI para la comunicación serial I2C AVR del ATMEGA88, lo aquí comentado es muy similar para otros microcontroladores AVR.

Para iniciar el I2C AVR, siendo el AVR el maestro.

Los pines del ATMEGA88 para el manejo de la comunicación I2C AVR son el pin PC5 para la señal de reloj por lo que en este caso se le llama pin SCL, y el pin PC4 para la transmisión y recepción de datos, en este caso se le llama pin SDA, los pines serial clock SCL y serial data SDA no es necesario que se configuren como entradas digitales, lo que si se puede aprovechar es utilizar sus resistencias internas PULL UP, lo que en el ATMEL STUDIO se puede hacer así:

PORTC|=((1<<PC4)|(1<<PC5));//habilitación de resistencias pull up par SCL y SDA

Configuración del registro TWBR el valor a cargar en el registro TWBR se calcula con la siguiente fórmula que se encuentra en la hoja de datos, que dependerán de la velocidad elegida, de la frecuencia del oscilador utilizado y de un prescaler para la frecuencia del oscilador, el prescaler puede ser 1, 4, 16 o 64, se elige mediante las combinaciones de los bits 1 y 0 del registro TWSR.

Velocidad=Fosc/(16+2*(TWBR)*prescaler)

Esta formula se puede reacomodar para obtener la siguiente fórmula:

TWBR=((Fosc/Velocidad)-16)/(2*prescaler)

Se utilizará un velocidad de 400Khz, la frecuencia de trabajo del ATMEGA88 a 8Mhz, se usará un prescaler de 1, reemplazando se obtendrá:

TWBR=((8000000/400000)-16)/(2*1)

de donde:

TWBR=2

Por lo que para obtener un una velocidad de 400Khz se tendrá que cargar el registro TWBR con 2.

Luego en la inicialización de la comunicación serial I2C AVR el registro TWBR en el ATMEGA88 quedará así:

TWBR=2;//velocidad 400Khz, Fosc 8Mhz, prescaler de 1

Configuración del registro TWCR

Para iniciar módulo TWI de este registro solo es necesario habilitar el bit TWEN, esto en el ATMEL STUDIO será así.

TWCR|=(1<<TWEN);//módulo TWI iniciado

Carga del registro TWSR de este registro solo serán necesarios configurar  los bits 1 y 0 para el prescaler utilizado, pero como es utiliza el prescaler de 1 las combinaciones de estos bits es 00, y como este registro se inicia con todos sus bits a 0, no será necesario hacer nada en este caso, pero si se utilizará otro prescaler si que se tendrá que hacer en el inicio.

Entonces se puede iniciar el módulo TWI para la comunicación serial I2C AVR en el ATMEGA STUDIO de la siguiente manera:

La inicialización podría hacerse dentro de una función a la que se le puede dar el nombre que se quiera, en este caso se la llamará i2c_iniciar() lo que en el ATMEL STUDIO será así:

Antes de empezar una comunicación I2C AVR, al realizar una tarea como un inicio, un envío o una recepción de datos por parte del maestro se pondrá el bit TWINT a 1, luego este bit se pondrá automáticamente a 0 y para detectar que ya se realizo la tarea por parte del módulo TWI será necesario esperar que el bit TWINT se ponga a 1, mientras eso no ocurra se tendrá que esperar, esto se realizará con una función a la que se le llamará i2c_espera(), la que en el ATMEL STUDIO puede ser hecha así:

Para iniciar la comunicación I2C AVR, una vez inicializado el módulo TWI I2C AVR se puede iniciar la comunicación poniendo el bit7 TWINT, el bit5 TWSTA y el bit2 TWEN del registro TWCR a 1, luego se esperará a que el bit7 TWINT se vuelva a poner a 1 automáticamente, el inicio de la comunicación se hará mediante una función a la que se le llamará i2c_inicia_com(), se le puede llamar como se quiera, en el ATMEL STUDIO se puede hacer así:

Para detener la comunicación I2C AVR, si ya no se quiere seguir realizando una comunicación I2C AVR se puede detener la comunicación poniendo el el bit7 TWINT, el bit5 TWSTO y el bit2 TWEN del registro TWCR a 1, la parada de la comunicación se hará mediante una función a la que se le llamará i2c_detener(), se le puede llamar como se quiera, en el ATMEL STUDIO se puede hacer así:

Para la transmisión de datos del maestro al esclavo para enviar datos al esclavo el bit7 TWINTy el bit2 TWEN del registro TWCR se tendrán que poner a 1, el envío de datos se hará mediante una función a la que sel llamará i2c_envia_dato(), se le puede llamar como se quiera, en el ATMEL STUDIO se puede hacer así:

Para la recepción de datos por el maestro desde el esclavo en forma continua esto es si se quiere recibir mas de un dato por parte del maestro se tendrá que habilitar el uso del bit ACK, los datos se leerán desde el registro TWDR y serán guardados en una variable, para este tipo de recepción el bit7 TWINT, el bit6 TWEA y el bit2 TWEN del registro TWCR se pondrán a 1, la recepción de datos se hará mediante una función a la que sel llamará i2c_recibe_dato_ack(), se le puede llamar como se quiera, esta función devolverá el dato recibido, en el ATMEL STUDIO se puede hacer así:

Para la recepción de un último dato por el maestro desde el esclavo esto es si ya no se quiere recibir mas datos por parte del maestro no se habilitará el uso del bit ACK, los datos se leerán desde el registro TWDR y serán guardados en una variable, para este tipo de recepción el bit7 TWINT, el bit6 TWEA y el bit2 TWEN del registro TWCR se pondrán a 1, la recepción de datos se hará mediante una función a la que sel llamará i2c_recibe_dato_nack(), se le puede llamar como se quiera, esta función devolverá el dato recibido, en el ATMEL STUDIO se puede hacer así:

Para conocer el estado de la comunicación I2C AVR se tendrá que obtener el valor que está contenido en los 5 bits de mas peso del registro TWSR seguido de 3 ceros, el número obtenido indicará el estado de la comunicación I2C AVR, este número tendrá que ser comparado con el valor del estado que le corresponde a la comunicación según tabla, para verificar si todo esta correcto y poder detectar posibles errores de comunicación, las tablas para los estados se encuentran en la hoja de datos del AVR, para el caso del ATMEGA88 se comentó líneas arriba en el registro TWSR.

ARCHIVO DE CABECERA PARA EL USO DEL MÓDULO TWI I2C AVR EN EL ATMEGA STUDIO

Se puede agrupar todas la funciones vistas anteriormente para el uso del módulo TWI en la comunicación serial I2C AVR en el ATMEL STUDIO en modo maestro del ATMEGA88 con una velocidad de 400KHz, en un archivo de cabecera al que se le llamará en este caso i2c.h, aunque se le puede dar el nombre que se desee, se hará uso de este archivo de cabecera en los ejemplos que se realizarán con el ATMEGA88, si se utiliza otro AVR u otra velocidad de comunicación es fácil hacer los cambios que se necesiten dentro del archivo i2c.h, se verá algún ejemplo.

 

I2C AVR PROGRAMACIÓN Ejemplos en el ATMEL STUDIO

Para ver los ejemplos del manejo del módulo TWI en en la comunicación serial I2C AVR visitar este enlace.

Si he podido ayudarte con el uso del módulo módulo TWI I2C AVR, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on LinkedIn0