Aula de programação C – 17

17. PRÁTICA 17: COMUNICAÇÃO I2C SLAVE

Referencial Teórico: Modos de Comunicação I2C; Módulo MSSP.

Objetivo: Preparar um dispositivo Escravo para comunicação no barramento e protocolo I2C.

Materiais: Utilizar botão e led presentes na placa. A prática necessita da ligação física entre placas.

17.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	led_vermelho = 1;

	configura_i2c_slave();

	while(1)
	{
		recebe_i2c();
		if (data == 64) led = 1;
		if (data == 68) led = 0;
	}
}

17.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h
//http://bradthx.blogspot.com.br/2011/11/pic18f-c18-implemented-i2c-slave.html

int addr;
int data;

void configura_i2c_slave(){
	OpenI2C( SLAVE_7, SLEW_OFF);
	SSPADD = 0xB0; //SSPADD contains I2C device address in SLAVE mode
}

//SSPBUF : Serial TX/RX data buffer.
//PIR1bits.SSPIF : Interrupt flag bit. This will be 1 when data is received into SSPBUF
//SSPSTATbits.BF : SSPBUF buffer full status bit. 1 = full, 0 = empty.
//SSPSTATbits.D_A : Data / Address bit. When receiving it indicates what the data received was. 0 = address, 1 = data.

void recebe_i2c(void) {
	if ( PIR1bits.SSPIF == 1 && SSPSTATbits.BF == 1 && SSPSTATbits.D_A == 0 )
	PIR1bits.SSPIF = 0;
	addr = SSPBUF;
	SSPSTATbits.BF = 0;
	
	if ( PIR1bits.SSPIF == 0 && SSPSTATbits.BF == 0 && SSPSTATbits.D_A == 1 )
	data = SSPBUF;
	PIR1bits.SSPIF = 0; //clear interrupt
	SSPSTATbits.D_A = 0; //set D_A bit to 0 so that we can check if the subsequent byte is more data.
}