Hola a todos.
Me hallo en la imposibilidad de programar el i2c para transmitir, por lo que recurro a ustedes a ver si son capaces de hacerme ver la luz. La idea es controlar un expansor de i2c a 16 bits con dicho programa, pero actualmente es indiferente su uso y estoy intentando probar en el proteus su funcionamiento antes de probarlo en el dispositivo. El problema que tengo es que me salen mensajes de error de colision en la condicion de inicio y a continuacion todo lo enviado en ignorado. Les adjunto el codigo de la funcion de configuracion, asi como la funcion de envio. Agradezco cualquier tipo de solucion o idea que puedan aportarme, ya que llevo dias sin pasar de aqui.
El pic es el 18f2455, la velocidad de trabajo del pic es de 10MHz, queriendo que el i2c trabaje a 100kHz y el pic sera el maestro. El lenguaje utilizado es PICC.
void conf_i2c(void)
{
PIE1 = 0x08; // Activo la interrupcion del MSSP con prioridad alta
IPR1 = 0x08;
SMP = 1;
SSPADD = 0x18;
SSPCON1 = 0x28;
SSPCON2 = 0x00;
}
void escribe_i2c (unsigned char registro, unsigned char dato)
{
SEN = 1; //condicion de START
while (int_i2c == 1); //esperemo a que MSSP este listo para escribir datos
SSPBUF = 0x40; //direccion del LCD
while (int_i2c == 2); //esperemo a que MSSP este listo para escribir datos
SSPBUF = registro; //direccion del registro a escribir
while (int_i2c == 3); //esperemo a que MSSP este listo para escribir datos
SSPBUF = dato; //direccion del dato a colocar
while (int_i2c == 4); //esperemo a que MSSP este listo para escribir datos
PEN = 1; // condicion de STOP
while (int_i2c == 5); //esperemo a que MSSP este listo para escribir datos
int_i2c = 0;
}
El hecho de que no realice ninguna espera a flag de ocupacion BF, es que si no tengo mal entendido, la interrupcion se genera una vez que el bus de datos ha sido liberado y BF ha sido borrado por hardware. La variable int_i2c lo unico que hace es contar interrupciones del bloque i2c, que me ayudaran a saber en que parte de la trama del expansor me encuentro, para saber que dato he de enviar.
Bueno, creo que mas o menos lo he explicado, si algo no ha quedado claro, diganmelo y lo contestare lo mas rapido posible.
Muchas gracias. Espero que alguien pueda echarme una mano.