19-ESP32-S3外设IIC

ESP32-S3的IIC

引言

ESP32-S3是一款集成了Wi-Fi和蓝牙功能的低成本、多功能微控制器。在这篇博客中,我们将详细介绍ESP32-S3的IIC(Inter-Integrated Circuit)接口,也被称为I2C。

IIC简介

IIC是一种串行、同步、多设备、半双工通信协议,允许同一总线上存在多个主设备和从设备。IIC使用两个双向开漏线:串行数据线(SDA)和串行时钟线(SCL),由电阻上拉。ESP32-S3有2个IIC控制器(也称为端口),负责处理I2C总线上的通信。每个控制器都可以设置为主机或从机。
IIC 总线有如下特点

  1. 总线由数据线 SDA 和时钟线 SCL 构成的串行总线,数据线用来传输数据,时钟线用来同步数据收发。
  2. 总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时
    序就可以实现微控制器与器件之间的通信。
  3. 数据线 SDA 和时钟线 SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电
    压,所以当总线空闲的时候,这两条线路都是高电平。
  4. 总线上数据的传输速率在标准模式下可达 100kbit/s,在快速模式下可达 400kbit/s,在高
    速模式下可达 3.4Mbit/s。
  5. 总线支持设备连接。在使用 IIC 通信总线时,可以有多个具备 IIC 通信能力的设备挂载
    在上面,同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容 400pF 的限制决
    定。IIC 总线挂载多个器件的示意图如下👇
    在这里插入图片描述

IIC 控制器介绍

ESP32-S3 有两个 IIC 总线接口,根据用户的配置,总线接口可以用作 IIC 主机或从机模式。
IIC 接口特点:

  • 可支持标准模式(100Kbit/s)、快速模式(400Kbit/s),速度最高可达 800Kbit/s,但受限于SCL 和 SDA 上拉强度。
  • 可支持 7 位寻址模式和 10 位寻址模式
  • 可支持双地址(从机地址和从机寄存器地址)寻址模式

驱动程序的功能
I2C 驱动程序管理在 I2C 总线上设备的通信,该驱动程序具备以下功能:

  • 在主机模式下读写字节
  • 支持从机模式
  • 读取并写入寄存器,然后由主机读取/写入

IIC 的基本的读写通讯过程

✨写操作通讯过程图
在这里插入图片描述
主机首先在IIC 总线上发送起始信号,那么这时总线上的从机都会等待接收由主机发出的数据。主机接着发送从机地址+0(写操作)组成的8bit 数据,所有从机接收到该 8bit 数据后,自行检验是否是自己的设备的地址,假如是自己的设备地址,那么从机就会发出应答信号。主机在总线上接收到有应答信号后,才能继续向从机发送数据。注意:IIC 总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

✨读操作通讯过程图
在这里插入图片描述
主机向从机读取数据的操作,一开始的操作与写操作有点相似,观察两个图也可以发现,都是由主机发出起始信号,接着发送从机地址+1(读操作)组成的8bit 数据,从机接收到数据验证是否是自身的地址。 那么在验证是自己的设备地址后,从机就会发出应答信号,并向主机返回8bit 数据,发送完之后从机就会等待主机的应答信号。假如主机一直返回应答信号,那么从机可以一直发送数据,也就是图中的(n byte + 应答信号)情况,直到主机发出非应答信号,从机才会停止发送数据。

使用IIC驱动程序

1. 配置驱动程序 -设置初始化参数(如主机模式或从机模式,SDA 和 SCL 使用的 GPIO 管脚,时钟速度等)

使用i2c_config_t 结构体,用于配置 I2C 参数

  • 设置 I2C 工作模式 - 从 i2c_mode_t 中选择主机模式或从机模式
  • 设置 通信管脚
    1️⃣指定 SDA 和 SCL 信号使用的 GPIO 管脚
    2️⃣是否启用 ESP32-S3 的内部上拉电阻
  • (仅限主机模式)设置 I2C 时钟速度
  • (仅限从机模式)设置以下内容:
    1️⃣是否应启用 10 位寻址模式
    2️⃣定义 从机地址

然后,初始化给定 I2C 端口的配置,使用端口号和 i2c_config_t 作为函数调用参数来调用 i2c_param_config() 函数。

🔮配置示例(主机):

int i2c_master_port = 0;  // 定义 I2C 主设备的端口号

