Esp32 i2c comando de lectura no produce señal de reloj

0

Estoy intentando leer la temperatura de un sensor SHT21 usando una placa ESP32-WROOM. El controlador I2C es de ESP-IDF SDK. Esta es mi secuencia de lectura:

cmd = i2c_cmd_link_create();
i2c_master_start(cmd);                              // Send i2c start on bus
i2c_master_write_byte(cmd, (I2C_ADD<<1) | I2C_MASTER_WRITE, 1);
i2c_master_write_byte(cmd, command, 1);

i2c_master_start(cmd);
i2c_master_write_byte(cmd, (I2C_ADD<<1) | I2C_MASTER_READ, 1);
i2c_master_read_byte(cmd, data+0, 1); // data MSB
i2c_master_read_byte(cmd, data+1, 1); // data LSB
i2c_master_read_byte(cmd, &checksum, 1); // CRC
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);

Según la grabación de mi analizador lógico, puedo decir que todos los comandos de escritura se ejecutan correctamente. Sin embargo, no hay reloj para leer la respuesta del sensor. La línea CLK permanece baja durante otros 41 ms.

Entonces, ¿dónde está el reloj para leer la respuesta? ¿Estoy usando el controlador I2C incorrectamente? ¿El retardo de 41 ms producido por el sensor se debe al estiramiento del reloj? ¿Pero no debería entonces el ESP32 continuar con el reloj de lectura después? ¿Me estoy perdiendo algo más?

Gracias por todas las respuestas!

    
pregunta Jaka Kordež

1 respuesta

1
  

Sin embargo, no hay reloj para leer la respuesta del sensor. La línea CLK permanece baja durante otros 41 ms.

RTFM (o SHT21 fechado en este artículo ). El comando E3 es el modo "mantener maestro"; la hoja de datos dice explícitamente:

  

la línea SCL está bloqueada (controlada por el sensor) durante el proceso de medición

Todo lo normal en tu analista lógico se ha disparado arriba.

  

¿Pero no debería el ESP32 continuar con el reloj de lectura después?

Depende de cómo se implementa I²C, y si el alargamiento del reloj es realmente compatible. Es posible que algunas implementaciones TWI no admitan el alargamiento del reloj esclavo.

Tenga en cuenta que el tiempo muerto de 41 ms también podría activar el perro guardián.

Recomiendo probar el modo maestro sin retención con un acceso de lectura adecuadamente programado, es decir, 85 ms para el 14% bit_de% y 29 ms para el 12 T según la hoja de datos.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas