En el previo post se definió como leer en la interfaz I2C bytes simples desde la Raspberry Pico 2 utilizando el sistema Zephyr RTOS. En algunas situaciones se necesita realizar el la lectura via autoincremento (lectura consecutiva) del artefacto esclavo conectado a la linea I2C. Aquí se muestra la modificación necesaria para implementar este método en la linea I2C,
#define CONFIG_I2C_RTIO_LOOPBACK_DATA_WRITE_MAX_SIZE 1
#define CONFIG_I2C_RTIO_LOOPBACK_DATA_READ_MAX_SIZE 14
#define I2C_TARGET_ADDR 0x69
static const struct device *scan_dev = DEVICE_DT_GET(DT_ALIAS(scan_i2c));
static uint8_t sample_write_data[CONFIG_I2C_RTIO_LOOPBACK_DATA_WRITE_MAX_SIZE];
static uint8_t sample_read_data[CONFIG_I2C_RTIO_LOOPBACK_DATA_READ_MAX_SIZE];
static uint8_t sample_read_buf[sizeof(sample_read_data)];
uint8_t david_digikey_coffee_cup_zephyr_i2c_read_autoinc(uint8_t slave_address, uint8_t address)
{
sample_write_data[0] = address;
sample_read_buf[0] = 0x00;
struct i2c_msg msgs[2];
msgs[0].buf = sample_write_data;
msgs[0].len = sizeof(sample_write_data);
msgs[0].flags = I2C_MSG_WRITE;
msgs[1].buf = sample_read_buf;
msgs[1].len = sizeof(sample_read_buf);
msgs[1].flags = I2C_MSG_RESTART | I2C_MSG_READ | I2C_MSG_STOP;
int ret = i2c_transfer(scan_dev, msgs, ARRAY_SIZE(msgs), slave_address);
if (ret) {
return -EIO;
}
return ret;
}
En este caso el CONFIG_I2C_RTIO_LOOPBACK_DATA_READ_MAX_SIZE fue cambiado a 14 bytes necesario para nuestro demo como se muestra previamente (6 bytes para el acelerómetro MEMS, 6 bytes del giroscopio MEMS y 2 bytes para el sensor de temperatura interno del ASIC.)
El Sensor TDK ICM-20948 vía Qwiic de Sparkfun es el que es usado en este caso para demonstrarlo. Usando esta configuración descrita aquí.
El Sparkfun 8-channel USB Logic Analyzer previamente descrito aqui Techforum article fue conectado como se muestró en la siguiente foto anteriormente usinand estos cables Qwiic para monitorear la linea I2C usando PIN6 (SDA), PIN7 (SCL) (I2C Port 0) y el PIN 38 (GND) en la Raspberry Pico 2 to the TDK ICM-20948 Sensor Qwiic Platform Evaluation Expansion Board from Sparkfun.
LA siguiente figura, muestra la captura del Sparkfun 8-channel USB Logic Analyzer confirmando la operación apropiada en la linea I2C de autoincremento en la función de lectura de 14 bytes en el registro 0x2D del sensor esclavo con dirección I2C de 0x69 en Zephyr OS dentro del Raspberry Pico 2
La correspondiente función de autoincremento de escribir se puede crear similarmente cambiando el número de bytes que se escriben la linea I2C desde el controlador I2C como se mostró previamente. Que tenga un buen díá.
Este artículo está disponible en idioma inglés aquí.
This article is available in english here.
