Intento iniciar la comunicación i2c en dspic33fj128gp802, pero no puedo escribir en el bit SEN del registro I2CxCON

1

Buenas noches, Estaba intentando iniciar la comunicación con el I2C en mi foto. Por el momento solo establezco los bits en el registro de control en el código y la inicialización de los pines y el PLL, y descubrí que los 4 bits más bajos (RCEN, PEN, RSEN y SEN) no se podían escribir. Como no puedo escribir en el bit SEN, el reloj no se inicia. Además, estoy configurando el registro para que el dispositivo funcione como maestro.

Aquí está mi código:

int main(void)
{
InitOsc();
InitPin();
InitTimer4();
InitTimer5();   


MCUinit();  //initialization MLX

//enable I2c
I2C1CONbits.I2CEN=1;    
I2C1CONbits.I2CSIDL=0; //continues operation in idle
I2C1CONbits.SCLREL=1; // releases clock
I2C1CONbits.IPMIEN=0;   //ipmi should be disabled when operating as master
I2C1CONbits.A10M=0; // slave address are 7-bits
I2C1CONbits.DISSLW=1;   //slew rate control bit enabled
I2C1CONbits.SMEN=0; //disables smbus imput threshold (!!)
I2C1CONbits.ACKDT=0;
I2C1CONbits.ACKEN=1;

// Apparently no effect from here on! If I set a breakpoint here and track
// the variables none of these are on even for a single clock cycle!
I2C1CONbits.RCEN=1;
I2C1CONbits.PEN=1;
I2C1CONbits.RSEN=1; 
I2C1CONbits.SEN=1;

return 0;
}

¿Hay algo que estoy haciendo mal? Soy un principiante con este microcontrolador, por lo que cualquier explicación sería de utilidad.

Probé el canal SCL con un osciloscopio y nada sale de eso, solo permanece en una señal plana de 0V.

¡Gracias!

    
pregunta Giulia DL

1 respuesta

1

En primer lugar, el módulo I2C del microcontrolador PIC no admite la cola de comandos (por lo tanto, el comentario de Brhans). Debe verificar que la última operación se completó antes de comenzar la siguiente operación.

e.x. (tenga en cuenta que los nombres de registro de los indicadores de interrupción deberán volver a comprobarse para este PIC ya que se adaptó de otro código de PIC)

//Pre clear the intterupt flag
IFS1bits.MI2C1IF = 0;

//Send the start condition
I2C1CONbits.SEN = 1;

//Wait for the start condition to complete
while (!IFS1bits.MI2C1IF);
IFS1bits.MI2C1IF = 0;

//Send the I2C address
I2C1TRN = I2C_ADDR;

//Wait for the send to complete and check that the node acknowledged
while (!IFS1bits.MI2C1IF);
IFS1bits.MI2C1IF = 0;

if (I2C1STATbits.ACKSTAT)
    return 0; //ERROR, node did not acknowledge!!!

...

En segundo lugar, como Majenko señaló correctamente, no parece configurar el generador de velocidad en baudios (I2C1BRG). Puede estar en un estado no válido donde el módulo I2C no puede completar una operación con éxito.

    
respondido por el Mathieu L.

Lea otras preguntas en las etiquetas