ATmega16 – TWI

El protocolo de comunicación TWI (Two Wired Serial Interface) o I2C es ideal para aplicaciones con microcontroladores. El único hardware necesario para implementar el bus es la colocación de resistores pull-up en cada línea.

Características:

  • Interface de comunicación simple pero potente y flexible. Solo se necesitan dos hilos.
  • Soporta operaciones de maestro y esclavo.
  • El dispositivo puede operar como transmisor o receptor.
  • El espacio de direcciones de 7 bits permite direccionar hasta 128 diferentes esclavos.
  • Soporta arbitraje multimaestro.
  • Velocidad de transferencia de datos hasta 400 KHz.
  • Manejadores de salida limitados por slew-rate. (Circuito patentado con bajo consumo de corriente)
  • Circuito supresor de ruido que suprime los picos en las líneas del bus.
  • Dirección de esclavo completamente programable con soporte de llamado general, es decir, todos los esclavos reciben la información.
  • El reconocimiento de direccion causa la salida del estado sleep cuando el AVR está en este estado.

Interconexión:
El bus utiliza AND por conexión, es decir, las líneas del microcontrolador tienen el colector abierto. Una de las líneas es utilizada para el reloj (SCL) y la otra para los datos (SDA).

Para el cálculo de las resistencias pull-up es necesario revisar la tabla 27.4 del datasheet.

Realizando los cálculos el mínimo valor de resistencia es de 1.5k y el máximo valor depende de la capacitancia del bus, ya que es complicado obtener este valor usualmente se suele colocar resistencias pull-up de 4.7k.

Terminología:
Maestro: Es el dispositivo que inicia y termina la comunicación. El maestro es el que genera la señal de reloj SCL.
Esclavo: Dispositivo direccionado por un maestro.
Transmisor: Dispositivo que coloca el dato en el bus.
Receptor: Dispositivo que lee el dato del bus.

Formato de Direccionamiento:
Todos los paquetes transmitidos en el bus TWI son de 9 bits, para el caso del direccionamiento el paquete se divide en 7 bits para la dirección, el octavo bit para la orden de leer o escribir y el noveno bit para el reconocimiento del paquete.

La dirección 0000 000 se usa cuando se quiera hacer un llamado general, es decir, cuando queremos que todos los esclavos reciban la misma información. Hay que tener en cuenta que después de realizar el llamado general la siguiente orden debe ser la de escribir, ya que si es la de leer no tendría sentido ya que tendríamos un escenario en que varios esclavos envían distintos tipos de datos.

Las direcciones con el formato 1111 xxx deberían ser reservadas para propósitos futuros.

Típica Transmisión de Datos:
Una típica transmisión de datos con el protocolo empieza con una condición de inicio, luego se envía la dirección junto con la orden de leer o escribir en el bus, seguidamente se envía el dato o los datos que se deseen y termina con una condición de parada.

Diagrama de Bloques:

Los registros que intervienen en el protocolo de comunicación TWI son:

TWBR: Registro para la generación del baudiaje de comunicación.

El valor para el registro se calcula usando la siguiente fórmula:

Donde TWPS es el valor del preescalador y los valores pueden ser 0, 1, 2, 3.

TWCR: Registro de control del protocolo TWI.

TWINT: Bandera de interrupción TWI.
TWEA: Activación de bit de reconocimiento.
TWSTA: Bit de Inicio.
TWSTO: Bit de Parada.
TWWC: Bandera de colisión en la escritura.
TWEN: Bit de activación del TWI.
TWIE: Interrupción de TWI.

TWSR: Registro de estado del TWI

TWS7:3: Estados en los que se encuentra actualmente el protocolo.
TWPS1:0: Bits de pre escalamiento.

TWDR: Registro de datos.

TWAR: Registro de direccionamiento de esclavo.

TWA7:1: Dirección del AVR en modo esclavo.
TWGCE: Activación de reconocimiento de llamada general.

Modos:
Los modos en los que podemos dividir el protocolo de comunicación TWI son los siguientes:

  • Maestro Transmisor.
  • Maestro Receptor.
  • Esclavo Transmisor.
  • Esclavo Receptor.

El protocolo de comunicación TWI tiene cierta complejidad debido a la cantidad de estados en el registro TWSR ó situaciones a las que podemos llegar con respecto al hardware o software. Es en estas situaciones es que una librería nos ayuda a hacer todo mucho más simple.

Para los dos primeros modos usaremos la librería I2Cmaster.h, las funciones que tiene la librería son las siguientes:

void I2C_begin(void): Inicia el protocolo de comunicación TWI a 100kHz con un preescalador de 1.

void I2C_start_wait(unsigned char address): Envía la condición de inicio y la dirección del dispositivo a leer, además espera que el dispositivo este listo para realizar este proceso.

unsigned char I2C_rep_start(unsigned char address): Vuelve a enviar la condición de inicio y la dirección.

void I2C_stop(void): Termina la transferencia de datos y libera el bus.

unsigned char I2C_write(unsigned char data): Envía un byte hacia el bus de datos.

unsigned char I2C_readAck(void): Lee un byte del bus de datos y lo almacena en el registro TWDR e inmediatamente hace un requerimiento para la lectura de un nuevo dato.

unsigned char I2C_readNak(void): Lee un byte del bus de datos y lo almacena en el registro TWDR y avisa que es el último dato que va a leer.

Ejemplo:

Descargas: