ESP32 IDF iic通信( 已验证) C语言

这篇具有很好参考价值的文章主要介绍了ESP32 IDF iic通信( 已验证) C语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于iic原理建议B站自己看视频去,

然后本文主要实现了esp32的初始化, 写地址, 写数据, 读数据的功能, 从机的代码因为展示不需要,没写.

园子里面有个兄弟写了iic的代码.但是里面有点毒,多发了次地址验证,所以才有这篇文章;

代码注释比较多, 愿君少走弯路❀

以下是头文件主要参数代码:文章来源地址https://www.toymoban.com/news/detail-776811.html

#include "driver/i2c.h"
#include "freertos/portmacro.h"
#define I2C_NUM I2C_NUM_0
#define I2C_MATER_READ (0x1) // 主机进行读操作,从机进行写操作
#define I2C_MATER_WRITE (0x0) // 主机进行写操作,从机进行读操作
#define ACK_VAL (0x0) // 主机读取时的应答信号(应答)
#define NACK_VAL (0x1) // 主机读取时的应答信号(不应答)
#define portTICK_RATE_MS portTICK_PERIOD_MS //防止报错
 
 
以下为iic初始化函数代码:
 
/*
 * @brief 初始化I2C配置;
 * @param I2C_SCL_Frequency 为i2c的时钟频率 ,一般模式为100 000(100k);
 * @param SCL & SDA 为I2C配置的引脚,允许任意IO口,可直接输入对应的IO口序号,如 19 ,20
 * @return err 为esp特有的报错指南?还没搞得很懂,反正是为了方便调试的;
 */
esp_err_t esp32_i2c_init(char SCL , char SDA , int I2C_SCL_Frequency)
{
        // 初始化I2C配置
        i2c_config_t i2c_config = {
                .mode = I2C_MODE_MASTER, // 设置i2c模式
                .sda_io_num = SDA, // 设置SDA引脚
                .scl_io_num = SCL, // 设置SCL引脚
                .sda_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能
                .scl_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能
                .master.clk_speed = I2C_SCL_Frequency, // 设置时钟频率xxxbit
                // .clk_flags = 0,
        };
        // 设置I2C
        i2c_param_config(
                I2C_NUM,
                //配置参数初始化,此函数内部就是将i2c_config 中的相关参数 填入到 "I2c_NUM "对应的结构体中。
                &i2c_config);
        // 注册I2C服务及使能  (安装 I2C 驱动程序后, ESP32 即可与其他 I2C 设备通信。)
        esp_err_t err = i2c_driver_install(
                I2C_NUM, i2c_config.mode, 0, 0,
                0); //初始化配置以外的所有相关参数,将配置写入寄存器
        return err; //可以直接访问esp32_i2c_init的返回值 即可知道,驱动是否安全完成.
}
 
以下是写地址函数::
/*
 * @brief 进行I2C第一个Byte的写操作(指主机在公屏call对应的从机);
 * @param SlaveAddr 为i2c从机的地址,代码未做自动移位处理;
 * @param endbit 为写入的最后一个bit,肩负着告诉从机接下来是发送数据还是接收数据(I2C_MATER_READ || I2C_MATER_WRITE)
 * @return 0; 暂时没想到有什么需要返回的
 * @property 有已经封装好的函数有对应每8bit进行应答的操作,所以后续开发不需要在意iic协议本身
 * @exception vscode 可能会提示portTICK_RATE_MS 为未定义标识符,可以别管能编译通过
 */
char i2c_write_addr(char SlaveAddr, char end_bit)
{
        //创建i2c_cmd_handle_t对象
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();
        //添加各种子数据帧
        i2c_master_start(cmd); //向cmd对象添加起始信号
        i2c_master_write_byte(
                cmd, (SlaveAddr) | end_bit,
                true); //向cmd对象添加从机r地址及读写位 ack(true)为检测slave答应
        //i2c_master_write(cmd, bytes, datalen, true);  //向cmd对象添加数据位(数组)
        i2c_master_stop(cmd); //向cmd对象添加终止信号
        //向I2C_NUM 发送这个数据帧cmd,
        i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS);
        //删除i2c_cmd_handle_t对象,释放资源
        i2c_cmd_link_delete(cmd);
        return 0;
}

