本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录 _ O x
是否进入ESP32教学导航(基于ESP-IDF)?
确定
文章目录
一、I2C 简介
I2C是一种通过两条双向IO线:SDA(串行数据线)和SCL(串行时钟线)进行数据通信的一种通信协议
二、I2C 数据帧
由于 ESP-IDF
对于I2C通信协议的封装较为完善,开发者写程序并不需要完全了解 I2C
通信时序,只需要理解I2C通信的数据帧即可。
Start | Slave Address | R/W | Ack | Slave Address | Ack | Slave Address | Ack | … | Ack | Stop |
---|---|---|---|---|---|---|---|---|---|---|
起始 | 从机地址 | 读/写 | 应答 | 8位数据 | 应答 | 8位数据 | 应答 | … | 应答 | 终止 |
- 起始信号
- 发送从机地址
- 发送读写标志:0为写,1为读取
- 应答位(可设置为忽略应答位)
- 发送8位数据
loop
循环执行4、5。直至发送完所有数据- 终止
接下来我们将离不开I2C数据帧的格式。
三、在 ESP-IDF 中 使用 I2C API (仅介绍主机模式)
ESP-IDF 封装的 I2C
API 中体现了面向对象的思想。它将 I2C 发送的数据帧当作了一个装有数据的容器。具体使用逻辑如下:
- 创建一个空的
I2C 命令
对象。 - 添加各种子数据帧,例如起始信号,从机地址,读写位,数据,终止信号等。
接下来我将用例程来展示在 ESP-IDF 中 使用 I2C API。在此之前,我总结一下使用 I2C 的步骤。
1、使用步骤(主机)
注意:
步骤①和步骤②可以颠倒!
① 配置驱动程序i2c_param_config()
【1】参数配置
我们需要传递一个 i2c_config_t
结构体指针,该结构体包含了配置i2c主机模式的参数。
int i2c_master_port = 0;
i2c_config_t conf = {
// 选择工作模式,I2C_MODE_MASTER 为本文介绍的主机模式
.mode = I2C_MODE_MASTER,
// 选择SDA管脚的GPIO编号
.sda_io_num = I2C_MASTER_SDA_IO,
// 允许上拉
.sda_pullup_en = GPIO_PULLUP_ENABLE,
// 选择SCL管脚的GPIO编号
.scl_io_num = I2C_MASTER_SCL_IO,
// 允许上拉
.scl_pullup_en = GPIO_PULLUP_ENABLE,
// 选择一个合适的时钟频率(比如100,000)
.master.clk_speed = I2C_MASTER_FREQ_HZ,
/* 选择时钟源头,你可以填入I2C_SCLK_SRC_FLAG_* 来选择合适的时钟源 */
.clk_flags = 0,//此句可以注释掉
};
【2】源时钟配置
对于.clk_flags
元素:
名称 | 值 | 含义 |
---|---|---|
I2C_SCLK_SRC_FLAG_FOR_NOMA |
0 | 仅根据所需频率进行自动选择时钟。(不支持特殊功能,如 APB 等) |
I2C_SCLK_SRC_FLAG_AWARE_DFS |
1 | 当 APB 时钟改变时,时钟的波特率不会改变。 |
I2C_SCLK_SRC_FLAG_LIGHT_SLEEP |
2 | 用于轻度睡眠模式 |
之后调用i2c_param_config()
配置 I2C:
i2c_param_config(I2C_NUM_0, &conf);
- 参数一:欲配置的I2C通道(
I2C_NUM_0
或I2C_NUM_1
) - 参数二:配置参数结构体的指针
② 安装 I2C 驱动
方法是调用函数 i2c_driver_install()
函数
i2c_driver_install()
简介:
1、参数(手机端可能得不到完全展示,手机端可以滑动来查看右边一列)
参数名 含义 类型 "i2c_num"
【I2C 端口编号】
写0
或1
,或者I2C_NUM_0
或I2C_NUM_1
)[i2c_port_t]
"mode"
总线工作模式
主机(I2C_MODE_MASTER
)还是从机(I2C_MODE_SLAVE
)[i2c_mode_t]
"slv_rx_buf_len&