Controlador Harmony i2c de PIC32MX

0

Tengo un pequeño problema para descubrir cómo funciona el controlador Harmon i2c. Tratar de establecer una conexión entre PIC32 y un sensor barométrico MS5637 ha sido una pesadilla para mí.

Desde la hoja de datos del sensor en la página 9 podemos ver que hay una secuencia de reinicio y después que un simple baile leyó. A continuación puede ver qué estoy tratando de hacer, pero no estoy del todo seguro de qué debo hacer para que esta comunicación funcione.

Usando MHC, el controlador i2c se inicializa dentro de System Initialize y luego está el código de mi aplicación.

void send(uint8_t cmd){

    //Start i2c
    DRV_I2C0_MasterStart();

    //Write address write
    DRV_I2C0_ByteWrite(0xEC);
    DRV_I2C0_WaitForByteWriteToComplete();

    //Write command
    DRV_I2C0_ByteWrite(cmd);
    DRV_I2C0_WaitForByteWriteToComplete();

    //Stop i2c
    DRV_I2C0_MasterStop();

}

uint16_t readPROM(uint8_t cmd){
    uint16_t value;

    //Send Prom address
    send(cmd);

    //Start i2c
    DRV_I2C0_MasterStart();

    //Write address read
    DRV_I2C0_ByteWrite(0xED);
    DRV_I2C0_WaitForByteWriteToComplete();

    //Byte read MSB
    DRV_I2C0_WaitForReadByteAvailable();
    value = 256 * DRV_I2C0_ByteRead ();
    DRV_I2C0_MasterACKSend();

    //Byte read LSB
    DRV_I2C0_WaitForReadByteAvailable();
    value = DRV_I2C0_ByteRead();
    DRV_I2C0_MasterNACKSend();

    //Stop i2c
    DRV_I2C0_MasterStop();

    return value;
}

void APP_Tasks ( void ){
    //Reset command
    send(0x1E);
    ShortDelay( 3000 ); //3 ms

    //Read prom
    uint8_t i;
    for (i=0;i<8;i++){
        readPROM(0xA0 + i * 2 );
    }
}

La respuesta siempre es 0x00, pero debería ser algo diferente a eso.

Olvidé mencionar que al enviar cualquier tipo de comando en las líneas i2c, la corriente aumenta en el sensor. ¿Esto significa que el sensor está respondiendo?

Si pudiera faltar algo obvio, por favor, avíseme, porque es la primera vez que utilizo el i2c.

    
pregunta Nejc Okorn

2 respuestas

2

Después de mucho tiempo de depurar mi propio código, comencé a depurar el controlador estático I2C de Harmony y noté que dentro de DRV_I2C0_MasterACKSend y DRV_I2C0_MasterNACKSend es una comprobación como

void DRV_I2C0_MasterACKSend(void)
{
    if(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_1))
        PLIB_I2C_ReceivedByteAcknowledge (I2C_ID_1, true);

}

y todo lo que tienes que hacer es cambiar el if statement a while loop

void DRV_I2C0_MasterACKSend(void)
{
    /* Check if receive is ready to ack */
    while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_1));
    PLIB_I2C_ReceivedByteAcknowledge (I2C_ID_1, true);

}

Noté que en el protocolo del controlador estático I2C hay un botín de espera (bucle) y me temo que el programa principal se bloqueará en algunos de esos bucles para algunos casos de escenario

    
respondido por el Nejc Okorn
2

Además, DRV_I2C0_WaitForReadByteAvailable () es una comparación sin bloqueo, por lo que con su implementación puede que le resulte más útil envolverla con un bucle while, para convertirse

while (! DRV_I2C0_WaitForReadByteAvailable ());

Esto esperará lo suficiente para que se cumpla la condición, y su lectura será exitosa.

    
respondido por el Will

Lea otras preguntas en las etiquetas