1.首先这款温湿度传感器是通过i2c来传输数据的,那么就需要完成i2c的初始化等工作
2.目标是在esp32s3上 完成适配,查看esp32s3的datasheet,esp32支持任意管脚适配,真是神奇
3. 下载sht40的驱动代码,完成接口适配,例如i2c的初始化,i2c的读与写,以及i2c的反初始化(释放)。至此,适配工作完成。
不多说,上代码。
a.在下载完成的sht40 的驱动代码内,直接添加有关esp的头文件,这些包括esp的log头文件,以及esp的驱动文件(i2c),例如
#include "esp_log.h"
#include "driver/i2c.h"
static const char *TAG = "i2c-simple-example";
#define I2C_MASTER_SCL_IO GPIO_NUM_1 /*!< GPIO number used for I2C master clock */
#define I2C_MASTER_SDA_IO GPIO_NUM_2 /*!< GPIO number used for I2C master data */
#define I2C_MASTER_NUM 0 /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
#define I2C_MASTER_FREQ_HZ 400000 /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */
#define I2C_MASTER_TIMEOUT_MS 1000
b. 完成i2c 的初始化 功能,该代码可参考esp的i2c demo
static esp_err_t i2c_master_init(void)
{
int i2c_master_port = I2C_MASTER_NUM;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
i2c_param_config(i2c_master_port, &conf);
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
void sensirion_i2c_init(void) {
// IMPLEMENT
// esp32s3 board
#ifdef SELF_ESP32S3_BOARD
esp_err_t ret = i2c_master_init();
ESP_LOGI(TAG,"i2c_master_init:%d",ret);
#endif
}
c. 继续完成i2c的读与写 操作,代码如下:
int8_t sensirion_i2c_read(uint8_t address, uint8_t* data, uint16_t count) {
// IMPLEMENT
// esp32s3 interface
esp_err_t ret = i2c_master_read_from_device(I2C_NUM_0, address, data, count,1000);
ESP_LOGI(TAG,"i2c_master_read_from_device:%d",ret);
//end
return NO_ERROR;
}
int8_t sensirion_i2c_write(uint8_t address, const uint8_t* data,
uint16_t count) {
// IMPLEMENT
// esp32s3 interface
esp_err_t ret = i2c_master_write_to_device(I2C_NUM_0, address, data, count,1000);
ESP_LOGI(TAG,"i2c_master_write_to_device:%d",ret);
//end
return NO_ERROR;
}
这里,需要完成一个延迟的操作,在这里,调用esp里面的函数
void sensirion_sleep_usec(uint32_t useconds) {
// IMPLEMENT
// esp32s3 interface
esp_rom_delay_us(useconds);
}
最后是,i2c的反初始化操作,也就是释放动作,代码如下:
void sensirion_i2c_release(void) {
// IMPLEMENT or leave empty if no resources need to be freed
ESP_ERROR_CHECK(i2c_driver_delete(I2C_MASTER_NUM));
ESP_LOGI(TAG, "I2C de-initialized successfully");
}
好了,写到这里,i2c的适配工作,已经完成了。看起来没什么难度。
建议:sht40的代码,采用模块化方式,便于管理,移植等工作。