idf 4.4.4 版本
程序内容:
1先对所有地址扫描 打印出连接设备的地址
2在给i2c发送0xFD(为sht40:以高精度(高重复性)测量T&RH[2*8位T数据的指令)读取6位数据然后解析。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "esp_log.h"
#include "driver/i2c.h"
#define I2C_MASTER_SCL_IO 22 // I2C专用时钟线GPIO
#define I2C_MASTER_SDA_IO 21 // I2C专用数据线GPIO
#define I2C_MASTER_NUM I2C_NUM_0 // I2C总线号
#define I2C_MASTER_FREQ_HZ 100000 // I2C总线频率
static const char *TAG = "I2C scanner";
void i2c_scanner_task(void *arg)
{
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = I2C_MASTER_SDA_IO;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = I2C_MASTER_SCL_IO;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
i2c_param_config(I2C_MASTER_NUM, &conf);
i2c_driver_install(I2C_MASTER_NUM, I2C_MODE_MASTER, 0, 0, 0);
printf("Scanning I2C bus...\n");
for (int address = 0x03; address <= 0x77; address++)
{
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_WRITE, true);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 100);
if (ret == ESP_OK)
{
printf("Device found at address 0x%02X\n", address);
}
i2c_cmd_link_delete(cmd);
vTaskDelay(10);
}
ESP_LOGI(TAG, "I2C Master Initialized");
uint8_t c=0xFD;
while (1)
{
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (0x44 << 1) | I2C_MASTER_WRITE, true);
i2c_master_write(cmd, &c,1, true);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "%dI2C write failed", ret);
}
vTaskDelay(50);
uint8_t a[6] = {0, 0, 0, 0, 0, 0};
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (0x44 << 1) | I2C_MASTER_READ, true);
for (int i = 0; i < 6; i++)
{
i2c_master_read_byte(cmd, &a[i], I2C_MASTER_ACK);
}
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000);
i2c_cmd_link_delete(cmd);
if (ret == ESP_OK)
{
for (int i = 0; i < 6; i++)
{
printf(" %d ", a[i]);
}
printf("\n");
float t_ticks = (uint16_t)a[0] * 256 + (uint16_t)a[1];
float rh_ticks = (uint16_t)a[3] * 256 + (uint16_t)a[4];
float temperature = -45 + 175.0 * t_ticks / 65535.0;
float humidity = -6 + 125.0 * rh_ticks / 65535.0;
printf("温度:%.2lf \n", temperature);
printf("湿度:%.2lf \n", humidity);
}
vTaskDelay(1000);
}
i2c_driver_delete(I2C_MASTER_NUM);
vTaskDelete(NULL);
}
void app_main()
{
xTaskCreate(i2c_scanner_task, "i2c_scanner_task", 2048, NULL, 10, NULL);
}