以下是写数据函数(8bits):
/*
 * @brief 进行I2C第一个Byte的写操作(指主机在公屏call对应的从机);
 * @param SlaveAddr 为i2c从机的地址,代码未做自动移位处理;
 * @param endbit 为写入的最后一个bit,肩负着告诉从机接下来是发送数据还是接收数据(I2C_MATER_READ || I2C_MATER_WRITE)
 * @return 0; 暂时没想到有什么需要返回的
 * @property 有已经封装好的函数有对应每8bit进行应答的操作,所以后续开发不需要在意iic协议本身
 * @exception vscode 可能会提示portTICK_RATE_MS 为未定义标识符,可以别管能编译通过
 */
char i2c_write_to_slave(char SlaveAddr, char endbit, char data)
{
        //创建i2c_cmd_handle_t对象
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();
        //添加各种子数据帧
        i2c_master_start(cmd); //向cmd对象添加起始信号
        i2c_master_write_byte(
                cmd, (SlaveAddr) | endbit,
                true); //向cmd对象添加从机r地址及读写位 ack(true)为检测slave答应
        i2c_master_write_byte(cmd, data, true); //向cmd对象添加数据位(数组)
        i2c_master_stop(cmd); //向cmd对象添加终止信号
        //向I2C_NUM 发送这个数据帧cmd,
        i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS);
        //删除i2c_cmd_handle_t对象,释放资源
        i2c_cmd_link_delete(cmd);
        return 0;
}
 
以下是读数据函数:
/*
 * @brief 进行I2C两个Byte的读操作;
 * @param SlaveAddr 为i2c从机的地址,代码已做自动移位处理;
 * @param endbit 为写入的最后一个bit,肩负着告诉从机接下来是发送数据还是接收数据(I2C_MATER_READ || I2C_MATER_WRITE)
 * @return readvalue 为读取的16bit数据,(正常顺序)
 * @property 有已经封装好的函数有对应每8bit进行应答的操作,所以后续开发不需要在意iic协议本身
 * @exception vscode 可能会提示portTICK_RATE_MS 为未定义标识符,可以别管能编译通过
 */
uint16_t i2c_read_slave(char SlaveAddr, char endbit)
{
        static uint8_t readvalue1 = 0; //切记搞成static的,不然会灵异读取
        static uint8_t readvalue2 = 0; //切记搞成static的,不然会灵异读取
        static uint16_t readvalue = 0;
        esp_err_t err = ESP_OK;

        //创建i2c_cmd_handle_t对象
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();

        i2c_master_start(cmd); //向cmd对象添加起始信号
        i2c_master_write_byte(
                cmd, (SlaveAddr << 1) | endbit,
                true); //向cmd对象添加从机地址及读写位 ack(true)为检测slave答应
        //******开始读数据操作:总共读16bit*****//
        err = i2c_master_read_byte(cmd, &readvalue1, ACK_VAL);
        err = i2c_master_read_byte(cmd, &readvalue2, NACK_VAL);
        if (err != ESP_OK) {
                goto end;
        }

        i2c_master_stop(cmd); //向cmd对象添加终止信号
        //向I2C_NUM 发送这个数据帧cmd,
        i2c_master_cmd_begin(I2C_NUM, cmd, 1000 / portTICK_RATE_MS);
        //删除i2c_cmd_handle_t对象,释放资源
end:
        i2c_cmd_link_delete(cmd);
        readvalue = readvalue1 << 8 | readvalue2;
        return readvalue;
}
 

