【ESP32 IDF】I2C的使用

news2024/10/7 20:36:53

文章目录

  • 前言
  • 一、I2C驱动使用的步骤
  • 二、I2C的使用
    • 2.1 配置驱动程序
    • 2.2 安装驱动程序
    • 2.3 主机写入数据
      • 写入数据的过程
      • 接收数据的过程
  • 总结


前言

ESP32是一款强大的微控制器,广泛应用于物联网(IoT)和嵌入式系统开发。它具备丰富的硬件接口,其中之一是I2C(Inter-Integrated Circuit),这是一种用于短距离通信的串行通信协议。I2C接口常用于连接各种外部传感器、存储器和其他外设,使得ESP32能够轻松实现与外部设备的数据交换。

本文将介绍如何在ESP32 IDF中使用I2C接口,提供一个简单而实用的示例代码。通过本文,您将了解如何初始化I2C主机、进行数据写入以及连接和配置I2C从设备的关键步骤。


一、I2C驱动使用的步骤

以下部分将指导您完成 I2C 驱动程序配置和工作的基本步骤:

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

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

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

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

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

  • 中断处理 - 配置和 I2C 中断服务

  • 用户自定义配置 - 调整默认的 I2C 通信参数(如时序、位序等)

  • 错误处理 - 如何识别和处理驱动程序配置和通信错误

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

二、I2C的使用

2.1 配置驱动程序

如果你需要使用I2C,你需要这个结构体:i2c_config_t,他的结构体定义如下:

typedef struct{
    i2c_mode_t mode;     /*!< I2C mode */
    int sda_io_num;      /*!< GPIO number for I2C sda signal */
    int scl_io_num;      /*!< GPIO number for I2C scl signal */
    bool sda_pullup_en;  /*!< Internal GPIO pull mode for I2C sda signal*/
    bool scl_pullup_en;  /*!< Internal GPIO pull mode for I2C scl signal*/

    union {
        struct {
            uint32_t clk_speed;     /*!< I2C clock frequency for master mode, (no higher than 1MHz for now) */
        } master;                   /*!< I2C master config */
        struct {
            uint8_t addr_10bit_en;  /*!< I2C 10bit address mode enable for slave mode */
            uint16_t slave_addr;    /*!< I2C address for slave mode */
        } slave;                    /*!< I2C slave config */
    };
    uint32_t clk_flags;             /*!< Bitwise of ``I2C_SCLK_SRC_FLAG_**FOR_DFS**`` for clk source choice*/
} i2c_config_t;

mode:
用途:设置I2C接口的工作模式,可以是主机模式(I2C_MODE_MASTER)或从机模式(I2C_MODE_SLAVE)。

主机模式(Master Mode)
在主机模式下,ESP32充当I2C总线的主设备,负责启动和控制通信。主机模式用于与一个或多个I2C从设备进行通信。主机发送起始信号、地址、数据和停止信号,控制整个通信过程。

从机模式(Slave Mode)
在从机模式下,ESP32作为I2C总线上的从设备,等待主机发起通信。ESP32从设备接收来自主机的地址和数据,并根据主机的命令执行相应的操作。从机模式使ESP32能够与其他I2C主机设备通信,实现更复杂的系统互联。

我们使用主机模式即可

sda_io_num:
用途:指定I2C总线的数据线(SDA)连接的GPIO引脚的编号。

scl_io_num:
用途:指定I2C总线的时钟线(SCL)连接的GPIO引脚的编号。

sda_pullup_en:
用途:控制SDA引脚的内部上拉电阻是否启用。

scl_pullup_en:
用途:控制SCL引脚的内部上拉电阻是否启用。

master(union内部的结构体):
用途:当mode为主机模式时,用于配置主机模式下的具体参数。
clk_speed:设置I2C主机模式下的时钟频率,即通信速率。

slave(union内部的结构体):
用途:当mode为从机模式时,用于配置从机模式下的具体参数。
addr_10bit_en:启用或禁用I2C从机模式下的10位地址模式。
slave_addr:设置I2C从机模式下的从机地址。

clk_flags:
用途:通过使用位掩码(bitwise flags)来指定时钟源的选择,具体取值可以是I2C_SCLK_SRC_FLAG_CORE或I2C_SCLK_SRC_FLAG_DFS。

接下来,我们需要为I2C结构体进行初始化,使用这个函数:

esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf)

i2c_num:
意义:指定要配置的I2C总线编号,即I2C控制器的索引。
取值:I2C_NUM_0 或 I2C_NUM_1,表示要配置的是I2C0或I2C1。
在这里插入图片描述
i2c_conf:
意义:指向一个 i2c_config_t 类型的结构体,用于配置I2C总线的参数。
取值:通常情况下,可以通过填充 i2c_config_t 结构体的各个成员来指定具体的配置参数。前面已经介绍过 i2c_config_t 结构体的成员及其作用。

2.2 安装驱动程序

我们可以使用下面这个函数来安装驱动程序:

esp_err_t i2c_driver_install(i2c_port_t i2c_num, i2c_mode_t mode, size_t slv_rx_buf_len, size_t slv_tx_buf_len,
                             int intr_alloc_flags)

i2c_num:
含义:指定要安装和初始化的I2C总线编号,即I2C控制器的索引。
取值:I2C_NUM_0 或 I2C_NUM_1,表示要初始化的是I2C0或I2C1。

mode:
含义:指定I2C总线的工作模式。
取值:可以是 I2C_MODE_MASTER(主机模式)或 I2C_MODE_SLAVE(从机模式)。

slv_rx_buf_len:
含义:指定从机模式下接收缓冲区的大小。
取值:正整数,表示从机模式下接收缓冲区的长度,单位是字节。如果不使用从机模式,则可以将其设置为0。

slv_tx_buf_len:

含义:指定从机模式下发送缓冲区的大小。
取值:正整数,表示从机模式下发送缓冲区的长度,单位是字节。如果不使用从机模式,则可以将其设置为0。

intr_alloc_flags:
含义:指定中断分配的标志位。
取值:可以使用ESP_INTR_FLAG_*系列宏来设置,用于指定中断服务程序的优先级、CPU核心等信息。通常可以选择 ESP_INTR_FLAG_IRAM 或 ESP_INTR_FLAG_SHARED。
如果不使用,写0即可

2.3 主机写入数据

写入数据的过程

主机发送数据有如下的过程:
在这里插入图片描述

  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从设备
static esp_err_t i2c_master_send(uint8_t *data, size_t size) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (I2C_SLAVE_ADDR << 1) | I2C_MASTER_WRITE, true);
    i2c_master_write(cmd, data, size, true);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(1000));
    i2c_cmd_link_delete(cmd);
    return ret;
}

接收数据的过程

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

我们可以写出下面这个代码:

// 从I2C从设备接收数据
static esp_err_t i2c_master_receive(uint8_t *data, size_t size) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (I2C_SLAVE_ADDR << 1) | I2C_MASTER_READ, true);
    if (size > 1) {
        i2c_master_read(cmd, data, size - 1, I2C_MASTER_ACK);
    }
    i2c_master_read_byte(cmd, data + size - 1, I2C_MASTER_NACK);
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, pdMS_TO_TICKS(1000));
    i2c_cmd_link_delete(cmd);
    return ret;
}

我们实现完这几个函数就可以去实现我们的I2C操作了。如果大家需要详细的代码可以进入我的资源找到ESP32-IDF I2C代码


总结

通过本文,我们深入了解了ESP32 IDF中I2C接口的基本使用方法。首先,我们学习了如何初始化I2C主机,包括配置GPIO引脚和设置时钟频率等关键步骤。接着,我们展示了一个简单的示例代码,演示了如何使用ESP32与I2C从设备通信,向其写入数据。

这个示例代码不仅展示了ESP32 IDF中I2C API的基本用法,还为开发者提供了一个起点,可根据实际需求进行定制和扩展。通过理解I2C接口的基本原理和ESP32 IDF中的相关API,开发者可以更轻松地与各种I2C设备进行集成,从而实现更复杂的嵌入式系统和物联网应用。

总体而言,ESP32 IDF为开发者提供了丰富而强大的工具,使得利用ESP32的I2C接口进行通信变得简单而高效。这为物联网和嵌入式系统领域的开发者们带来了更多可能性,同时也推动着这一领域的不断创新和发展。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端Vue与uni-app中的九宫格、十二宫格和十五宫格菜单组件实现

在前端 Vue 开发中&#xff0c;我们经常会遇到需要开发九宫格、十二宫格和十五宫格菜单按钮的需求。这些菜单按钮通常用于展示不同的内容或功能&#xff0c;提供给用户快速访问和选择。 一、引言 在前端开发中&#xff0c;九宫格、十二宫格和十五宫格菜单按钮是一种常见的布局…

提升物流效率,快递平台实战总结与分享

随着电商行业的蓬勃发展&#xff0c;物流配送服务变得愈发重要。快递平台作为连接电商企业和消费者的桥梁&#xff0c;扮演着至关重要的角色。本篇博客将分享快递平台实战经验&#xff0c;总结关键要点&#xff0c;帮助物流从业者提升物流效率、优化服务质量。 ### 快递平台实…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

自动点击脚本

一个简单的自动点击脚本 配置文件张这样&#xff0c;需要的自己截图 excel配置文件 #!/usr/bin/python3# sys.path.append("C:\\Users\苏\\.vscode\\extensions\\ms-python.vscode-pylance-2023.10.50\\dist\\typeshed-fallback\\stubs\\PyAutoGUI") # print(sys.…

python入门(二)

python的安装很方便&#xff0c;我们这里就不再进行讲解&#xff0c;大家可以自己去搜索视频。下面分享一下Python的入门知识点。 执行命令的方式 在安装好python后&#xff0c;有两种方式可以执行命令&#xff1a; 命令行程序文件&#xff0c;后缀名为.py 对于命令行&…

Javaweb day17 day18 day19

