Lecturas I2C de múltiples bytes STM8

-2
u8 i2c_read_register(u8 mem_address, u8 *data_read)
{
    u8 temp = 0;
    u8 ack = 0;
    u8 device_address = (IQS_ADDR << 1);
    u8 polling_attempt = 0;

    // send address
    ack = i2c_send_byte(device_address);
#ifdef POLLING
    while ((ack) && (polling_attempt < POLLING_ATTEMPTS))
    {
        i2c_wait();
        i2c_wait();
        i2c_start();
        ack = i2c_send_byte(device_address);
        polling_attempt++;
    }
#endif
    if (!ack)
    {
        i2c_send_byte(mem_address);
        i2c_repeat_start();
        device_address = (IQS_ADDR << 1) | 0x01;
        ack = i2c_send_byte(device_address);
        temp = i2c_read_byte(1);
        (*data_read) = temp;
    }

    return ack;
}
  • Notas Para leer dos Byes necesito llamar a la función como esta:

    i2c_read_register (DEBUGGING_EVENTS, & data_buffer [1], 2);

Con (2) representando el Número de Bytes. Pero como la función está de pie, solo toma dos argumentos, no tres.

    
pregunta mChad

2 respuestas

1

En el paquete de software para la placa de evaluación stm8 hay un proyecto de ejemplo que utiliza un eeprom en serie que puede leer varios bytes.

software de ejemplo SEE

    
respondido por el rfkortekaas
0

Después de horas de intentar modificar el código, finalmente logré obtener los dos bytes especificados de mi función i2c_read_register ().

u8 i2c_read_register(u8 register_address, u8 *data_read, u8 NumbOfBytes)
{
    u8 i;
    u8 temp = 0;
    u8 ack = 0;
    u8 device_address = (IQS_ADDR << 1);
    u8 polling_attempt = 0;

    // send address
    ack = i2c_send_byte(device_address);
#ifdef POLLING
    while ((ack) && (polling_attempt < POLLING_ATTEMPTS))
    {
        i2c_wait();
        i2c_wait();
        i2c_start();
        ack = i2c_send_byte(device_address);
        polling_attempt++;
    }
#endif
    if (!ack)
    {
        i2c_send_byte(register_address);
        i2c_repeat_start();
        device_address = (IQS_ADDR << 1) | 0x01;
        ack = i2c_send_byte(device_address);
        //temp = i2c_read_byte(1);
        //(*data_read) = temp;
        if(NumbOfBytes > 1)
        {
            for(i = 0; i < NumbOfBytes -1; i++)
            data_read[i] = i2c_read_byte(0);
        }
        data_read[i] = i2c_read_byte(1);
    }

    return ack;
}

Todo lo que se necesitaba, era agregar un bucle para aumentar el número de bytes para que los usuarios los ingresen con la variable NumbOfBytes u8.

Y tú llamas a la función como esta:

i2c_start();
i2c_read_register(DEBUGGING_EVENTS, &data_buffer[0], 2);
i2c_stop();                 
events = data_buffer[0];    // Main Events  1st Byte
movement = data_buffer[1];  // Debugging Events 2nd Byte
    
respondido por el mChad

Lea otras preguntas en las etiquetas