Hola de nuevo compañeros:
Después de muchas horas de simulaciones y prubas, otras tantas buscando por la red (lo cual no encontré nada de nada) y otras tantas chapandome el datasheet del micro y los registros...lo he conseguido
Código del maestro
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_HW)
void main(void)
{
delay_ms(1000); //retardo, por si no se ha iniciado el esclavo
while(TRUE)
{
i2c_start();
i2c_write(0xA0);//direccion del esclavo con el que haremos la comunicacion, A6 A5 A4 A2 A1 A0 R/W -> R/W = 0 modo escritura; 1 modo lectura
i2c_write('H');
i2c_write('O');
i2c_write('L');
i2c_write('A');
i2c_stop(); //finalizacion de la comunicacion
delay_ms(1000);
}
}
Código del esclavo
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(SLAVE, SDA=DISPLAY_SDA, SCL=DISPLAY_SCL, ADDRESS=0xA0, FORCE_HW, FAST)//FAST, FORCE_HW
...
...
#byte SSPSTAT = 0xFC7
#bit BFBIT=SSPSTAT.0
#bit STARTBIT=SSPSTAT.3
#bit STOPBIT=SSPSTAT.4
#byte SSPCON1=0xFC6
...
...
BYTE address, bufferI2C[32];
#INT_SSP
void i2c_isr() {
BYTE state;
state = i2c_isr_state();
if(state < 0x80) //Maestro está enviando datos
{
//Para SSPCON1 = 0x3E;//0b00111110;//Si no se pone esta registro así no entra aquí para el bit de start y de stop
if (state == 0) //O bien es el bit de start o es el Address
{
if (!BFBIT) //Si no hay datos, el BFBIT=0 y por tanto es el START, el STARTBIT está a 1 en toda la trama menos cuando se eleva el STOPBIT
{
//Si ponemos antes el i2c_read(); vaciaremos el buffer y por BFBIT se pondrá a cero y no sabremos si es el address o el BITSTART
printf("0");
}
else
{
address = i2c_read();
printf("1");
}
}
else if (state > 0) //Más bytes recividos, es data
{
if(!STOPBIT)
{
bufferI2C[state-1] = i2c_read();
printf("%c",bufferI2C[state-1]);
}
else
{
//Entra aqui si es el bit de stop, fin de trama de datos
printf("2");
SSPSTAT=0x00; //Reseteamos el registro...no me digais...el compilador no lo hace solo con SSPCON1=0b00111110
}
}
}
if(state == 0x80) //Master esta requiriendo datos
{
// received a START + ( I2C_ADR | 1)
// i2c_write(data) must be used to write a byte
i2c_write(0x05);
printf("3");
}
if(state > 0x80) //Master esta requiriendo datos
{
// master has read the byte sent by the slave.
// i2c_write(data) must be used to write a byte
printf("4");
}
}
...
...
void main(void) {
SSPCON1 = 0x3E;//0b00111110;
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
while (TRUE)
{
}
}
Al final de esto vemos como cada segundo se muestra en el terminal un 01HOLA2...al cabo de 2 segundo 01HOLA201HOLA2... de 3 segundos 01HOLA201HOLA201HOLA2...
Bueno muchachos espero que les sirva...creo que es un buen aporte para esta nuestra comunidad
...que bien se siente uno...que después de 2 dias luchando más de 15 horas y después se consigue lo que uno se propone...eso si con mucho sudor y esfuerzo y todo lo que aprende uno luchando contra la naturaleza del PIC
Lo dicho, espero que os sirva a todos.
un saludete.