Sie sind auf Seite 1von 7

TEMA:

Comunicacin I2C
OBJETIVOS:
Determinar el funcionamiento de la comunicacin I2C.
Establecer los parmetros para la comunicacin I2C en dispositivos 16F887.
Conocer los comandos utilizados en CCS para realizar la comunicacin I2C
RESUMEN
La principal caracterstica de I2C es que utiliza dos lneas para transmitir la informacin: una para los
datos y otra para la seal de reloj. Tambin es necesaria una tercera lnea, pero esta slo es la
referencia. Como suelen comunicarse circuitos en una misma placa que comparten una misma masa
esta tercera lnea no suele ser necesaria.
Los dispositivos conectados al bus I2C tienen una direccin nica para cada uno. Tambin pueden
ser maestros o esclavos. El dispositivo maestro inicia la transferencia de datos y adems genera la
seal de reloj, pero no es necesario que el maestro sea siempre el mismo dispositivo, esta
caracterstica se la pueden ir pasando los dispositivos que tengan esa capacidad. Esta caracterstica
hace que al bus I2C se le denomine bus multimaestro.

INTRODUCCIN
El bus I2C, un estndar que facilita la comunicacin entre microcontroladores, memorias y otros
dispositivos con cierto nivel de "inteligencia", slo requiere de dos lneas de seal y un comn o
masa. Fue diseado a este efecto por Philips y permite el intercambio de informacin entre muchos
dispositivos a una velocidad aceptable, de unos 100 Kbits por segundo, aunque hay casos especiales
en los que el reloj llega hasta los 3,4 MHz.
La metodologa de comunicacin de datos del bus I2C es en serie y sincrnica. Una de las seales del
bus marca el tiempo (pulsos de reloj) y la otra se utiliza para intercambiar datos.
SCL (System Clock) es la lnea de los pulsos de reloj que sincronizan el sistema.
SDA (System Data) es la lnea por la que se mueven los datos entre los dispositivos.
GND (Masa) comn de la interconeccin entre todos los dispositivos "enganchados" al bus.
Las lneas SDA y SCL son del tipo drenaje abierto, es decir, un estado similar al de colector abierto,
pero asociadas a un transistor de efecto de campo. Se deben polarizar en estado lo que define una
estructura de bus que permite conectar en paralelo mltiples entradas y salidas.







Fig. 1 Comunicacin I2C
COMUNICACIN I2C Y SPI

1

Las dos lneas del bus estn en un nivel lgico alto cuando estn inactivas. En principio, el nmero de
dispositivos que se puede conectar al bus no tiene lmites, aunque hay que observar que la
capacidad mxima sumada de todos los dispositivos no supere los 400 pF. El valor de los resistores
de polarizacin no es muy crtico, y puede ir desde 1K8 (1.800 ohms) a 47K (47.000 ohms). Un valor
menor de resistencia incrementa el consumo de los integrados pero disminuye la sensibilidad al
ruido y mejora el tiempo de los flancos de subida y bajada de las seales. Los valores ms comunes
en uso son entre 1K8 y 10K.
Protocolo de comunicacin del bus I2C
Habiendo varios dispositivos conectados sobre el bus, es lgico que para establecer una
comunicacin a travs de l se deba respetar un protocolo. Digamos, en primer lugar, lo ms
importante: existen dispositivos maestros y dispositivos esclavos. Slo los dispositivos maestros
pueden iniciar una comunicacin.
La condicin inicial, de bus libre, es cuando ambas seales estn en estado lgico alto. En este
estado cualquier dispositivo maestro puede ocuparlo, estableciendo la condicin de inicio (start).
Esta condicin se presenta cuando un dispositivo maestro pone en estado bajo la lnea de datos
(SDA), pero dejando en alto la lnea de reloj (SCL).
El primer byte que se transmite luego de la condicin de inicio contiene siete bits que componen la
direccin del dispositivo que se desea seleccionar, y un octavo bit que corresponde a la operacin
que se quiere realizar con l (lectura o escritura).
Si el dispositivo cuya direccin corresponde a la que se indica en los siete bits (A0-A6) est presente
en el bus, ste contesta con un bit en bajo, ubicado inmediatamente luego del octavo bit que ha
enviado el dispositivo maestro. Este bit de reconocimiento (ACK) en bajo le indica al dispositivo
maestro que el esclavo reconoce la solicitud y est en condiciones de comunicarse. Aqu la
comunicacin se establece en firme y comienza el intercambio de informacin entre los dispositivos.
Si el bit de lectura/escritura (R/W) fue puesto en esta comunicacin a nivel lgico bajo (escritura), el
dispositivo maestro enva datos al dispositivo esclavo. Esto se mantiene mientras contine
recibiendo seales de reconocimiento, y el contacto concluye cuando se hayan transmitido todos los
datos.
En el caso contrario, cuando el bit de lectura/escritura estaba a nivel lgico alto (lectura), el
dispositivo maestro genera pulsos de reloj para que el dispositivo esclavo pueda enviar los datos.
Luego de cada byte recibido el dispositivo maestro (quien est recibiendo los datos) genera un pulso
de reconocimiento. El dispositivo maestro puede dejar libre el bus generando una condicin de
parada
Si se desea seguir transmitiendo, el dispositivo maestro puede generar otra condicin de inicio en
lugar de una condicin de parada. Esta nueva condicin de inicio se denomina "inicio reiterado" y se
puede emplear para direccionar un dispositivo esclavo diferente o para alterar el estado del bit de
lectura/escritura.
PIC 16F887
Puerto Serie Sncrono Maestro (MSSP)
Soporta los modos SPI e I2C
Puerto esclavo: 8 bits + 3 bits de control
Se trabaja con los Pin_18 y Pin_23