i2c_config_t conf = {
    .mode = I2C_MODE_MASTER,  // 设置 I2C 模式为主设备模式
    .sda_io_num = I2C_MASTER_SDA_IO,  // 设置 I2C 主设备的数据线(SDA)的 GPIO 号码
    .sda_pullup_en = GPIO_PULLUP_ENABLE,  // 启用 I2C 主设备的数据线(SDA)的上拉电阻
    .scl_io_num = I2C_MASTER_SCL_IO,  // 设置 I2C 主设备的时钟线(SCL)的 GPIO 号码
    .scl_pullup_en = GPIO_PULLUP_ENABLE,  // 启用 I2C 主设备的时钟线(SCL)的上拉电阻
    .master.clk_speed = I2C_MASTER_FREQ_HZ,  // 设置 I2C 主设备的时钟频率
    .clk_flags = 0,  // 可选项,可以使用 I2C_SCLK_SRC_FLAG_* 标志来选择 I2C 源时钟
};

🔮配置示例(从机):

int i2c_slave_port = I2C_SLAVE_NUM;  // 定义 I2C 从设备的端口号

i2c_config_t conf_slave = {
    .sda_io_num = I2C_SLAVE_SDA_IO,  // 设置 I2C 从设备的数据线(SDA)的 GPIO 号码
    .sda_pullup_en = GPIO_PULLUP_ENABLE,  // 启用 I2C 从设备的数据线(SDA)的上拉电阻
    .scl_io_num = I2C_SLAVE_SCL_IO,  // 设置 I2C 从设备的时钟线(SCL)的 GPIO 号码
    .scl_pullup_en = GPIO_PULLUP_ENABLE,  // 启用 I2C 从设备的时钟线(SCL)的上拉电阻
    .mode = I2C_MODE_SLAVE,  // 设置 I2C 模式为从设备模式
    .slave.addr_10bit_en = 0,  // 设置 I2C 从设备的地址模式为 7 位模式
    .slave.slave_addr = ESP_SLAVE_ADDR,  // 设置 I2C 从设备的地址
    .slave.maximum_speed = I2C_SLAVE_MAX_SPEED,  // 设置 I2C 从设备的最大时钟速度
    .clk_flags = 0,  // 可选项,可以使用 I2C_SCLK_SRC_FLAG_* 标志来选择 I2C 源时钟
};

2. 安装驱动程序- 激活一个 I2C 控制器的驱动,该控制器可为主机也可为从机

i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);

3. 根据是为主机还是从机配置驱动程序,选择合适的项目

安装 I2C 驱动程序后, ESP32-S3 即可与其他 I2C 设备通信。

ESP32-S3 的 I2C 控制器在主机模式下负责与 I2C 从机设备建立通信,并发送命令让从机响应,如进行测量并将结果发给主机。

为优化通信流程,驱动程序提供一个名为 命令链接的容器,该容器应填充一系列命令,然后传递给 I2C 控制器执行。

🚨主机模式下通信 - 发起通信(主机模式)

下面的示例展示如何为 I2C 主机构建命令链接,从而向从机发送 n 个字节。建议对照上方👆IIC 的基本的读写通讯过程来理解
请添加图片描述
下面介绍如何为 “主机写入数据” 设置命令链接及其内部内容
1️⃣ 使用 i2c_cmd_link_create() 创建一个命令链接。
然后,将一系列待发送给从机的数据填充命令链接:

  • 启动位 - i2c_master_start()

  • 从机地址 - i2c_master_write_byte()。提供单字节地址作为调用此函数的实参。

  • 数据 - 一个或多个字节的数据作i2c_master_write() 的实参。

  • 停止位 - i2c_master_stop()

    函数 i2c_master_write_byte()i2c_master_write() 都有额外的实参,规定主机是否应确认其有无接受到 ACK 位。

2️⃣通过调用 i2c_master_cmd_begin() 来触发 I2C 控制器执行命令链接。一旦开始执行,就不能再修改命令链接。

3️⃣命令发送后,通过调用i2c_cmd_link_delete()释放命令链接使用的资源。

// 创建一个 I2C 命令链
i2c_cmd_handle_t cmd = i2c_cmd_link_create();

// 添加开始信号到 I2C 命令链
i2c_master_start(cmd);

// 添加从设备地址和写入方向到 I2C 命令链
i2c_master_write_byte(cmd, ( slave_address << 1 ) | WRITE_BIT, ACK_CHECK_EN);

