Bus I2C



1. Introducción:

 Es un estándar que posibilita la comunicación entre dispositivos a corta distancia. Fue un estándar desarrollado por Philips.
Es un sistema de comunicación serie que usa dos hilos, SDA (línea de datos) y SCL (señal de reloj) ambos conectados a unas resistencias de PULL-UP.




2. Características:

 Es un bus de comunicación robusto, en el que se hace un control de transferencia de datos; los datos se transfieren byte a byte y no hay un límite de bytes continuos a enviar, pero por cada byte enviado, debe recibirse un ACK o bit de reconocimiento. Este bit, será el que controle la comunicación ya que indica que la comunicación está bien.
Funciona a varias velocidades de transferencia (100Kb/s, 400Kb/s, 1Mb/s, 3.4Mb/s o 5Mb/s) pero a corta distancia; más bien es un bus para comunicar elementos dentro de una misma pcb.

Los elementos que conforman el bus se clasifican como "Maestros" que son los que generan la señal SCL y "Esclavos" que son los que reciben los comandos.
Sólo los dispositivos "Maestros" pueden iniciar la comunicación y para esto, el bus debe estar libre (SDA y SCL están a nivel alto).

Inicialmente el direccionamiento sólo era de 7 bits, pero luego se amplía a 10 bits incrementando el número de elementos en el bus.



3. I2C con el PIC18F4550:

 El pic18F4550 para realizar la comunicación usa el módulo MSSP (Master Synchronous Serial Port) en modo I2C. Este módulo está conectado a los pines 33 (SDA) y 34 (SCL).
Es un Interface Serial que se puede configurar como I2C o SPI e integra las funciones necesarias para la comunicación.




4. Registros que intervienen:

 El pic18F4550 cuenta con 6 registros para la comunicación I2C.

4.1. Registro SSPCON1:

 De este registro destacan los 4 bits de menor peso que van a configurar el módulo como "Maestro" o "Esclavo" y el bit 6 que habilita el puerto MSSP.

En nuestro caso lo cargaremos con el valor 0x28 que indicará que nuestro dispositivo funcionará como "Maestro".



4.2. Registro SSPCON2:

 La funcionalidad de este registro dependerá de si hemos configurado el sistema como "Maestro" o "Esclavo". Nos centraremos en el modo "Maestro".

Este es un registro fundamental para la comunicación, ya que define los estados: Start, Stop, Habilitar recepción, .
En nuestro caso lo cargaremos con el valor 0x00 inicialmente.



4.3. Registro SSPSTAT:

 Este registro contiene "banderas" que controlan la comunicación y son los indicadores de recepción de Stop o Start, trasmitiendo, buffer lleno, .

En nuestro caso lo cargaremos con el valor 0x00 inicialmente.



4.4. Registro SSPBUF:

 Este es el bus usado para transmitir o recibir datos.

4.5. Registro SSPSR:

 Registro no accesible directamente, pero que interviene junto con el buffer en la transmisión y recepción de datos.

4.6. Registro SSPADD:

 Si el módulo se configura como "Esclavo", almacena la dirección asignada en el bus.
Si lo configuramos como "Maestro", este registro define la velocidad del bus.

Para saber qué valor debemos cargar, usaremos la siguiente fórmula:
SSPADD = Fosc/(4 * speed) -1


En nuestro caso lo cargaremos con el valor 119 que resulta de:
Fosc = 48MHz -> La frecuencia de trabajo configurada en el PIC18F4550
Speed = 100KHz -> La velocidad que queremos para el bus I2C
48 000 000 / (4 * 100 000) - 1 = 119




5. Funciones básicas para la comunicación I2C:

  Descripción de las funciones básicas de la comunicación I2C que habilitan los diferentes estados.

5.1. Función "Idle":

  Función que nos indicará si el bus está ocupado o disponible.

Esta función consulta el bit R/W que cuando está configurado como "Maestro", indicará si la transmisión aún no se ha completado (R/W = 1) o si ya se ha completado (R/W = 0).

También consulta los 5 bits de menor peso del registro SSPCON2 que indican que el evento enviado ha finalizado:
Start Condición, Repetir Start Condición, Stop Condición, Recepción habilitada, y Ack. Se ponen a 1 cuando se activa, y automáticamente pasan a 0 cuando finalizan.




5.2. Función "Start":

  Función encargada de enviar una condición de inicio.
Pone a nivel alto el bit SEN del registro SSPCON2 y espera hasta que finalice el evento.




5.3. Función "Repetir Start":

 Función usada para indicar que vamos a seguir usando el bus.
Esta función equivale a una Stop Condición y otra Start Condición; si las enviamos por separado, podría ocasionar que perdiésemos la posibilidad de transmitir porque otro master nos ocupa el bus.

Pone a nivel alto el bit SEN del registro SSPCON2 y espera hasta que finalice el evento.




5.4. Función "Ack":

 Función que envía un ACK al "Esclavo" para indicar que la recepción se ha realizado correctamente y que otro byte será enviado.

Pone a 0 el bit ACKDT que es el valor del bit a transmitir cuando se quiere enviar un ACK. Al poner a 1 el ACKEN se envía el evento.




5.5. Función "NotAckI2C":

 Pone a 1 el bit ACKDT que es el valor del bit a transmitir cuando se quiere enviar un NACK. Al poner a 1 el ACKEN se envía el evento.

Este evento según el contexto, puede tener varias funcionalidades:






5.6. Función "StopI2C":

 Función que envía una condición de Stop para dejar el bus libre.

Para esto pone a nivel alto el bit PEN del registro SSPCON2 y espera a que finalice el evento.




5.7. Función "WriteI2C":

 Función que carga un byte en el buffer para ser enviado.

Cuando el bus está libre, envía el byte.




5.8. Función "ReadI2C":

 Cuando el bus está libre, habilita la recepción poniendo a 1 el bit RCEN del bus SSPCON2 y copia el buffer a una variable.
Finaliza enviando un NACK indicando la correcta recepción y que serán leídos más bytes.




6. Funciones lectura y escritura:

  Descripción de las funciones que hacen posible la comunicación.

6.1. Secuencia de escritura:

El "Maestro" se comunica con un elemento "Esclavo" y escribe un registro:






6.2. Secuencia de lectura:

El "Maestro" se comunica con un elemento "Esclavo" y lee un registro:






7. Probando el bus

  Realizaremos unos proyectos para probar la comunicación con un módulo RTC y una memoria Eeprom.

www.microedu.es

Si chove, non orballa!