esp32s3 idf i2c读写数据
时间: 2025-04-24 12:45:23 浏览: 69
### 使用ESP32-S3与IDF框架进行I2C读写操作
对于ESP32-S3使用IDF(Espressif IoT Development Framework)进行I2C总线上的设备读写,可以遵循如下方法构建程序逻辑。此过程涉及初始化配置、设置I2C参数以及执行具体的读写动作。
#### 初始化I2C接口
为了使能并配置I2C外设,在应用启动阶段需调用`i2c_param_config()`函数来设定波特率和其他必要选项,并通过`i2c_driver_install()`安装驱动程序[^2]。
```c
#include "driver/i2c.h"
#define SDA_PIN GPIO_NUM_21
#define SCL_PIN GPIO_NUM_22
#define I2C_PORT I2C_NUM_0
void setup_i2c() {
int i2c_master_port = I2C_PORT;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = SDA_PIN,
.scl_io_num = SCL_PIN,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = 100000, // 设置I2C频率为100kHz
};
i2c_param_config(i2c_master_port, &conf);
i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);
}
```
#### 执行I2C写入命令
当向连接于I2C总线的器件发送指令或数据时,可利用`i2c_master_write_to_device()`完成这一任务。该API允许指定目标设备地址、欲传输的数据缓冲区及其长度等信息[^3]。
```c
esp_err_t write_data(uint8_t dev_addr, uint8_t reg_addr, const uint8_t *data_wr, size_t size) {
esp_err_t ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (dev_addr << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN);
i2c_master_write(cmd, data_wr, size, ACK_CHECK_EN);
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_PORT, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
return ret;
}
```
#### 实施I2C读取操作
从已接入系统的外围模块获取反馈信息,则应该采用`i2c_master_read_from_device()`来进行相应的处理工作。这里同样要指明所访问对象的身份码、预期接收的信息量等内容。
```c
esp_err_t read_data(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data_rd, size_t size) {
esp_err_t ret;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (dev_addr << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN);
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (dev_addr << 1) | READ_BIT, ACK_CHECK_EN);
if (size > 1) {
i2c_master_read(cmd, data_rd, size - 1, ACK_VAL);
}
i2c_master_read_byte(cmd, data_rd + size - 1, NACK_VAL);
i2c_master_stop(cmd);
ret = i2c_master_cmd_begin(I2C_PORT, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
return ret;
}
```
上述代码片段展示了如何基于ESP-IDF环境下的标准库函数实现基本的I2C通信流程,包括但不限于创建命令链表、发起起始条件、传送寄存器索引值、实际的数据交换直至终止整个会话的过程。
阅读全文
相关推荐


