COMUNICACIN I2C Y SPI

2




CONFIGURACIONES

Para este tipo de comunicacin se emplea la directiva.
#use I2C
En la que se establecen las condiciones de la trasmisin como velocidad, pines del bus en el PIC,
direccin del PIC esclavo, etc.

Por ejemplo, en este caso:
#use I2C(SLAVE, SDA=PIN_C4 , SCL=PIN_C3, SLOW, ADDRESS=0xa0)
Se est indicando que se establece al PIC como esclavo (SLAVE) , el pin C4 es la linea SDA del bus , el
pin C3 es la linea SCL, se utiliza la velocidad de transmisin baja (SLOW) y la direccin como esclavo
ser A0h.
COMUNICACIN I2C Y SPI

3

En el caso del PIC maestro, en la directiva se indica MASTER en lugar de SLAVE, y se ignora la opcin
ADDRESS:
#use I2C(MASTER, SDA=PIN_C4 , SCL=PIN_C3, SLOW)
Para enviar la informacin con el PIC maestro empleamos este grupo de instrucciones:

i2c_start(); //Comienzo de la comunicacin I2C ...
i2c_write(0xa0); //...con la direccin del PIC esclavo...
i2c_write(tecla); // Enva dato
i2c_stop(); //Finalizacin de la transmisin

Para saber cuando el PIC esclavo recibe informacin utilizamos la funcin i2c_poll(). Esta funcin
devuelve un "TRUE" (valor 1) cuando se ha recibido el dato en el buffer. Comprobando su estado
ciclicamente sabremos cuando hay que procesar la informacin recibida. El dato recepcionado lo
podremos recuperar con la funcin i2c_read().

if(i2c_poll())
{ // Si se ha recibido informacin...
dato=i2c_read(); //...la guarda en la variable "dato"
}

La lnea de datos SDA y la lnea de seal de reloj SCL del bus, son lneas a colector abierto. Esto
implica que se deben utilizar resistencias externas o pull-up que aseguren el estado alto cuando no
haya dispositivos conectados al bus. Si no fueran usadas, las lneas podran encontrarse en un
momento dado en un estado indeterminado. Si uno de los componentes del bus intenta poner la
lnea en estado bajo a la vez que otro en estado alto, esto llevara a conflicto al bus y podra daar a
los componentes.
Los valores tpicos de estas resistencias pueden ser, a modo de orientacin, de 4k7 para velocidades
del bus inferiores o en torno a 100kbps, de 2k2 para velocidades alrededor de 100kbps y de 1k para
velocidades en torno a 400kbs o superiores.
EJEMPLO

MASTER
#include <16F887.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)

#define SLAVE1_WRT_ADDR 0x12
COMUNICACIN I2C Y SPI

4

#define SLAVE1_READ_ADDR 0x13

//====================================
void main()
{
int8 data;

while(1)
{
i2c_start();
i2c_write(SLAVE1_READ_ADDR);
data = i2c_read(0);
i2c_stop();

printf("temp %d \n\r", data);

delay_ms(1000);
}

}
Esclavo
#include <16F887.h>
#device adc=10
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x12)

int8 adc_result;

#INT_SSP
void ssp_interrupt()
{
int8 incoming, state;

state = i2c_isr_state();

if(state < 0x80) // Master is sending data
{
incoming = i2c_read();
}

if(state >= 0x80) // Master is requesting data from slave
{
i2c_write(adc_result);
}
}
//======================================
void main ()
{
setup_adc_ports( ALL_ANALOG );
COMUNICACIN I2C Y SPI

5

setup_adc(ADC_CLOCK_DIV_4);
set_adc_channel(0);
delay_us(20);
adc_result = read_adc();
adc_result = adc_result*0.48828125;

enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);

while(1)
{
adc_result = read_adc();
adc_result = adc_result*0.48828125;
delay_ms(500);
}

}





















COMUNICACIN I2C Y SPI

6

ANEXOS



BIBLIOGRAFA
[1] http://robots-argentina.com.ar/Comunicacion_busI2C.htm
[2] http://www.ccsinfo.com/forum/viewtopic.php?t=47984
[3] http://robotypic.blogspot.com/2010/10/comunicacion-via-i2c-entre-dos-pic.html

Das könnte Ihnen auch gefallen