i2c
I2C是一种串行、同步、半双工通信协议,允许在同一总线上共存多个主站和从站。I2C 总线由两条线路组成:串行数据线(SDA) 和串行时钟 (SCL)。两条线路都需要上拉电阻。
具有简单、制造成本低等优点,I2C主要用于短距离(一英尺以内)低速外围设备的通信。
ESP32 有两个I2C控制器(也称为端口),负责处理两个 I2C 总线上的通信。每个 I2C 控制器都可以作为主控制器或从控制器运行。例如,一个控制器可以同时充当主控制器,另一个控制器充当从控制器。
驱动程序功能
I2C驱动程序通过 I2C 总线控制设备的通信。该驱动程序支持以下功能:
1在主模式下读取和写入字节
2从模式
3读取和写入寄存器,而寄存器又由主站读/写
以下各节介绍配置和操作I2C驱动:
配置 -设置初始化参数(主模式或从模式、SDA 和 SCL 的 GPIO 引脚、时钟速度等)
安装驱动程序 -在两者之一上激活驱动程序I2C控制器作为主控制器或从控制器
根据您是为主设备还是从设备配置驱动程序,选择适当的项目
作为主站通信 -处理通信(主站)
作为从站通信 -响应来自主站(从站)的消息
中断处理 -配置和服务I2C中断
自定义配置 -调整默认值I2C通信参数(时序、位顺序等)
错误处理 -如何识别和处理驱动程序配置和通信错误
删除驱动程序 -发布资源I2C通信结束时的驱动程序
i2c_config
int i2c_master_port = 0; |
i2c_config_t conf = { |
.mode =I2C_MODE_SLAVE(I2C从模式)或者I2C_MODE_MASTER(I2C主模式), // 选择工作模式 |
.sda_io_num = I2C_MASTER_SDA_IO, // 选择SDA管脚的GPIO编号 |
.sda_pullup_en = GPIO_PULLUP_DISAB或者GPIO_PULLUP_ENABLE= 0x1//禁用 GPIO 上拉电阻,使能 GPIO 上拉电阻 |
.scl_io_num = I2C_MASTER_SCL_IO, // 选择SCL管脚的GPIO编号 |
.scl_pullup_en = GPIO_PULLUP_DISAB或者GPIO_PULLUP_ENABLE= 0x1//禁用 GPIO 上拉电阻,使能 GPIO 上拉电阻 |
.master.clk_speed = I2C_MASTER_FREQ_HZ, // 选择一个合适的时钟频率 |
}; |
i2c_param_config(I2C_NUM_0, &conf);//I2C 参数初始化。
i2c_driver_install(i2c_port_t i2c_num, //I2C 端口号
i2c_mode_t mode, //I2C模式(主或从)
size_t slv_rx_buf_len,//从模式的接收缓冲区大小,主模式为零
size_t slv_tx_buf_len,//从模式的发送缓冲区大小,主模式为零
int intr_alloc_flags//用于分配中断的标志。忽略中断为0
);//I2C 驱动程序安装。
i2c_driver_install(0, I2C_MODE_MASTER, 0, 0, 0);
i2c_cmd_handle_t
i2c_cmd_handle_t 任务句柄 读写方式差不多 |
i2c_cmd_link_create()创建并初始化 I2C 命令链接。 |
在构建 I2C 命令链接之前,我们需要调用i2c_cmd_link_create() 以创建命令链接。发送完命令后,我们需要调用 i2c_cmd_link_delete() 来释放并返回资源。 |
i2c_master_start()//I2C 主站的队列命令以生成启动信号。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin()// 以发送所有排队的命令 |
i2c_master_write_byte()//I2C 主站将一个字节写入 I2C 总线的队列命令。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令 |
i2c_master_write()//I2C 主站将缓冲区写入 I2C 总线的队列命令。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令 |
i2c_master_stop()//I2C 主机的队列命令,用于生成停止信号。仅在 I2C 主模式下调用此函数 调用 i2c_master_cmd_begin() 以发送所有排队的命令 |
i2c_master_cmd_begin()//I2C 主设备发送排队的命令。此函数将触发发送所有排队的命令。该任务将被阻止,直到所有命令都发出。I2C API 不是线程安全的,如果要在不同的任务中使用一个 I2C 端口,则需要处理多线程问题。仅在 I2C 主模式下调用此函数 |
i2c_cmd_link_delete()//免费的 I2C 命令链接。在构建 I2C 命令链接之前,我们需要调用 i2c_cmd_link_create() 来创建命令链接。发送完命令后,我们需要调用i2c_cmd_link_delete() 释放和返还资源。 |
代码解析:
![](https://img-blog.csdnimg.cn/img_convert/ea9c25234c900426b2d5da5c3998f478.png)