【ESP32】调试IIC功能

news2024/9/23 3:23:02

1.创建示例项目i2c_simple:VSCODE中->“查看”->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(C:\Espressif\frameworks\esp-idf-v5.1)->弹出示例ESP-IDF Examples,选择peripherals->i2c->i2c_simple->Create project using example i2c_simple->选择示例保存的路径
在这里插入图片描述

在这里插入图片描述

2.选择esp32型号
3.选择COM口
4.选择烧录方式
5.点击“menuconfig”按键,根据ESP32技术参考手册中的IO_MUX Pad 列表,配置i2c引脚信息,点击保存
在这里插入图片描述

6.点击“编译”按键
7.点击“烧录”按键
8.点击“监控”按键,可以看到初始化和读取ADXL345测试打印正常(上图)
完整代码如下

/* i2c - Simple example

   Simple I2C example that shows how to initialize I2C
   as well as reading and writing from and to registers for a sensor connected over I2C.

   The sensor used in this example is a MPU9250 inertial measurement unit.

   For other examples please check:
   https://github.com/espressif/esp-idf/tree/master/examples

   See README.md file to get detailed usage of this example.

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"
#include "driver/gpio.h"

static const char *TAG = "i2c-simple-example";

#define I2C_MASTER_SCL_IO           CONFIG_I2C_MASTER_SCL      /*!< GPIO number used for I2C master clock */
#define I2C_MASTER_SDA_IO           CONFIG_I2C_MASTER_SDA      /*!< GPIO number used for I2C master data  */
#define I2C_MASTER_NUM              0                          /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
#define I2C_MASTER_FREQ_HZ          400000                     /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
#define I2C_MASTER_TIMEOUT_MS       1000

#define ADXL345_SENSOR_ADDR                 0x53        /*!< Slave address of the MPU9250 sensor */
/**
 * @brief i2c master initialization
 */
static esp_err_t i2c_master_init(void)
{
    int i2c_master_port = I2C_MASTER_NUM;

    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ,
    };

    i2c_param_config(i2c_master_port, &conf);

    return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}

/**
 * @brief 传感器电源开关
 */
static void sensor_switch(bool status)
{
    gpio_config_t conf = {
        .pin_bit_mask = 1 << GPIO_NUM_27,
        .mode = GPIO_MODE_OUTPUT,
        .pull_up_en = GPIO_PULLUP_ENABLE,
        .pull_down_en = GPIO_PULLUP_PULLDOWN,
        .intr_type = GPIO_INTR_DISABLE,
    };
    gpio_config(&conf);
    gpio_set_level(GPIO_NUM_27, status);
}

/**
 * @brief ADXL345初始化
 */
static esp_err_t ADXL345_Init(void)
{
    esp_err_t err = ESP_OK;
    uint8_t write_buffer[2] = {0} ;

    write_buffer[0] = 0x31; write_buffer[1] = 0x0B;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x2C; write_buffer[1] = 0x0A;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x2D; write_buffer[1] = 0x08;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x2E; write_buffer[1] = 0x80;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x1E; write_buffer[1] = 0x00;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x1F; write_buffer[1] = 0x00;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x20; write_buffer[1] = 0x01;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    write_buffer[0] = 0x2D; write_buffer[1] = 0x00;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    return err;
}

/**
 * @brief 连续读出ADXL345内部加速度数据,地址范围0x32~0x37
 */