// 添加数据到 I2C 命令链
i2c_master_write_byte(cmd, data, ACK_CHECK_EN);

// 添加停止信号到 I2C 命令链
i2c_master_stop(cmd);

// 开始执行 I2C 命令链
esp_err_t ret = i2c_master_cmd_begin(i2c_master_port, cmd, 1000 / portTICK_RATE_MS);

// 删除 I2C 命令链
i2c_cmd_link_delete(cmd);
if (ret == ESP_OK) {
    // 通信成功
} else {
    // 通信失败,处理错误
}

主机读取数据
下面的示例展示如何为 I2C 主机构建命令链接,以便从从机读取 n 个字节。

请添加图片描述

✨如果是在读取数据时,在上图的步骤 4 中,不是用i2c_master_write...,而是用 i2c_master_read_byte()和/或 i2c_master_read() 填充命令链接。同样,步骤 5 中配置最后一次的读取,以便主机不提供ACK 位。

🚨从机模式下通信 - 响应主机消息(从机模式)

在 ESP32-S3 作为 I2C 的从设备时,它会响应主设备的消息。以下是从设备模式下通信的基本步骤及其对应的 ESP-IDF API:

  1. 监听开始信号和地址:从设备监听 I2C 总线,等待主设备发出开始信号和它的地址。这个过程是自动的,你不需要编写任何代码来实现。

  2. 发送应答:如果从设备检测到了它的地址,它会在 SDA 线上产生一个低电平,表示它已经准备好接收或发送数据。这个过程也是自动的。

  3. 接收/发送数据:从设备可以接收来自主设备的数据,或者发送数据到主设备。每接收/发送一个字节后,从设备都会发送一个应答。你可以使用 i2c_slave_read_buffer 函数来从 I2C 总线读取数据,或者使用 i2c_slave_write_buffer 函数来向 I2C 总线写入数据。

// 读取数据
uint8_t data[DATA_LENGTH];
int size = i2c_slave_read_buffer(I2C_SLAVE_NUM, data, DATA_LENGTH, 1000 / portTICK_RATE_MS);

// 写入数据
uint8_t data[DATA_LENGTH] = {0x01, 0x02, 0x03, 0x04, 0x05};
int size = i2c_slave_write_buffer(I2C_SLAVE_NUM, data, DATA_LENGTH, 1000 / portTICK_RATE_MS);
  1. 监听停止信号:从设备监听 I2C 总线,等待主设备发出停止信号。这个过程是自动的,你不需要编写任何代码来实现。

✨大多数 I2C 驱动程序的函数在成功完成时会返回 ESP_OK ,或在失败时会返回特定的错误代码。

4. 删除驱动程序- 在通信结束时释放 I2C 驱动程序所使用的资源

当使用 i2c_driver_install() 建立 I2C 通信,一段时间后不再需要 I2C 通信时,可以通过调用 i2c_driver_delete() 来移除驱动程序以释放分配的资源。

#include "driver/i2c.h"

// 定义 I2C 主设备的配置参数
#define I2C_MASTER_SCL_IO 26        // GPIO号码用于I2C主设备的时钟
#define I2C_MASTER_SDA_IO 25        // GPIO号码用于I2C主设备的数据
#define I2C_MASTER_NUM I2C_NUM_0    // I2C端口号码用于主设备
#define I2C_MASTER_FREQ_HZ 100000   // I2C主设备的时钟频率
#define WRITE_BIT I2C_MASTER_WRITE  // I2C主设备写入
#define READ_BIT I2C_MASTER_READ    // I2C主设备读取
#define ACK_CHECK_EN 0x1            // I2C主设备将检查从设备的应答

// 初始化 I2C 主设备
void i2c_master_init()
{
    int i2c_master_port = I2C_MASTER_NUM;  // 定义 I2C 主设备的端口号
    i2c_config_t conf;  // 定义 I2C 配置结构体
    conf.mode = I2C_MODE_MASTER;  // 设置 I2C 模式为主设备模式
    conf.sda_io_num = I2C_MASTER_SDA_IO;  // 设置 I2C 主设备的数据线 GPIO 号码
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;  // 启用 I2C 主设备的数据线上拉电阻
    conf.scl_io_num = I2C_MASTER_SCL_IO;  // 设置 I2C 主设备的时钟线 GPIO 号码
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;  // 启用 I2C 主设备的时钟线上拉电阻
    conf.master.clk_speed = I2C_MASTER_FREQ_HZ;  // 设置 I2C 主设备的时钟频率
    i2c_param_config(i2c_master_port, &conf);  // 配置 I2C 主设备的参数
    i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);  // 安装 I2C 主设备的驱动程序
}

