PIC18LF24K40 I2C lee y escribe usando el método de sondeo

0

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.

    
pregunta Abel Tom

2 respuestas

0

Cargue los valores de prueba en una MCU ficticia e intente simular con la suite de diseño Proteus, pero estoy de acuerdo con Buhra en verificar la señal de la recepción exitosa del esclavo y, si es posible, comprobar las señales necesarias que indican un búfer libre y listo para la transmisión estado.

    
respondido por el user166718
-1
unsigned char read_from_slave(void)
{  
    unsigned char rcvd_byte=0;   
   <----------- Check Flag ------------>
    rcvd_byte = SSP1BUF;     
    return rcvd_byte;    
}

En esta función, no verifica ningún indicador para una recepción exitosa del esclavo, verifique nuevamente la hoja de datos

    
respondido por el Bhura

Lea otras preguntas en las etiquetas