Estoy intentando implementar rutinas de lectura y escritura utilizando el método de sondeo para un PIC18LF24K40, la escritura parece funcionar, pero no leer. No puedo entender lo que estoy haciendo mal.
EDITAR: leer un byte almacenado en un registro en un chip esclavo:
void read_LDC_reg(U8 *dest_addr)
{
U8 temp=0;
if( ( check_for_bus_free_iic() == 1) )
send_start();
PIR3bits.SSP1IF=0;
I2C_wait();
send_address(U8_LDC_I2C_ADDRESS,READ_BIT);
send_start();
SSP1CON2bits.RCEN1=1;
while(SSP1STATbits.BF==0);
temp=read_from_slave();
PIR3bits.SSPIF = 0;
dest_addr = &temp;
send_stop();
}
send_start()
tiene este aspecto:
void send_start()
{
while(SSP1STATbits.RW); // wait for write to complete
SSP1CON2bits.SEN=1; //set start enable bit
if(PIR3bits.BCLIF==1)
PIR3bits.BCLIF =0; //Clear collision bit in PIR register
while(SSP1CON2bits.SEN); //waits to get cleared by hardware
}
I2C_wait
tiene este aspecto:
void I2C_wait(void)
{
while( (SSP1STAT & 0x04) | (SSP1CON2 & 0x1F) );
PIR3bits.BCL1IF=0;
}
send_address()
tiene este aspecto:
void send_address(unsigned char addr,unsigned char ReadWrite_bit)
{
unsigned char temp=0;
temp = ( (addr <<1u ) | (ReadWrite_bit & (unsigned char)0x01) );
write_to_bus(temp);
}
write_to_bus()
tiene este aspecto:
void write_to_bus(unsigned char data)
{
send_start();
I2C_wait();
send_byte(data);
I2C_wait();
send_stop();
}
read_from_slave()
tiene este aspecto:
unsigned char read_from_slave(void)
{
unsigned char rcvd_byte=0;
rcvd_byte = SSP1BUF;
return rcvd_byte;
}
Obtengo valores inesperados del registro esclavo, no sé por qué creo que se haya inicializado correctamente, puedo ver las formas de onda SCL y SDA en el osciloscopio.
EDITAR: el hardware está bien, I2C funciona perfectamente cuando uso el código del controlador I2C generado desde MCC (generador de código MPLAB), quiero reducir los gastos generales causados por MCC en mi proyecto, esa es la motivo por el que voy para I2C usando la opción de sondeo.