// 主程序
void app_main()
{
    i2c_master_init();  // 初始化 I2C 主设备
    // 在这里添加你的I2C通信代码
}

这个程序首先定义了一些 I2C 的配置参数,然后在 i2c_master_init 函数中初始化了 I2C 接口。在 app_main 函数中,我们调用了 i2c_master_init 函数来初始化 I2C 接口,然后你可以在这里添加你的 I2C 通信代码。

参考资料

乐鑫官方文档I2C 驱动程序
正点原子ESP32-S3教程
微软AI Copilot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/574477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】03. SMOTE算法实现数据集单个不平衡的样本扩充

背景&#xff1a;通常在处理分类问题中数据不平衡类别。使用SMOTE算法对其中的少数类别进行过采样&#xff0c;以使其与多数类别的样本数量相当或更接近。 直接上代码 from imblearn.over_sampling import SMOTE from sklearn.datasets import make_classification from colle…

openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能

文章目录 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能271.1 TPC-C简介271.2 系统级优化271.3 BenchmarkSQL&#xff1a;开源TPC-C工具271.4 运行基准271.5 结果报告 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MO…

AI智能写作工具,一键智能改写文章简单又高效

随着人们生活节奏的加快和工作压力的增大&#xff0c;如何在繁忙的日程中高效地写作成为了许多人的难题。但是随着人工智能技术的不断发展和应用&#xff0c;AI智能写作工具的出现&#xff0c;成为了许多人解决写作难题的利器。今天小编就来跟大家分享下AI智能写作工具&#xf…

自动驾驶行业源代码防泄漏解决方案

行业背景&#xff1a; 随着新一代信息通信及人工智能技术的快速发展&#xff0c;汽车作为这些新技术应用的重要载体&#xff0c;正在加速向智能化和网联化转型&#xff0c;以自动驾驶研发为主业的企业也越来越多&#xff0c;如何保障自己研发的算法、模型、系统不被研发人员离…

百度沈抖:智能,生成无限可能

4月16日&#xff0c;Create 2024百度AI开发者大会在深圳举行。会上&#xff0c;百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——百度智能云万源。它能管理万卡规模的集群&#xff0c;极致地发挥GPU、CPU的性能&#xff1b;它有强大的大模型作…

创新科技赋能旅游服务:智慧文旅引领旅游发展新篇章,智能体验助力产业转型升级

随着科技的飞速发展和人们生活水平的提高&#xff0c;旅游业正迎来前所未有的发展机遇。创新科技在旅游服务领域的广泛应用&#xff0c;不仅提升了旅游体验的品质&#xff0c;也为旅游产业的转型升级注入了新的动力。智慧文旅作为旅游业与信息技术深度融合的产物&#xff0c;正…

【机器学习-12】数据探索---python主要的探索函数

在上一篇博客【机器学习】数据探索(Data Exploration)—数据质量和数据特征分析中&#xff0c;我们深入探讨了数据预处理的重要性&#xff0c;并介绍了诸如插值、数据归一化和主成分分析等关键技术。这些方法有助于我们清理数据中的噪声、消除异常值&#xff0c;以及降低数据的…

AI视频教程下载:用ChatGPT和 MERN 堆栈构建 SAAS 项目

这是一个关于 掌握ChatGPT 开发应用的全面课程&#xff0c;它将带领你进入 AI 驱动的 SAAS 项目的沉浸式世界。该课程旨在使你具备使用动态的 MERN 堆栈和无缝的 Stripe 集成来构建强大的 SAAS 平台所需的技能。 你将探索打造智能解决方案的艺术&#xff0c;深入研究 ChatGPT 的…

PM2管理器无法使用解决方法

之前的项目全是依靠PM2管理器部署的&#xff0c;部署快速&#xff0c;也便于管理 但是宝塔实在是bug毛病太多&#xff0c;最近这两天又出毛病了 这次的问题是在PM2管理器的node版本中无法进行版本切换&#xff0c;如果是第一次使用PM2的话甚至无法设置node版本&#xff0c;之前…

