Problema I2C leyendo RA8875 usando TM4C123

1

He estado trabajando con el protocolo I2C para crear un código para el RA8875 (vea para I2C en página 67) usando una placa Tiva ( TM4C123 , capítulo I2C de la página 997), y Puedo pintar en la pantalla o escribir texto, pero tengo problemas cuando quiero leer un valor de un registro.

Por lo que pude leer sobre I2C, entiendo que el proceso debe ser como sigue:

  1. Envíe un comando de escritura, especificando la dirección del registro
  2. Envíe un comando de lectura, para que la pizarra lea los datos del registro

El código que utilizo para la lectura I2C es el siguiente:

unsigned char lcd_read(unsigned char data,short I2C)
{
    unsigned char response;
    switch(I2C)
    {
        case I2C0:
        {
            while(I2C0_MCS_R&I2C_MCS_BUSBSY);
            I2C0_MSA_R |=0x0E;  //Specify the slave address of the touch screen and that the next operation is a write command
            I2C0_MDR_R=data;    // Register address
            I2C0_MCS_R=0x03;    // (START, RUN)
            if(I2C0_MCS_R&I2C_MCS_ERROR)    //Check the ERROR bit in the I2CMCS register to confirm the transmit was acknowledged.
            {

            }
            I2C0_MSA_R |=0x0F;  //Specify the slave address of the touch screen and that the next operation is a read
            I2C0_MCS_R=0x07;    // (STOP, START, RUN)
            while(I2C0_MCS_R&I2C_MCS_BUSBSY);   //Wait until the transmiI2Con completes by polling the I2CMCS register's BUSBstart_Y bit until it has been cleared.
            response = I2C0_MDR_R&0xFF;
            if(I2C0_MCS_R&I2C_MCS_ERROR)    //Check the ERROR bit in the I2CMCS register to confirm the transmit was acknowledged.
            {

            }
            break;
        }
    }
    return response;
}

Otra cosa que me sucedió es que lo que puedo ver en los registros (yo uso Code Composer Studio para la codificación y depuración) no se corresponde con los datos obtenidos mediante un analizador de protocolos (es decir, el contenido del registro I2C_MDR). Probablemente esta podría ser una pregunta aparte pero, ¿cuál puede ser la razón de ello?

Editar : las siguientes imágenes muestran cómo se transmiten los datos. Los datos de lectura deben ser 0x81 en lugar de 0x00:

I2C escribe para registrarse:

I2Cleedelregistroutilizandoelcódigoanterior:

Gracias por tu ayuda.

    
pregunta Javier

2 respuestas

1

Estaba revisando mi código y encontré los siguientes errores:

  1. La dirección del esclavo no debe configurarse mediante una operación OR, por lo que, por ejemplo, debe ser I2C0_MSA_R = 0x0E en lugar de I2C0_MSA_R | = 0x0E

  2. La dirección del esclavo para la lectura debe ser 0x0D en lugar de 0x0F

  3. El registro debe leerse después de un rato, como se sugiere @ robogeek78.

El siguiente código es válido:

unsigned char lcd_read(unsigned char data,short I2C)
{
    unsigned char response;
    switch(I2C)
    {
        case I2C0:
        {
            while(I2C0_MCS_R&I2C_MCS_BUSBSY);
            I2C0_MSA_R=0x0E;  //Specify the slave address of the touch screen and that the next operation is a write command
            I2C0_MDR_R=data;    // Register address
            I2C0_MCS_R=0x03;    // (START, RUN)
            if(I2C0_MCS_R&I2C_MCS_ERROR)    //Check the ERROR bit in the I2CMCS register to confirm the transmit was acknowledged.
            {

            }
            I2C0_MSA_R=0x0D;  //Specify the slave address of the touch screen and that the next operation is a read
            I2C0_MCS_R=0x07;    // (STOP, START, RUN)
            while(I2C0_MCS_R&I2C_MCS_BUSBSY);   //Wait until the transmiI2Con completes by polling the I2CMCS register's BUSBstart_Y bit until it has been cleared.
            response = I2C0_MDR_R&0xFF;
            if(I2C0_MCS_R&I2C_MCS_ERROR)    //Check the ERROR bit in the I2CMCS register to confirm the transmit was acknowledged.
            {

            }
            break;
        }
    }
    return response;
}
    
respondido por el Javier
1

No he usado el chip TM4 que está llamando, sin embargo, ¿está seguro de que el código escrito indica el inicio repetido correctamente?

También, la causa probable, suponiendo que la transacción es correcta, es que no debería estar leyendo el registro I2C0_MDR_R antes de confirmar que la transacción se completa. así que mueva esa línea justo después de su while(I2C0_MCS_R&I2C_MCS_BUSBSY);

    
respondido por el robogeek78

Lea otras preguntas en las etiquetas