Você está na página 1de 7

Curso para microcontroladores PIC Linguagem C

______________________________________________________________________

Protocolo de comunicao I2C


O protocolo I2C (Inter-Integrated Circuit) do tipo serial sncrono e foi desenvolvido
originalmente pela Philips em meados da dcada de 1990. Atualmente ele est
presente em uma srie de dispositivos eletrnicos e componentes dos mais variados
tipos como: microcontroladores, controladores de LCD, memrias, dispositivos de I/O,
relgios de tempo real (RTC),entre outros.
As vantagens deste tipo de comunicao so muitas e dentre elas podemos citar:
Barramento de simples controle: mestre / escravo (master/slave) com
endereamento resolvido via software ou hardware;
Interface de comunicao interna ao dispositivo, o que facilita o uso deste;
Permite a ligao de dispositivos com tenses de alimentao diferentes graas as
vias de comunicao tipo open drain;
Excelente taxa de comunicao (velocidade): 100 kbps no modo Standard, 400 kbps
no modo Fast e at 3,4 Mbps no modo High Speed;
Modo de comunicao sncrono, o que permite que dispositivos de velocidades
diferentes sejam conectados ao mesmo barramento usando a taxa de comunicao do
dispositivo de menor velocidade;
Boa imunidade a rudos eltricos;
Flexibilidade no barramento para incluso (ou excluso) de um dispositivo escravo
sem afetar os demais de mesma natureza;
etc.
Porm, nem tudo so flores e o padro I2C tambm possui algumas desvantagens:
Nmero de dispositivos ligados a um mesmo barramento limitados a 128 dispositivos
no modo normal (bits para endereamento) ou 1024 dispositivos no modo estendido
(10 bits no endereamento);
O barramento, devido s suas caractersticas eltricas, no pode percorrer grandes
distncias ficando estas limitadas ao circuito principal.
O barramento deve ser utilizado para comunicao entre dispositivos inseridos
internamente em um equipamento e nunca externamente (em alguns casos esta regra
pode ser quebrada, desde que o cabo e a distncia sejam pequenas: > 2 metros);
Devido ao modo de comunicao mestre / escravo, a rede no pode ser
compartilhada com vrios dispositivos se comunicando ao mesmo tempo. Toda e
qualquer comunicao sempre feita entre o mestre e o escravo sendo esta iniciada
sempre pelo dispositivo mestre.

Apesar disso, o protocolo I2C excelente para uso na comunicao entre dispositivos
como um microcontrolador (elemento mestre) e alguns dispositivos como: memrias
,RTCs, controladores de I/O, etc (dispositivos escravos). Fica bvio que a realizao do
projeto ser simplificada, pois o padro de comunicao entre os vrios dispositivos
ser o mesmo e o barramento usado tambm.

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________

Comunicao:
O protocolo I2C do tipo sncrono de 2 linhas, sendo uma linha de clock (SCL) e outra
de dados (SDA).
O princpio de funcionamento o seguinte:
-A informao na linha de dados (SDA) somente ser lida quando a linha de clock (SCL)
est em nvel alto;
-Somente ser permitido alterar o nvel da linha de dados quando a linha de clock est
em seu nvel baixo;
-Ambas as linhas permanecem desligadas quando o barramento no est em uso, ou
seja, permanecem em nvel lgico 1.
Para iniciar uma transmisso (condio de incio, START), o dispositivo leva a linha SDA
de 1 para 0 e para finalizar uma transmisso, utilizada uma condio de parada, ou
STOP que consiste na transio de 0 para 1 da linha SDA.
Aps o bit de START, so transmitidos 8 bits de dados, iniciando pelo bit mais
significativo e aps o ltimo bit, o receptor deve gerar uma condio de
reconhecimento (acknowledge), cujo processo se d forando a linha SDA em 1
durante o nono pulso do clock. Caso o receptor no reconhea o dado, o transmissor
deve abortar e reiniciar a transmisso.
Para que diversos dispositivos funcionem adequadamente em uma mesmo
barramento, necessrio que cada um possua uma identificao ou endereo prprio.

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________
O formato bsico da identificao ou endereamento de um dispositivo I2C
constitudo por 7 bits seguidos de um bit indicador de leitura ou escrita.
O formato de endereamento de 7 bits, geralmente composto por duas partes, ou
seja, os 4 bits mais significativos indica o tipo do dispositivo a ser acessado e os 3 bits
menos significativos seguintes informa um entre 8 dispositivos daquele determinado
tipo.
O primeiro bit indica uma operao de leitura (1) ou de escrita (0).
Abaixo temos uma tabela com alguns valores de endereos predefinidos para alguns
tipos de dispositivos.

