Módulo I2C

Autor : Pierre Launay

per.launay en free.fr

El bus I2C es un bus serie sincrono desarollado por Philips

Descripción del bus I2C aqui

Entender el bus I2C aqui

Aqui se muestran las funciones para poder trabajar con el módulo I2C Maestro Interno de los PIC.

Antes de usar este módulos se debe definir la frecuencia usada con el comando.

	#define FOSC_HZ 4000000
	#include <i2c.h>
		

Se han realizado algunas definiciones como:

	#define I2C_400K	i2c_find_frec(400000)	//frecuencia de 400Khz
	#define I2C_100K	i2c_find_frec(100000)	//frecuencia de 100Khz
	#define I2C_40K		i2c_find_frec(40000)	//frecuencia de 40Khz
	#define I2C_10K		i2c_find_frec(10000)	//frecuencia de 10Khz
	#define I2C_4K		i2c_find_frec(4000)	//frecuencia de 4Khz
	#define I2C_1K		i2c_find_frec(1000)	//frecuencia de 1Khz
		

Estas definiciones pueden ser usandas en la función init_i2c

i2c_init

Configura el puerto Serie sincrono

	void i2c_init(unsigned char SPEED_I2C);
		

SPEED_I2C es el registro SSPADD, reloj_I2C=FOSC_HZ/(4*(SSPADD+1))

i2c_wait_for_idle

Espera a que el bus esté libre

	void i2c_wait_for_idle(void);
		

i2c_start

principio de trama, secuencia de inicio

	void i2c_start(void);
		

i2c_restart

Devolver una trama, fin de trama y principio de trama permite poner dos tramas para leer . Ver i2c_read()

Ejemplo para leer las segundas en una trama :

Principio de trama (start), escribir la dirección del circuito I2C, escribir el registro de las segundas,

Devolver una trama (restart), escribir la dirección del circuito I2C, leer el registro de las segundas.

fin de trama (stop)

	void i2c_restart(void);	
		

i2c_stop

fin de trama, secuencia de parada

	void i2c_stop(void);
		

i2c_delay

Tiempo de espera entre fin de trama y principio de trama >=4.7 us (Frecuencia Reloj SCL = 100KHz)

	void i2c_stop(void);
		

i2c_ack_read

recepción del pulso de reconocimiento

	unsigned char i2c_ack_read (void);
		

"0" buena recepción

"1" mala recepción

i2c_ack_write

emisión. del pulso de reconocimiento

	void i2c_ack_write(unsigned char ack);
		

"0" la trama puede continuar

"1" la trama se para

i2c_write

el maestro escribe en el esclavo el caracter c, el caracter c puede ser una dirección, una registro interno, un dato

	void i2c_write(unsigned char c);
		

i2c_write_with_ack

El maestro escribe el caracter c en el esclavo y remite el reconocimiento (ack).

Esta rutina junta i2c_write(c) y reception_ack()

	unsigned char i2c_write_with_ack(unsigned char c) ;
		

i2c_read

El maestro lee el caracter enviado por el esclavo

	unsigned char i2c_read(void);
		

i2c_read_with_ack

el maestro lee el caracter enviado por el esclavo y envia el reconocimiento (ack).

	unsigned char i2c_read_with_ack(unsigned char ack);
		

Ejemplo de Módulo I2C

para compilar necesitas los siguientes comandos

Ejemplo de compilacion : ./compila.sh ej_i2c 16f877a
		

ej_i2c.c

	int main(void)
	{
		return 0;
	}