mysql-DDL 数据库操作 写法 客户端工具 &#xff08;也可以使用idea&#xff09; 表 写法 约束 数据类型 案例 写法 表的查询修改删除 写法 删除

鲸鱼优化算法双馈风电机组一次调频三机九节点虚拟惯量下垂控制DFIG matlab/simulink

以频率偏差变化最小为优化目标&#xff0c;采用鲸鱼算法优化风电机组一次调频控制系数。 采用matlab.m文件与simulink.slx文件联合。 系统频率优化结果 鲸鱼算法 时域模型

[MTK6771] android13系统启用OMAPI 支持esim.me

OMAPI是啥&#xff1f;看看谷歌的解释&#xff1a; 说了一大堆懂的人不需要看&#xff0c;不懂的还是看不懂&#xff0c;我就是后者 总之说人话就是&#xff0c;像SIM卡&#xff0c;NFC这类模块需要用到这个东西&#xff0c;那么接着往下看 上层APP想要使用这个OMAPI供应商稳…

C语言-strtok(切片的使用)

strtok&#xff08;切片的使用&#xff09; 使用规则 使用的基本情况 strcpy 第二次调用的时候传的是空指针 所以打印出来的是 每一次调用函数都会把当前函数的地址记住 所以二次调用的时候 传的是null 连起始位置都不传了 只是传null 但是需要知道的是 当知道三段 你调用第…

Golang高效流控实践

流控对于构建高可靠弹性系统至关重要&#xff0c;本文介绍了Golang内置的流控组件&#xff0c;通过该组件就可以打造适合各种业务场景的流控系统。原文: Rate Limiting in Go: Controlling Traffic with Efficiency[1] Jon Cellier Unsplash 导言 流控(Rate limiting)是构建可扩…

element-plus怎么修改表单中的label字体颜色及大小

问题描述&#xff1a; 当我们在vue3中使用element-plus组件库提供的表单组件时&#xff0c;有时我们需要修改表单中label的字体颜色等属性&#xff0c;这是如果直接选中label的class进行修改是不起作用的&#xff0c;我们只需深度选择即可选中并进行修改。 比如&#xff1a; …

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

旋转花键的制造工艺

旋转花键的制造工艺是一门精细的技术&#xff0c;涉及多个步骤和精细的操作&#xff0c;以确保最终产品的质量和性能&#xff0c;下面简单介绍下旋转花键的制造工艺。 1、原材料准备&#xff1a;制造旋转花键的核心是选择合适的材料&#xff0c;根据花键的规格和性能要求&#…

lftp服务与http服务(包含scp服务)详解

目录 前言: 1.lftp服务 1.1lftp服务的介绍以及应用场景 1.2安装lftp服务 1.2进行配置 1.3实际操作 2.http服务 2.1http服务介绍以及应用场景 2.1安装httpd服务 2.2进行配置 2.3实际操作 3.scp服务 3.1scp服务的介绍以及应用场景 致谢: 前言: 在当今互联网…

由浅到深认识C语言(11):结构体

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

一起学数据分析_2

写在前面&#xff1a;代码运行环境为jupyter&#xff0c;如果结果显示不出来的地方就加一个print()函数。 一、数据基本处理 缺失值处理&#xff1a; import numpy as np import pandas as pd#加载数据train.csv df pd.read_csv(train_chinese.csv) df.head()# 查看数据基本…

数据结构的概念大合集01(含数据结构的基本定义,算法及其描述)

概念大合集01 1、数据结构基础的定义2、数据结构2.1 数据元素之间关系的集合2.2数据结构的三要素2.2.1数据的逻辑结构2.2.2数据的存储&#xff08;物理&#xff09;结构2.2.3数据的运算 3、数据类型4、抽象数据类型类型&#xff08;ADT&#xff09;5、算法及其描述5.1算法的5个…

NCV4275CDT50RKG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能

产品概述&#xff1a; NCV4275C 是一款低漏稳压器&#xff0c;可用于严酷汽车环境。它包括了较宽的运行温度范围和输出电压范围。输出调节为 5.0 V 或 3.3 V&#xff0c;额定输出电流为 450 mA。它还提供过电流保护、超温保护和可编程微处理器重置等多种功能。NCV4275C 采用 D…

观察者模式的理解和引用

1.前言 在之前的H5小游戏中&#xff0c;对于长连接发送的不同类型数据包的处理&#xff0c;是通过switch语句进行处理的&#xff0c;于是在自己的代码中出现了大量的case分支&#xff0c;不方便进行维护和后期的版本迭代。于是在老师的指导下&#xff0c;开始寻求使用观察者模…

互动投影游戏如何为科普教育馆带来更加生动有趣的科普体验?

近年科普教育馆在数字多媒体技术的支持下&#xff0c;让更多的家长和孩子注意到这一展示场景&#xff0c;尤其是对孩子来说&#xff0c;这里不仅是一个扩展知识的场景&#xff0c;更是一个发掘自我、探索未知世界的地方&#xff0c;而在这个过程中&#xff0c;多媒体互动技术的…