docker 集群管理实战mesos+zookeeper+marathon(一)

一 实验环境 1.1 系统版本&#xff0c;本实验使用cnetos7.9版本镜像 1.2 准备5台虚拟机&#xff0c;其中3台master&#xff0c;两台slave&#xff0c;使用克隆的方式 1.3 使用远程连接工具登录 1.4 修改主机名 1.5 设置域名映射 每个虚拟机都配置一下&#xff0c;这里就演示一…

区块链基础——区块链应用架构概览

目录 区块链应用架构概览&#xff1a; 1、区块链技术回顾 1.1、以太坊结点结构 1.2、多种应用场景 2、区块链应用架构概览 2.1、传统的Web2 应用程序架构 2.2、Web3 应用程序架构——最简架构 2.3、Web3 应用程序架构——前端web3.js ether.js 2.4、Web3 应用程序架构—…

浅谈菊风实时音视频 (RTC)与实时操作系统 (RTOS) 在智能硬件领域应用

近年来&#xff0c;菊风通过实时音视频赋能智能手表、智能门禁、智能门锁/门铃、智能眼镜等数十种智能硬件&#xff0c;与一众合作伙伴共同探索在IoT智能硬件领域的不同场景应用&#xff0c;积累了丰富的实践经验。在智能硬件中&#xff0c;RTOS因其轻量化的系统内核&#xff0…

C#基础之函数基础

函数 文章目录 1、函数基础1、概念2、函数位置3、基本语法4、实际运用5、return 2、ref 和 out1、ref 和 out 使用2、区别思考 登录 3、变长参数和参数默认值1、变长参数2、参数默认值 4、函数重载5、递归函数思考1 阶乘思考2 阶乘相加思考3 竹竿减半思考4 递归循环输出 1、函数…

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…

RE | BUUCTF 刮开有奖1

题目&#xff1a;BUUCTF 刮开有奖1 参考&#xff1a; BUUCTF 刮开有奖&#xff08;特别详细了&#xff0c;尽自己全力理解所写&#xff09;&#xff08;这是主参考&#xff0c;写得很详细 BUUCTF_刮开有奖&#xff08;主参考的参考&#xff0c;思路很清晰 我是大菜鸡…尽力写自…

报错:图片验证码接口对接vue+springboot(下一个笔记会记录整个验证码的代码)

问题&#xff1a;空指针异常ai: 根据错误堆栈信息中提供的方法调用位置&#xff0c;看起来空指针异常是在 AuthCodeServiceImpl 类的 authUserCoded 方法的第 41 行发生的。 为了解决这个问题&#xff0c;你可以检查 AuthCodeServiceImpl 类中 authUserCoded 方法的第 41 行&am…

Qt xml示范

1.数据格式 #ifndef XML_DATA_H #define XML_DATA_H#include<QWidget>struct Student {int s_id;QString s_name;double s_math_score;double s_english_score;}; struct Teacher{int t_id;QString t_name;QVector<Student> t_students_v; };#endif // XML_DATA_H…

【JavaEE网络】TCP/IP协议:细节与应用

目录 TCP/IP协议协议格式传输层重点协议UDP协议UDP协议端格式 UDP的特点TCP协议TCP协议端格式 TCP的特点 TCP/IP协议 协议格式 应用层&#xff08;后端开发必知必会&#xff09;&#xff1a;这一层也有很多现成的协议&#xff08;后面还会重点介绍HTTP协议&#xff0c;这是做…

从0开始用C写贪吃蛇(基于链表)

目录 1. 游戏背景 2. 游戏效果演示​编辑​编辑​编辑 3. 实现目标 4. 技术要点 5. 控制台程序 5.1 设置控制台窗口的长宽和名字 5.2 控制台屏幕上的坐标COORD 6.Win32 API 6.1 GetStdHandle 6.2 GetConsoleCursorInfo 6.3 CONSOLE_CURSOR_INFO 6.4 SetConsole…

CSS 之 transition过渡动画

一、简介 ​ CSS 制作 Web 动画有两种方式&#xff1a; 帧动画&#xff08;Keyframe Animation&#xff09;和过渡动画&#xff08;Transition Animation&#xff09;。针对不同的业务场景中&#xff0c;我们应该选择不同的动画方式&#xff0c;通常来说&#xff1a;对于交互元…
最新文章