static esp_err_t ADXL345_Get_Acc(float *ax,float *ay,float *az)
{
    esp_err_t err = ESP_OK;
    uint8_t write_buffer[2] = {0} ;
    int8_t acc_buffer[6] = {0} ;

    // //使能 DATA_READY 中断
    // write_buffer[0] = 0x2E; write_buffer[1] = 0x80;
    // err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    // if (err != ESP_OK) {
    //     return err;
    // }

    //唤醒
    write_buffer[0] = 0x2D; write_buffer[1] = 0x08;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    for(uint64_t i = 0; i < 100000; i++)
    {

    }

    write_buffer[0] = 0x32;
    err = i2c_master_write_read_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR, write_buffer, 1, (uint8_t *)acc_buffer, sizeof(acc_buffer), I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
    return err;
    }

    // //禁止 DATA_READY 中断
    // write_buffer[0] = 0x2E; write_buffer[1] = 0x00;
    // err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    // if (err != ESP_OK) {
    //     return err;
    // }

    //待机
    write_buffer[0] = 0x2D; write_buffer[1] = 0x00;
    err = i2c_master_write_to_device(I2C_MASTER_NUM, ADXL345_SENSOR_ADDR,write_buffer, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK) {
        return err;
    }

    for(uint8_t i = 0; i < sizeof(acc_buffer); i++)
    {
        ESP_LOGI(TAG, "acc_buffer[%d] = 0x%02X\r\n", i, acc_buffer[i]);
    }

    *ax = ((int)((acc_buffer[1] << 8) | acc_buffer[0]))*3.9/1000;//取出X轴数据,3.9LSB/mg
    *ay = ((int)((acc_buffer[3] << 8) | acc_buffer[2]))*3.9/1000;//取出Y轴数据,3.9LSB/mg
    *az = ((int)((acc_buffer[5] << 8) | acc_buffer[4]))*3.9/1000;//取出Z轴数据,3.9LSB/mg

    ESP_LOGI(TAG, "ax = %f, ay = %f, az = %f\r\n", *ax, *ay, *az);

    return err;
}

void app_main(void)
{
    sensor_switch(true);

    ESP_ERROR_CHECK(i2c_master_init());
    ESP_LOGI(TAG, "I2C initialized successfully");

    /* Read the MPU9250 WHO_AM_I register, on power up the register should have the value 0x71 */
    ESP_ERROR_CHECK(ADXL345_Init());
    ESP_LOGI(TAG, "ADXL345 initialized successfully");

    float ax = 0;
    float ay = 0;
    float az = 0;
    ESP_ERROR_CHECK(ADXL345_Get_Acc(&ax, &ay, &az));
    ESP_LOGI(TAG, "ADXL345 read successfully");
}

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

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

相关文章

<findbugs>静态代码分析工具

背景&#xff1a; IDEA安装的findbug插件目前无法和jenkins的扫描结果保持一致&#xff0c;因为&#xff1a;没有对应jenkins上findbug的版本&#xff1b; 原理&#xff1a; 将jenkins服务器上的findbugs插件&#xff0c;拷贝到本地&#xff0c;修改build.xml内容以匹配目录…

代码随想录算法训练营第五天| 242. 有效的字母异位词,349. 两个数组的交集,202快乐数,1. 两数之和

哈希表 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断…

cypress 教程

cypress 教程 cypress是一个用于Web应用程序的端到端测试框架。它是一个开源的js测试工具&#xff0c;设计的目的是Web应用程序的测试能更快速、简单和可靠。赛普斯允许开发人员编写模拟用户交互和验证应用程序行为的自动测试。 我们可以使用js或者ts来开发&#xff0c;但是j…

用牛鲨水豚赚取SUI的机会又来喽,500万SUI奖励等你来领!

刚刚结束的第一轮Bullshark Quest真是一次惊心动魄的体验&#xff01;我们非常感激社区成员的积极参与以及对Sui生态系统的关注。此轮获奖者的奖励已于美国时间2023年7月28日&#xff0c;在Quest门户网站上公布。参与者点击“Claim”即可将奖励领取至Sui钱包。请注意&#xff0…

猿创征文|弃文从工,从小白到蚂蚁工程师,我的 Java 成长之路

一、前言 1.1 背景 最近 CSDN 开展了猿创征文&#xff0c;希望博主写文章讲述自己在某个领域的技术成长历程。 之前也曾想找个机会写篇文章&#xff0c;记录下自己的成长历程。 因此&#xff0c;借着这个机会写下这篇文章。 在回顾自己的成长历程的同时&#xff0c;希望对一…

红队打靶:FourAndSix2.01打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;NFS渗透 第三步&#xff1a;7z压缩包的密码破解 第四步&#xff1a;ssh私钥登录 第五步&#xff1a;lessvi提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶&#xff0c;详述了…

基于Caffe的静默活体检测识别分析系统

周末的时候看到一个好玩的项目就想着实际拿来使用一下&#xff0c;这个项目主要是做的是开源的跟人脸活体检测相关的内容&#xff0c;这里主要采用的是静默活体检测的方式。 人脸静默活体检测是一种用于验证人脸是真实、活体的技术&#xff0c;而不需要进行任何口头指令或特定…

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息&#xff0c;与实际的主文件夹是否存在等信息&#xff0c; 还可以比对 /etc/passwd /etc/shadow 的信息是否一致&#xff0c;另外&#xff0c;如果 /etc/passwd 内的数据字段错…

