Вы находитесь на странице: 1из 11

Ing. Robinson Jimnez M.

I
2
C

I
2
C es un protocolo de comunicacin serie diseado por Philips que se utiliza esencialmente entre dispositivos
que pertenecen al mismo circuito, por ejemplo, sensores con un microcontrolador.

Caractersticas del protocolo:
Velocidad standard de 100Kbit/s. Modo de alta velocidad a 400Kbit/s
Configuracin maestro/esclavo. La direccin del esclavo se configura con software o prefijable por
hardware.
Al ser serial utiliza dos lneas de comunicacin:
o SDA (Serial Data Line): Lnea de datos.
o SCL/CLK (Serial Clock Line): Lnea de reloj, ser el que marque el tiempo de RW
(Lectura/Escritura)
Las lneas SDA y SCL van a su pin correspondiente en cada dispositivo, de manera que todos
quedan en paralelo, estas se encuentran independientemente conectadas a dos resistores
Pull-Up que se encargaran de que el valor lgico siempre sea alto a no ser que un dispositivo
lo ponga a valor lgico bajo.
Los comunicacin siempre tiene la estructura siguiente:
o Transmisor: Byte de datos (8 Bits)
o Receptor: Bit ACK de confirmacin. Este bit es una respuesta del receptor al transmisor
permite conocer si el transmisor ha sido escuchado.
Cuando se est leyendo de un esclavo, si el master realiza un ACK, es decir, que responde; el
esclavo pasa al siguiente valor de registro y lo enva tambin, hasta recibir un NACK (Not
Acknowledge), es decir, ninguna respuesta del maestro.
La estructura de la comunicacin bsica es la siguiente:

1. START condition (Master)
2. 7 Bits de direccion de esclavo (Master)
3. 1 Bit de RW, 0 es Leer y 1 Escribir. (Master)
4. 1 Bit de Acknowledge (Slave)
5. Byte de direccin de memoria (Master)
6. 1 Bit de Acknowledge (Slave)
7. Byte de datos (Master/Slave (Escritura/Lectura))
8. 1 Bit de Acknowledge (Slave/Master (Escritura/Lectura))
9. STOP condition (Master)



Ing. Robinson Jimnez M.

LIBRERA I2C.H
AckI2C
Funcin sin parmetros de entrada ni salida que genera una condicin de Acknowledge en el bus de
comunicacin (aceptacin de dato transmitido).
CloseI2C
Funcin sin parmetros de entrada ni salida que termina o cierra el mdulo SSP del que depende el I2C (fin del
uso del modulo de comunicacin en el programa del micro.)
DataRdyI2C
Funcin con parmetro de retorno tipo char que valida si el buffer del I2C posee un dato disponible, si esta
disponible retorna un 1 sino retorna un 0, permite validar si el dato esta listo para ser utilizado en el programa.
getsI2C
Funcin que lee y fija el tamao de la cadena de datos ledos del bus I2C en modo MASTER, retorna un cero si
los datos fueron enviados completamente y un uno si hubo una colisin.
Esquema : unsigned char getsI2C( unsigned char variable, unsigned char tamao );
Permite capturar consecutivamente y por medio de un arreglo un grupo de bytes.
IdleI2C
Funcin sin parmetros de entrada ni salida que genera un loop si el bus I2C no esta disponible, permite evitar
colisiones si hay una transmisin en curso
NotAckI2C
Funcin sin parmetros de entrada ni salida que genera una condicin de NotAcknowledge en el bus de
comunicacin, es decir si el dato no se recibi completo o si se finaliz la comunicacin.
OpenI2C
Funcin con parmetros de entrada que abre o configura el mdulo SSP del que depende el I2C.
Esquema: void OpenI2C( unsigned char modo, unsigned char slew );
Donde el modo esta dado por las opciones: SLAVE_7 SLAVE_10 para modo esclavo a 7 o 10 bits de
direcciones. MASTER para modo maestro del I2C .
SLEW_OFF para transmisin a 100 kHz,SLEW_ON para 400 kHz
putcI2C
Funcin con parmetro de retorno que pone o escribe una cadena de datos al bus I2C
Esquema: unsigned char putsI2C(unsigned char variable );
En modo maestro el valor de retorno es 0 si el carcter es nulo o vacio, -2 si el modulo esclavo responde con
NOT ACK, -3 si ocurri una colisin.
En modo esclavo el valor de retorno es 0 si el carcter es nulo o vacio, -2 si el modulo maestro responde con
NOT ACK con una terminacin de transferencia de datos.
ReadI2C/getcI2C
Lee un byte sencillo desde el bus I2C
RestartI2C
Reinicia el protocolo I2C
StartI2C
Inicializa el protocolo I2C
StopI2C
Detiene el protocolo
WriteI2C/putcI2C
Escribe un dato sencillo de un byte en el bus I2C, retorna un 0 si se transmite exitosamente y un -1 si se
presenta una colisin



Ing. Robinson Jimnez M.
MEMORIA I2C


Ing. Robinson Jimnez M.














Ing. Robinson Jimnez M.
Almacenar el valor 125 en la posicion de memoria 312.
Posmem=312D=138H=0x0138=>PH=0x01, PL=0x38

#include <p18f4550.h>
#include <i2c.h>
void main(){
ADCON1=15;TRISB=0;
OpenI2C(MASTER,SLEW_OFF);//inicializa micro en I2C como maestro en velocidad de 100Kb/so
//*******************************************************
while(1){
StartI2C();
while (SSPCON2bits.SEN);
WriteI2C( 0XA0 );
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x01);//direcciona parta alta de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x38); //direcciona parta baja de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C (125);
IdleI2C(); //se espera hasta que el modulo quede inactivo
} }
}
StopI2C();
while (SSPCON2bits.PEN);
}}


Almacenar una cadena de caracteres en una memoria I2C
#include <p18f4550.h>
#include <i2c.h>
const rom char *envdatos="PRUEBA I2C MEM. ";
void main(){
ADCON1=15;TRISB=0;
OpenI2C(MASTER,SLEW_OFF);//inicializo modulo
//*******************************************************
while(1){
StartI2C();
while (SSPCON2bits.SEN);
WriteI2C( 0XA0 );
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x00);//direcciona parta alta de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x00); //direcciona parta baja de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
while (*envdatos) { // se envian los datos hasta encontrar un caracter nulo
WriteI2C (*envdatos);
IdleI2C(); //se espera hasta que el modulo quede inactivo
envdatos++; } }
} }
StopI2C();
while (SSPCON2bits.PEN);
Ing. Robinson Jimnez M.
}}



Leer la cadena de caracteres almacenada en el programa anterior sobra la memoria I2C
#include <p18f4550.h>
#include <i2c.h>
void main(){int a[15];int b=0;
ADCON1=15;TRISB=0;
OpenI2C(MASTER,SLEW_OFF);//
//*******************************************************
while(1){
StartI2C();
while (SSPCON2bits.SEN);
WriteI2C( 0XA0 );
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x00);//direcciona parta alta de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x00); //direcciona parta baja de la memoria
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
StopI2C();
while (SSPCON2bits.PEN);
StartI2C();
while (SSPCON2bits.SEN);
WriteI2C( 0XA1 );
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
for(b=0;b<15;b++){
a[b]=ReadI2C();IdleI2C();}
StopI2C();
while (SSPCON2bits.PEN);
}}}}
}
}
Ing. Robinson Jimnez M.




RELOJ EN TIEMPO REAL RTC




Ing. Robinson Jimnez M.





Ing. Robinson Jimnez M.
#include <p18f4550.h>
#include <xlcdPD.h>
#include <delays.h>
#include <i2c.h>
void DelayFor18TCY( void ){Delay10TCYx(2);}
void DelayPORXLCD(void){Delay1KTCYx(15); }
void DelayXLCD(void){Delay1KTCYx(5); }
void main(){char escrdatos[8];int i,a,b;
TRISC = 0X18;
ADCON1=15;
OpenXLCD(FOUR_BIT & LINES_5X7);
WriteCmdXLCD (0x0c);
putrsXLCD("DS1307 RTC ");Delay10KTCYx(100);
OpenI2C(MASTER,SLEW_OFF);
//*******************************************************
while(1){
StartI2C();
while (SSPCON2bits.SEN);
WriteI2C( 0XD0 );
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x00);
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x16);
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0X07);
IdleI2C();
if (!SSPCON2bits.ACKSTAT){
WriteI2C(0x09);
IdleI2C();
}}}}
StopI2C();
while (SSPCON2bits.PEN);
RestartI2C();
while (SSPCON2bits.RSEN);
WriteI2C(0XD1);
IdleI2C();
getsI2C(escrdatos,8); } }
StopI2C();
while (SSPCON2bits.PEN);
WriteCmdXLCD(1);
putrsXLCD("HORA: ");WriteDataXLCD(escrdatos[2]+0X30);
WriteDataXLCD(0X3A);
b=escrdatos[1]&240;b=b>>4;
WriteDataXLCD(b+0X30);
a=escrdatos[1]&15;WriteDataXLCD(a+0X30);
SetDDRamAddr(0x40);
putrsXLCD("FECHA :");
b=escrdatos[4]&240;b=b>>4;WriteDataXLCD(b+0X30);a=escrdatos[4]&15;WriteDataXLCD(a+0X30);
WriteDataXLCD(0X2F);WriteDataXLCD(escrdatos[5]+0X30);WriteDataXLCD(0X2F);
i=escrdatos[6]&240;i=i>>4;
WriteDataXLCD(i+0X30);i=escrdatos[6]&15;WriteDataXLCD(i+0X30);Delay10KTCYx(100);
StopI2C();
while (SSPCON2bits.PEN); }}

Ing. Robinson Jimnez M.

OTROS DISPOSITIVOS
SHT25-PROTEUS

Ing. Robinson Jimnez M.

Вам также может понравиться