Endereo
0010xxxx
0011xxxx
0100xxxx
0111xxxx
1000xxxx
1001xxxx
1010xxxx
1101xxxx
1100xxxx

Significado
Sintetizadores de Voz
Interfaces de udio PCM
Geradores de tons de udio
Displays LED/LCD
Interfaces de vdeo
Interfaces A/D e D/A
Memrias seriais
Relgios / Calendrios
Sintonizadores de RF

Comunicao I2C utilizando o compilador CCS


Para utilizarmos a comunicao I2C utilizando o compilador CCS, vamos construir
alguns arquivos baseados em memrias do tipo EEPROM. Conforme j comentado,
existem vrios dispositivos que utilizam este protocolo de comunicao como relgios
de tempo real, sensores de temperatura, alguns LCDs, etc.
Veja tambm que utilizaremos um arquivo 2404.c que ser integrado ao projeto,
para isso, interessante buscarmos este programa que se encontra na pasta C:
\Arquivos de Programas\PICC\Drivers e copi-lo na pasta onde est o nosso projeto.
Este arquivo criado pela CCS e trata sobre a memria EEPROM 24c04.c. Nesta mesma
pasta, podemos encontrar vrios arquivos para outras Memrias com capacidades
diferentes, tais como 24C02, 24C08 e outras.
Podemos ver este arquivo logo depois do arquivo principal.
Vamos fazer um projeto para escrevermos o cdigo 0x43 (cdigo ASCII referente ao
caractere C) no endereo 0x10 da EEPROM.

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________
Circuito utilizado para o projeto:

Definies do Projeto:
-Nome do Projeto: I2C
-Arquivo
: I2C.c

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________
#include<16F877A.h>

//Aqui incluso o header (*.h) para o microcontrolador


//utilizado.
#use delay (clock=8000000) //Aqui definimos a frequncia do cristal para clculo dos
//delays
#fuses HS, NOWDT, PUT, BROWNOUT, NOLVP //Configurao dos fusveis
#include "LCD8B.c"
#include "2404.c"

//Inclui o arquivo LCD8B.C


//Inclui o arquivo 2404.c

void main()
{
byte rd;

//Varivel que receber o valor lido da memria

lcd_ini();
init_ext_eeprom();

//Inicia o LCD
//Inicia a comunicao I2C

printf(lcd_escreve,"\f PIC16F877A"); //Escreve a mensagem na primeira linha do LCD


printf(lcd_escreve,"\n EEPROM Test"); //Escreve a mensagem na segunda linha do LCD
delay_ms(1500);
write_ext_eeprom(0x10,0x43);

//Atraso de 1500 ms
//Escreve no endereo 0x10 da memria EEPROM

printf(lcd_escreve,"\fEscrevendo: 0x43"); //Escreve a mensagem na primeira linha do


//LCD
printf(lcd_escreve,"\nAguarde...");
//Escreve a mensagem na segunda linha do LCD
delay_ms(1000);
rd = read_ext_eeprom(0x10);

//Atraso de 1000 ms
//Faz a leitura no endereo 0x10 da EEPROM e
//armazena o valor lido na varivel rd

printf(lcd_escreve,"\fLeitura em 0x10:"); //Escreve a mensagem na primeira linha do


//LCD
printf(lcd_escreve,"\n%x",rd);
//Escreve o contedo lido na segunda linha
while(TRUE);

//Loop principal

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________
Arquivo 2404.c
#ifndef EEPROM_SDA
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#endif
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE 512
void init_ext_eeprom()
{
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
}
BOOLEAN ext_eeprom_ready()
{
int1 ack;
i2c_start();
// If the write command is acknowledged,
ack = i2c_write(0xa0); // then the device is ready.
i2c_stop();
return !ack;
}
void write_ext_eeprom(long int address, BYTE data)
{
while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_write(data);
i2c_stop();
}
BYTE read_ext_eeprom(long int address)
{
BYTE data;
while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))|1);
data=i2c_read(0);

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Curso para microcontroladores PIC Linguagem C


______________________________________________________________________
i2c_stop();
return(data);
}

ACEPIC Tecnologia e Treinamento Ltda www.acepic.com.br

Você também pode gostar