Você está na página 1de 17

Comunicação I2C

• É uma comunicação serial síncrona


• Regime Mestre/escravo
• Pode trabalhar a velocidades na ordem de Mbps
• Usa 2 pinos: Dado e clock
• Normalmente usada para comunicar com dispositivos
periféricos presentes na mesma placa tais como:
conversores A/D, memórias flash, sensores diversos
(temperatura,umidade,luminosidade,etc), RTC
(relógio de tempo real), etc
Exemplo de aplicação: TMP100
• Sensor digital de temperatura com interface
I2C
• Range: -55 a 128°C
• Resolução: 9 a 12 bits(configurável)
• Suporta até 400KHz de clock em modo fast
(dafult) ou até 3,4MHz em modo high speed
TMP100

Pino Função
SCL Clok (entrada)
GND Terra (entrada)
ADD1 Bit 1 do endereço (entrada)
V+ Alimentação (entrada)
ADD0 Bit 0 do endereço (endereço)
SDA Dado (entrada e saída)
Endereçamento do TMP100
Estrutura interna (TMP100 e TMP101)
Ponteiro de registro
Registro de configuração

Bit
SM ShutDown Mode (usado para economia de energia)
TM Thermostat Mode (usado apenas no TMP101)
POL Polaridade do pino de alerta (usado apenas no TMP101)
F0 Bit0 do contador de faltas
F1 Bit1 do contador de faltas
R0 Bit0 de configuração de resolução
R1 Bit1 de configuração de resolução
OS One shoot ou alerta
Registro de temperatura
Ciclos de escrita
Ciclo de leitura
Comandos para I2C
#use I2C(configuração)//configura o i2c

i2c_start();  //inicializa comunicação
i2c_write (byte);//envia um byte
variável= i2c_read();//recebe um byte
i2c_stop(); //finaliza comunicação
Rotina para configuração do sensor TMP100 com 12 bits de
resolução

void configura_sensor(){
i2c_start();
i2c_write(0x90); //1001 000 0 endereço + bit de escrita
i2c_write(0x01); //aponta do registro de configuração
i2c_write(0x60); //valor da configuração para 12 bits de resolução
i2c_write(0x00); //segundo byte (não aplicado para configuração)
i2c_stop();
}
Rotina para ler a temperatura no sensor TMP100
float le_temperatura(){
int byte1,byte2;
int16 tempd;
float tempf;
i2c_start();
i2c_write(0x90);//1001 000 0 endereço + bit de escrita
i2c_write(0x00);//aponta do registro de temperatura
i2c_start(); //ack do mestre
i2c_write(0x91);//1001 000 1 endereço + bit de leitura
byte1=i2c_read();// recebe byte1 [b11 b10 b9 b8 b7 b6 b5 b4]
byte2=i2c_read();// recebe byte2 [b3 b2 b1 b0 0 0 0 0]
i2c_stop();
...continua
...continuação
byte2=byte2>>4; //rotaciona 4 bits para a direita
tempd=byte1; // joga o byte1 em tempd
tempd=tempd<<4;//rotaciona 4 bits para a esquerda
tempd=tempd+byte2; //joga o byte2 em tempd
tempf=tempd; // joga o valor digital na variável float
if(bit_test(tempd,11)){ // avalia se é negativo (complemento de 2)
tempf=tempf-4096;
tempf=tempf*128; //calculo temperatura
tempf=tempf/2048; //calculo temperatura
}
else{
tempf=tempf*128; //calculo temperatura
tempf=tempf/2047; //calculo temperatura
}
return tempf;
}
Exemplo 1
• Fazer um programa que mostra a temperatura no
display e a envia pela RS232, com 3 casas decimais,
em °C, °F e K

K=°C+273,15
9
 F  * C  32
5
Exemplo 2
• Capturar a temperatura a cada 100ms e enviar
para o computador em °C com 3 casas
decimais. Plotar gráfico no Excel

Você também pode gostar