ESP32 调试SHT20踩的坑

ESP32介绍

esp32 是乐鑫出品的双核处理器,自带wifi和蓝牙,用于IOT领域,更多详情参考乐鑫官网

 

SHT20介绍

sht20 是一款温湿度传感器,广泛用于物联网行业,使用I2C通信协议

 

I2C介绍

2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。下面我们分别对 I2C协议的物理层及协议层进行讲解。

ESP32带硬件I2C,只要调用相关API即可,用起来非常简单。

 

问题

按照正常的协议进行调试,一直在读数据上出问题,使用了多种方式都不行

 

仔细检查SHT20的ds,发现如下说明:

ESP32 调试SHT20踩的坑

进行数据测量的时候,未准备好的时候,没有ACK返回,这个时候就会失败。知道原因后处理就方便多了,这块等待知道读取到数据

/**
 * @brief read data
 * @param 
 *      sensor
 *      tp
 *      rh
 * @retval
 *      ESP_OK:
 *      ESP_ERR:
 */
esp_err_t iot_sht20_get_data(sht20_handle_t sensor, float* tp, float* rh)
{
    uint8_t data[3];
    sht20_dev_t* sens = (sht20_dev_t*) sensor;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    uint16_t tmp;
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (sens->dev_addr << 1) | WRITE_BIT, ACK_CHECK_EN);
     if (tp)
        i2c_master_write_byte(cmd, TEMP_MASUREMENT, ACK_CHECK_EN);
    if (rh)
        i2c_master_write_byte(cmd, HUMI_MASUREMENT, ACK_CHECK_EN);
    i2c_master_stop(cmd);
    int ret = iot_i2c_bus_cmd_begin(sens->bus, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
    if (ret == ESP_FAIL) {
        ESP_LOGE(TAG, "SNED WRITE ERROR\n");
        return ESP_FAIL;
    }
    do {
        // ets_delay_us(200 * 1000);
        vTaskDelay(100 / portTICK_PERIOD_MS);
        cmd = i2c_cmd_link_create();
       
        i2c_master_start(cmd);
        i2c_master_write_byte(cmd, (sens->dev_addr << 1) | READ_BIT, ACK_CHECK_EN);
    
        i2c_master_read(cmd, data, 2, ACK_VAL);
        i2c_master_read_byte(cmd, &data[2], NACK_VAL);
        i2c_master_stop(cmd);
        ret = iot_i2c_bus_cmd_begin(sens->bus, cmd, 1000 / portTICK_RATE_MS);
        i2c_cmd_link_delete(cmd);
         if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "SEND READ ERROR \n");
         }
    }while (ret != ESP_OK);

    tmp = (data[0] << 8) | (data[1]<<0);
    tmp &= ~0x0003;
    if (rh) {
        *rh = ((float)tmp * 0.00190735)-6;
    }
    if (tp) {
        *tp =  ((float)tmp * 0.00268127)-46.85;
    }
    return ESP_OK;
}