Linux 给用户 赋某个文件夹操作的权限(实现三权分立)

Linux 给用户 赋某个文件夹操作的权限 这里用的ubuntu16.04 一、配置网站管理员 linux文件或目录的权限分为&#xff0c;读、写、可执行三种权限。文件访问的用户类别分为&#xff0c;文件创建者、与文件创建者同组的用户、其他用户三类。 添加用户 useradd -d /var/www/htm…

解密低价正规渠道的来源:影视会员肯德基点餐直充api接口

话费充值 接口已经整合移动、联通、电信三网话费充值渠道。话费可以说是全民所需&#xff0c;对于平台引流&#xff0c;增强平台日活跃度可以提供不小的帮助。 肯德基在线点餐 接口整合了各大城市的肯德基门店&#xff0c;支持门店选择&#xff0c;在线点餐 提前点餐领取&a…

linux系统编程重点复习--线程同步

目录 复习目标&#xff1a; 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标&#xff1a; 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…

Java基础篇_1.2——保留关键字、基本数据类型、基本数据类型之间的转换

​​​​​​​目录 一、保留关键字 二、Java的基本数据类型 三、引用数据类型 四、基本数据类型间的转换 隐含强制类型转换 一、保留关键字 Java该语言是用 Unicode 字符集编写的。 Java关键字是预先定义的具有特别意义的标识符&#xff0c;也被称为Java保留字&#xff0…

在k8s集群内搭建Prometheus监控平台

基本架构 Prometheus由SoundCloud发布&#xff0c;是一套由go语言开发的开源的监控&报警&时间序列数据库的组合。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的…

YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注

YOLOv8半自动标注 目标检测半自动标注的优点包括&#xff1a; 1.提高标注效率&#xff1a;算法能够自动标注部分数据&#xff0c;减少了人工标注的工作量&#xff0c;节省时间和资源。 2.降低成本&#xff1a;自动标注可以减少人工标注的成本&#xff0c;特别是对于大规模数据…

如何在线制作闪图?手把手教你快速生成GIF闪图

网上那种卟玲卟领的闪动GIF图片效果非常的炫丽&#xff0c;这种GIF闪图是怎么制作的呢&#xff1f;很简单&#xff0c;只需要使用专业的gif制作&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&#xff0c;上传多张颜色、大小不同&#xff0c;内容相同的jpg、png格…

ORB-SLAM3数据集配置与评价

在ORB-SLAM3运行EuRoC和TUM-VI数据集并作以评价。EuRoC利用微型飞行器(MAV ) 收集的视觉惯性数据集&#xff0c;TUM-VI 是由实验人员手持视觉-惯性传感器收集的数据集。这两个是在视觉SLAM中比较常用的公开数据集&#xff0c;所以测试并加以记录。 文章目录 一、EuRoC数据集测…

音频转文字软件免费版让你快速完成转换

音频转文字技术是一种将音频文件转换为文本形式的技术&#xff0c;它可以帮助人们更方便地获取和处理音频信息。在实际生活和工作中&#xff0c;我们可能会遇到需要将音频转换为文字的情况&#xff0c;比如听取会议录音、收听讲座、学习外语等等。那么&#xff0c;你知道音频转…

Tinkercad 建模21个小技巧

21个Tinkercad 建模小技巧 原文 参考文章&#xff1a;在 Tinkercad 中加快设计的 22 个技巧 一起来了解一下21个Tinkercad 3D建模小技巧&#xff0c;让你快人一步。 技巧1 Copy & Paste 文件&#xff0c;整合设计 想把文件A里面的模型拷贝到文件B里面&#xff1f; 很容…

【Linux命令200例】mren一个用于重命名文件或目录的命令行工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

msvcr100.dll丢失怎样修复?最新的三个修复方法可解决

最近我遇到了一个问题&#xff0c;电脑提示我缺少了msvcr100.dll文件&#xff0c;导致某些程序无法正常运行。这让我意识到了计算机中的一些系统文件的重要性&#xff0c;也让我体会到了修复这类问题的必要性。msvcr100.dll文件是Windows系统中重要的文件&#xff0c;这是一个动…