PIC18LF24K40 Problema I2C

0

Tengo un problema al ver las señales SCL y SDA en el osciloscopio. Estoy usando PIC18LF en modo maestro y el bus se detiene a Vcc. Creo que he programado correctamente, pero todo lo que veo es de 3.3 V en las líneas SDA y SCL del osciloscopio.

¡No puedo averiguar dónde he cagado!

Aquí está mi código:

//i2cdem.c


void init_oscillator(void)
{
    // NOSC HFINTOSC; NDIV 1; 
    OSCCON1 = U8_SET_HFINTOSC_NDIV_1;
    // CSWHOLD may proceed; SOSCPWR Low power; 
    OSCCON3 = 0x00;
    // TUN 0; 
    OSCTUNE = 0x00;

    OSCEN   = 0x00;                   // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
    OSCFRQ  = U8_NOMINAL_CLK_FRQ_8M;  // Setting OSCFRQ register to 0x03 --> 8MHz

}

void set_I2C_baud_rate(unsigned int freq_KHZ)
{    
    volatile unsigned int F=8000;
    volatile unsigned int temp=0; 
    temp = 80;
    temp -= 4;
    temp /= 4;
    //temp=( (Fosc/freq_KHZ) - 4)/4 ; 
    SSP1ADD = temp;      
}
void I2C_Inititalise()
{
    SSP1CON1       = 0x28;  //I2C Mode
    PORTCbits.RC3    = 1; //SCL
    PORTCbits.RC4    = 1; //SDA

    TRISCbits.TRISC3 =0;
    TRISCbits.TRISC4 =0;

    TRISCbits.TRISC3 =1;
    TRISCbits.TRISC4 =1;

    LATCbits.LATC3 = 1;
    LATCbits.LATC4 = 1;


    SSP1CON2       = 0x00; 

    SSP1STAT       = 0x80;   
//    SSP1BUF =( (U8_LDC_ADD<<1) | 0x00 );
}

void send_start()
{
    SSP1CON2bits.SEN=1;
    while(SSP1CON2bits.SEN);   

}

void send_stop(){

    SSP1CON2bits.PEN=1;
    while(SSP1CON2bits.PEN);

}

void I2C_wait(void)
{
    while( (SSP1STAT & 0x04) | (SSP1CON2 & 0x1F) );
    PIR3bits.BCL1IF=0;

}


void write_to_bus(unsigned char data)
{
    SSP1BUF = data;


}



//main.c
    void main(void) {

        init_oscillator();

        I2C_Inititalise();

        set_I2C_baud_rate(100); //set SCL to 100KHz


        while(1){

            send_start();
            I2C_wait();
            write_to_bus(U8_LDC_ADD<<1); //Address
            I2C_wait();
            send_stop();


        }



        return;
    }
    
pregunta Abel Tom

2 respuestas

1

El problema no fue la configuración de registros PPS en la inicialización para el módulo I2C.

Mencionado en el Capítulo PPS

  

Salidas PPS   Cada pin de E / S tiene un registro PPS con el que el pin   Se selecciona la fuente de salida. Con pocas excepciones, el puerto.   El control TRIS asociado con ese pin retiene el control   sobre el controlador de salida de pin. Periféricos que controlan la   controlador de salida de pin como parte de la operación periférica será   anular el control TRIS según sea necesario. Estas   los periféricos incluyen:   • EUSART (operación síncrona)   • MSSP (I2C)

Y, no configurando registro ANSELC. Tuve que borrar explícitamente los bits ANSELC para que funcionara. En realidad lo descubrí por accidente cuando estaba configurando Recibir interrupción, lea una nota en la hoja de datos que estaba en una esquina.

  

Nota: Si la función RX / DT está en un pin analógico,   el bit ANSEL correspondiente debe ser   autorizado para que el receptor funcione.

Parecía funcionar para USART, así que también lo probé para I2C. Tardé solo unos días en resolverlo, pero ahora veo las formas de onda SDA y SCL correspondientes. :)

void I2C_Inititalise()
{

    ANSELCbits.ANSELC3 =0;
    ANSELCbits.ANSELC4 =0;

    RC3PPS         = 0x0D; //PPS OUTPUT CLK  
    RC4PPS         = 0x0E; //PPS OUTPUT SDA 

    SSP1CLKPPS     = 0x13; //PPS INPUT CLK
    SSP1DATPPS     = 0x14; //PPS INPUT SDA 

    SSP1CON1       = 0x28;  //I2C Mode
    SSP1CON2       = 0x00; 
    SSP1STAT       = 0x00;   
    SSP1ADD        = 0x04;
}
    
respondido por el Abel Tom
0

Creo que el problema es que en la función I2C_Inititalise no establece los pines SCL / SDA en entradas después de configurar el modo I2C en el registro SSP1CON1, pero antes.

De la hoja de datos

  

26.8.3 PINS SDA Y SCL

     

Selección de cualquier modo I2C con el conjunto de bits SSPEN,   obliga a los pines SCL y SDA a desagüe abierto. Estas   los pines deben ser ajustados por el usuario a las entradas configurando el   bits TRIS apropiados.

Simplemente mueva todas las líneas de código de PORT / TRIS / LAT después de configurar el SSP1CON1 y debería estar bien.

    
respondido por el nickagian

Lea otras preguntas en las etiquetas