ESP32S3使用GPIO47 48作I2C
时间: 2025-05-11 19:25:13 浏览: 21
### ESP32-S3 GPIO47 和 GPIO48 的 I2C 接口配置
在 ESP32-S3 上,GPIO47 和 GPIO48 可以被配置为 I2C 总线的 SDA(数据线)和 SCL(时钟线),用于连接外部设备。以下是关于如何配置这些引脚作为 I2C 接口的具体方法。
#### 1. 硬件准备
ESP32-S3 支持多个外设功能复用,在硬件设计阶段需确认 GPIO47 和 GPIO48 已正确连接到目标 I2C 设备,并确保拉高电阻已设置适当值[^1]。
#### 2. 软件初始化
通过调用 `i2c_param_config` 函数可以完成 I2C 参数的初始配置。以下是一个典型的代码实现:
```cpp
#include "driver/i2c.h"
#define I2C_MASTER_SCL_IO 48 /*!< 定义SCL引脚 */
#define I2C_MASTER_SDA_IO 47 /*!< 定义SDA引脚 */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< 使用I2C控制器编号 */
#define I2C_MASTER_FREQ_HZ 100000 /*!< 设置频率 */
void i2c_master_init() {
int i2c_master_port = I2C_MASTER_NUM;
/// 配置I2C参数
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER; // 主模式
conf.sda_io_num = I2C_MASTER_SDA_IO; // SDA 引脚号
conf.scl_io_num = I2C_MASTER_SCL_IO; // SCL 引脚号
conf.sda_pullup_en = GPIO_PULLUP_ENABLE; // 启用内部上拉电阻 (SDA)
conf.scl_pullup_en = GPIO_PULLUP_ENABLE; // 启用内部上拉电阻 (SCL)
conf.master.clk_speed = I2C_MASTER_FREQ_HZ; // 设置通信速率
i2c_param_config(i2c_master_port, &conf); // 初始化I2C总线
i2c_driver_install(i2c_master_port, conf.mode,
0, // 不启用事件队列
0, // RX 缓冲区大小
0 // TX 缓冲区大小
);
}
```
上述代码定义了两个宏分别指向 GPIO47 和 GPIO48 并启用了它们的内部上拉电阻。
#### 3. 数据传输函数
为了读取或写入数据至从属设备,可使用如下辅助函数来简化操作过程:
```cpp
esp_err_t i2c_read_data(uint8_t addr, uint8_t reg, uint8_t *data_rd, size_t size) {
if (size == 0) return ESP_OK;
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (addr << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(cmd, reg, ACK_CHECK_EN);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(10));
i2c_cmd_link_delete(cmd);
if (ret != ESP_OK) return ret;
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (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);
return i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(10));
}
esp_err_t i2c_write_data(uint8_t addr, uint8_t reg, const uint8_t* data_wr, size_t size) {
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (addr << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(cmd, reg, ACK_CHECK_EN);
i2c_master_write(cmd, data_wr, size, ACK_CHECK_EN);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(10));
i2c_cmd_link_delete(cmd);
return ret;
}
```
以上提供了基本的数据交互能力,其中包含了地址偏移量以及寄存器访问逻辑。
#### 注意事项
- **电源管理**:确保所使用的传感器或其他外围模块工作电压与 ESP32-S3 兼容。
- **信号完整性**:对于较长距离布线情况考虑增加额外缓冲电路减少干扰影响性能表现。
阅读全文
相关推荐


