到了这里,关于ESP32 IDF iic通信( 已验证) C语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32开发:1、环境搭建(基于vscode+ESP-IDF)

    ESP-IDF提供操作ESP32芯片的API函数,供用户编写的用户程序调用。当用户程序编写好后,ESP-IDF需要借助一系列编译工具才能将用户程序+API函数编译成能运行在ESP32上的二进制文件。 如上图所示这个1个G左右大的压缩包就是ESP-IDF。如果电脑上已经存在了这个文件,就可以不用下

    2024年02月12日
    浏览(54)
  • 【ESP32】Espressif-IDE及ESP-IDF安装

    1.打开ESP-IDF 编程指南 2.点击快速入门–安装–手动安装–Windows Installer–Windows Installer Download 3.点击下载Espressif-IDE 2.10.0 with ESP-IDF v5.0.2 1.双击安装 espressif-ide-setup-2.10.0-with-esp-idf-5.0.2.exe 2.点击“确定” 3.选择“我同意此协议(A)”,点击“下一步” 4.点击“下一步” 5.点击“

    2024年02月15日
    浏览(60)
  • ESP-IDF开发框架添加自定义组件 ESP32-C3

    因为熟悉了STM32的开发方式,同时随着项目文件越来越多,可以将自己写的代码分模块添加到工程中,下面分析如何将自己写的组件添加到工程中使其能够正常编译运行。 在ESP-IDF中,构建,编译,以及下载都是通过idf.py脚本来实现的,该脚本使用 CMake,配置待构建的项目 N

    2024年02月02日
    浏览(60)
  • ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门

    创作不易,转载请注明出处! Tips: 虽然笔者采用的是Linux开发环境,但是Windows开发环境的亦可阅读,所述内容与系统关联性不大,尤其是后文介绍的如何将自己的文件加入到工程,解决头文件找不到等问题,无论哪种系统均会存在。 Tips: 最近更新了一篇windows下搭建的,大家

    2024年02月02日
    浏览(50)
  • ESP32在ESP-IDF框架下使用LVGL(v8.3)

    VSCode + ESP-IDF 插件 说明: IDF版本为4.4.4 ,最新版的5.0.1弃用了些东西,而lvgl_esp32_drivers对5以上的版本未适配,所以 不建议使用5以上的版本 。 安装:安装教程,建议整体看完在进行安装,以免安装失败, 教程安装的是5.0.1,需要改为4.4.4 。 Arduino移植教程:点击此处 lvgl :g

    2023年04月16日
    浏览(65)
  • vscode+esp-idf 搭建esp32开发环境,编译信息中文乱码

    1.修改波特率 2.C:UsersAdministrator.vscodeextensionsvsciot-vscode.vscode-arduino-0.6.0-win32-x64outsrccommon  打开文件 util.js 屏蔽掉这部分的代码 、  

    2024年02月10日
    浏览(47)
  • ESP32 ESP-IDF + LVGL + SquareLine Studio 设计 UI 界面

    陈拓 2022/12/10-2022/12/12 关于SquareLine Studio,乐鑫官方的ESP技术文章有介绍: 在 ESP 开发板上开发 UI 不再复杂 - 知乎 如果您尝试过在没有图形库的情况下开发 UI,那么您一定知道这有多困难。幸运的是,由乐鑫芯片驱动的屏幕,可支持用户使用多种图形库来开发 UI, LVGL 就是其

    2024年01月19日
    浏览(59)
  • 【ESP32 IDF】用RMT控制 WS2812 彩色灯带

    在上一篇中,老周用 .NET Nano Framework 给大伙伴们演示了 WS2812 灯带的控制,包括用 SPI 和 红外RMT 的方式。利用 RMT 是一个很机灵的方案,不过,可能很多大伙伴对 ESP32 的 RMT 不是很熟悉。除了乐鑫自己的文档,没几个人写过相关的水文,可见这里头空白的水市场很充足,老周

    2024年04月22日
    浏览(65)
  • ESP32接入米家-小爱同学-IDF环境-巴法平台

    冬天床边没有开关,睡觉懒得关灯,想通过小爱同学控制灯的开关,但是不想换开关。 所以 想用ESP32接入米家,控制一个舵机实现开关控制。 Message Queuing Telemetry Transport,消息队列传输探测 ISO 标准下的一种基于发布-订阅模式的消息协议,基于 TCP/IP 协议簇,用于 IoT 即物联

    2024年01月20日
    浏览(53)
  • ESP32开发中常用的IDF指令【知道这些就足够了】

    一、清除 idf.py clean 会把构建输出的文件从构建目录中删除,从而清理整个项目。下次构建时会强制“重新完整构建”这个项目。清理时,不会删除 CMake 配置输出及其他文件。 idf.py fullclean 会将整个 build 目录下的内容全部删除,包括所有 CMake 的配置输出文件。下次构建项目

    2023年04月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包