Comunicación I2C «maestro-esclavo», Pic C Compiler
Por
/
En esta sección aprenderás a programar dos microcontroladores PIC para realizar una comunicación mediante el protocolo I2C. El objetivo es enviar un dato del PIC maestro al PIC esclavo mediante la comunicación I2C.
¿Que es el protocolo de comunicación I2C?
El protocolo de comunicación I2C es una interfaz desarrollada por Philips, con el fin de comunicar microcontroladores y periféricos en una comunicación Half-duplex, esta forma de comunicación reduce el cableado y el numero de conexiones entre los microcontroladores.
Caracteristicas del Protocolo I2C
Velocidad de transmisión: estándar de 100 kBaudios. En modo de alta velocidad hasta 400 kbaudios.
El bus de comunicación: utiliza dos cables half-duplex es decir que transmite y recibe en ambas direcciones, pero sólo ocurre una transmisión a la vez, no hay comunicación bidireccional simultáneamente, se debe esperar a que se termine de transmitir para poder recibir
SDA (Serial Data Line): Linea de transmisión de datos.
SCL o SCK (Serial Clock line): Linea para la señal de reloj.
El protocolo de comunicación: es del tipo Maestro-Esclavo.
Circuito de conexión
Parámetros
Para poder hacer el uso de la comunicación I2C primero se identificaran los siguientes comandos:
Se utilizara la librería I2C con el comando
#use I2C (opciones)
Las opciones que se incluyen en la directiva son:
MASTER: Establece el modo maestro.
SLAVE: Establece el modo esclavo.
ADDRES: Especifica la dirección en modo esclavo.
SCL=pin: Especifica el pin SCL.
SDA=pin: Especifica el pin SDA.
FAST: Utiliza velocidad alta.
SLOW: Utiliza velocidad baja.
RESTART_WDT: Reinicia o restaura el temporizador Watch Dog, mientras espera una lectura.
FORCE_SW: Utiliza las funciones I2C del Software.
FORCE_HW: Utiliza las funciones I2C del hardware.
Una vez definida la directiva #use I2C, se utiliza las siguientes funciones para controlar el bus I2C. Las más importantes son:
i2c_isr_state(): Detecta el estado del bus i2c. Devuelve un int8.
i2c_poll(): Esta función devuelve TRUE si el hardware tiene un byte recibido en el buffer. Cuando se devuelve un TRUE, una llamada a I2C_
READ(): devolverá inmediatamente el byte que se recibió.
i2c_read(): Lee el buffer del dispositivo que actúa como slave.
i2c_slaveaddr(): Esta función establece la dirección para la interfaz I2C en modo esclavo.
i2c_start(): Emite una condición de arranque en el modo maestro I2C. Después de la condición de arranque el reloj se mantiene bajo hasta que i2c_write () es llamado. Si otro i2c_start se llama en la misma función antes de llamar a un i2c_stop, se emite una condición especial de reinicio.
i2c_stop(): Emite una condición de parada cuando está en el modo maestro I2C.
i2c_write(): Envía un byte a través del interfaz I2C. En el modo master esta función generará un reloj con los datos y en modo esclavo esperará al reloj del maestro.
Programación PIC Maestro
Inicialmente se establecen los parámetros de comunicación I2C del PIC Maestro.
Se establecen los pines de comunicación del PIC18F4550 donde sda=PIN_B0 y scl=PIN_B1 de acuerdo con la hoja de datos del PIC.
Se define el botón de entrada conectado al PIN_D0.
#define boton PIN_D0
Se realiza la lectura de la entrada digital del PIN_D0 conectado al botón. Si se oprime el botón la señal digital de entrada tomara el valor de 1 y 0 si se mantiene sin oprimir.
dato=input(boton);//entrada digital del PIN_d0
Inicia la comunicación del PIC Maestro para enviar los datos al PIC Esclavo.
i2c_start (); // inicia la comunicación
Se envía la dirección del esclavo con el que se establecerá la comunicación.
i2c_write (0xa0); //direccion del esclavo
Se envían los datos al PIC Esclavo, dependiendo del estado en que se encuentre en botón.
i2c_write (dato); //envia la informacion
Finalmente la instrucción termina la comunicación.
i2c_stop (); //termina la comunicación
Código PIC Maestro
#FUSES NOMCLR
#use i2c(Master,Fast, sda=PIN_B0, scl=PIN_B1,force_sw)//parametros I2C
#define boton PIN_D0
void main()
{
int8 dato;
while (TRUE)
{
dato=input(boton);//entrada digital del PIN_d0
i2c_start (); // inicia la comunicación
i2c_write (0xa0); //direccion del esclavo
i2c_write (dato); //envia la informacion
i2c_stop (); //termina la comunicación
delay_ms(100);
}
}
Programación PIC Esclavo
Se establecen los parámetro de comunicación del PIC Esclavo.
Se establecen los pines de comunicación del PIC18F4550 donde sda=PIN_B0 y scl=PIN_B1 de acuerdo con la hoja de datos del PIC.
Se establece la dirección del esclavo address=0xa0, este permite al PIC Maestro identificar a que PIC Esclavo se le enviaran los datos.
Se utiliza la función i2c_poll() para identificar que se están recibiendo datos del PIC Maestro.
if (i2c_poll()) //se reciben datos en el buffer?
{}
Una vez que se detecta la entrada de datos se procede a su lectura.
dato=i2c_read();//lectura de datos
Para evitar que el valor del dato sea la dirección del PIC Esclavo se desprecia con el código siguiente, este sirve para evitar errores en la recepción de datos.
if(dato!=0xa0)//despreciamos el dato de la dirección
{}
Finalmente el dato que se recibe se coloca en la instrucción para activar o desactivar el LED conectado en el PIN_D0.
OUTPUT_BIT(PIN_D0,dato); // DATO = 1 o 0 del boton
Código PIC Esclavo
#FUSES NOMCLR
#use I2C(slave, SDA=PIN_B0, SCL=PIN_B1, address=0xa0)//Parametros I2C
void main()
{
int8 dato;
while(TRUE)
{
if (i2c_poll())//se reciben datos en el buffer?
{
dato=i2c_read();//lectura de datos
if(dato!=0xa0)//despreciamos el dato de dirección
{
OUTPUT_BIT(PIN_D0,dato); // DATO = 1 o 0 del boton
}
}
}
}