Muy buenas chicos
Nuevamente consultandolos, estoy intentando trabajar con el PIC16F88, en modo esclavo, a 100Khz, programando en C, con CCS, con un cristal de 4Mhz, intento leer de el un dato simple, un byte de un arreglo
Mi problema es que pareciera que aunque entra en la interrupcion, no esta operando como deberia, al maestro (PIC18F46K22) siempre le llega un 0xFF
He leido muchos de los post, y aplicado lo que dicen pero ciertamente no estoy logrando que funcione.
El maestro funciona con un cristal de 20Mhz, lei en un post que podria deberse a que no operan a la misma frecuencia el maestro y el esclavo, aplique los delays recomendados, los incremente, los disminui, y nada, siempre llega el 0xFF
Las resistencias de pull-up, son de 10K
Coloque un led en el pin A1 del esclavo (16F88) y lo hago encender al entrar a la rutina de interrupcion del SSP, pues, entra, y enciende el led, pero de ahi en mas, no hace nada, no se puede leer nada del esclavo, y en el maestro obtengo siempre un 0xFF (255)
mi directiva I2C para el esclavo la he modificado varias veces, segun lo que he leido, en particular un post que decia que si colocaba el FORCE_HW no funciona, pues en mi caso, lo he quitado, lo he puesto y siempre se enciende el led en la rutina de interrupcion, pero no se lee nada de el, solo un fantastico.......0xFF

Les coloco las partes de codigo relevantes del maestro y del esclavo, las que tienen que ver con el I2C
Fuses, frecuencia de reloj y directiva I2C en el maestro:
#include<18f46k22.h>
#fuses HSH,NOPLLEN,PRIMARY_ON,NOWDT,PUT,NOBROWNOUT,NOPBADEN,MCLR,PROTECT,NOLVP,NOSTVREN,NODEBUG
#use delay(crystal=20000000)
//****************Directivas de perifericos*******************************************
#use i2c(MASTER,SCL=PIN_C3,SDA=PIN_C4,SLOW=100000,FORCE_HW,STREAM=i2c_maestro)
Rutina de lectura que ejecuta el maestro:
i2c_start(i2c_maestro); //Inicio comunicacion
delay_ms(1);
i2c_write(i2c_maestro,0x99); //Escribo direccion del esclavo
delay_ms(1);
i2c_write(i2c_maestro,0); //Escribo la posicion que quiero leer del esclavo
delay_ms(1);
i2c_start(i2c_maestro); //Reinicio el protocolo
delay_ms(1);
i2c_write(i2c_maestro,0x9A); //Escribo direccion del esclavo + 1 (para lectura)
delay_ms(1);
dato=i2c_read(i2c_maestro,0); //Leo la posicion previamente enviada
i2c_stop(); //Detengo la comunicacion
delay_ms(200);
Fuses, frecuencia de reloj y directiva I2C en el esclavo (esta entendido que habilito la interrupción del I2C):
#include<16f88.h>
#fuses MCLR,XT,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NODEBUG,NOFCMEN,NOIESO,PROTECT
#use delay(crystal=4000000)
//****************Directivas de perifericos*******************************************
#use i2c(SLAVE,SCL=PIN_B4,SDA=PIN_B1,ADDRESS=0x99,SLOW=100000,FORCE_HW,STREAM=sensor)
Funcion de interrupcion para el esclavo (SSP):
//Interrupcion por recepcion de I2C
#INT_SSP
void recepcion_i2c(void)
{
unsigned int8 incoming, state;
output_high(PIN_A1);
state = i2c_isr_state(sensor);
if(state < 0x80) //Master is sending data
{
if(state == 0)
{
}
if(state == 1) //First received byte is address
{
incoming = i2c_read(sensor);
address = incoming;
//fprintf(uart_maestro,"direccion: %u\n",address); //solo para debug
}
else if(state >= 2 && state != 0x80)
{ //Received byte is data
incoming=i2c_read(sensor);
buffer[address] = incoming;
//fprintf(uart_maestro,"dato recibido: %u\n",buffer[address]);
}
}
if(state >= 0x80) //Master is requesting data
{
i2c_write_slave(sensor,buffer[address]);
}
}
Como se puede apreciar, en la funcion de interrupcion del esclavo, coloque unos fprintf, para ver si realmente llegaba a ese punto, y jamas los ejecuta, ni una sola ves. peroooooo, siempre enciende el led, y siempre recibo en mi maestro, el 0xFF
La verdad es que nunca habia tenido la necesidad de leer datos por I2C, desde un PIC como esclavo, escribirlo si, y sin problemas (este modelo el 16F88 no, pero si otros PIC) por lo que no se si estoy omitiendo algun paso, ojala alguien que si pudo implementar la comunicacion con este PIC, me pueda echar una mano.
Tambien revise el erradata del PIC, y para mi desgracia, si tiene un problema con repetidas ejecuciones de la condicion de Start, pero espero que alguien me pueda decir que lo usa sin problema

Saludos y pendiente de sus comentarios