STM32实现硬件I2C通讯,读取MPU6050的ID号

news2025/2/26 19:43:55

今天学习了使用硬件I2C的方式成功读取MPU6050的ID号,特此记录一下过程:

首先需要学习的是MPU6050的初始化:

第一步:打开GPIOB的时钟(因为I2C2的引脚10,11在GPIOB上)

第二步:打开I2C2的时钟

第三步:初始化GPIO。

第四步:初始化I2C2。

第五步:开启I2C2。

下面学习的就是指定MPU6050的寄存器地址写数据的函数:
第一步:行成起始条件

第二步:等待EV5事件

第三步:发送7位地址(方向:发送者)

第四步:等待EV6事件(发送完成)

第五步:发送寄存器地址

第六步:等待EV8事件(正在发送)

第七步:发送数据

第八步:等待EV8_2事件(发送完成)

第九步:行成停止条件。

再下面学习的就是指定MPU6050的寄存器地址读数据的函数:

第一步:行成起始条件

第二步:等待EV5事件

第三步:发送7位地址(方向:发送者)

第四步:等待EV6事件(发送完成)

第五步:发送寄存器地址

第六步:等待EV8事件(发送完成)

第七步:再次行成起始条件

第八步:等待EV5事件

第九步:发送7位地址(方向:接收模式)最后一位是接收模式

第十步:等待EV6事件(接收完成标志)

第十一步:应答位给非应答

第十二步:行成终止条件

第十三步: 等待EV7事件(接收完成)

第十四步:提取接收到的数据

第十五步:应答位给应答(回复默认值)

最后就是读取MPU6050的ID号了,MPU6050的ID号存在MPU650的寄存器地址为0x75,读取这个地址中的值就是ID号了。

下面把整个文件展示一下:

#include "stm32f10x.h"                  // Device header
#include "MPU6050.h"

#define MPU6050_ADDRESS                  0xD0
#define GPIO_POART                       GPIOB
#define SCL                              GPIO_Pin_10
#define SDA                              GPIO_Pin_11
#define GPIO_CLOCK                       RCC_APB2Periph_GPIOB
#define I2C_CLOCK                        RCC_APB1Periph_I2C2

void MPU6050_WriteReg(uint8_t Address, uint8_t Data)
{
	I2C_GenerateSTART(I2C2, ENABLE);                                     // 行成起始条件
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !=SUCCESS );// 等待EV5事件
	
	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter);       // 发送7位地址(方向:发送者)
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) !=SUCCESS );// 等待EV6事件(发送完成)
	
	I2C_SendData(I2C2, Address);                                                   //发送寄存器地址
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING) !=SUCCESS );// 等待EV8事件(正在发送)
	
	I2C_SendData(I2C2, Data);                                                   //发送数据
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED) !=SUCCESS );// 等待EV8_2事件(发送完成)
	
	I2C_GenerateSTOP(I2C2, ENABLE);                                        //行成停止条件
}


uint8_t MPU6050_ReadReg(uint8_t Address)
{
	uint8_t Data;
	
	I2C_GenerateSTART(I2C2, ENABLE);                                     // 行成起始条件
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !=SUCCESS );// 等待EV5事件
	
	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter);       // 发送7位地址(方向:发送者)
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) !=SUCCESS );// 等待EV6事件(发送完成)
	
	I2C_SendData(I2C2, Address);                                                   //发送寄存器地址
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED) !=SUCCESS );// 等待EV8事件(发送完成)
	
	I2C_GenerateSTART(I2C2, ENABLE);                                     // 行成起始条件
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) !=SUCCESS );// 等待EV5事件
	
	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Receiver);       // 发送7位地址(方向:接收模式)
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) !=SUCCESS );// 等待EV6事件(接收完成标志)
	
	I2C_AcknowledgeConfig(I2C2, DISABLE);                                   // 应答位给非应答
	I2C_GenerateSTOP(I2C2, ENABLE);                                          // 行成终止条件
	
	while(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED) !=SUCCESS );// 等待EV7事件(接收完成)
	Data = I2C_ReceiveData(I2C2);                                          //提取接收到的数据
	
	I2C_AcknowledgeConfig(I2C2, ENABLE);                                  // 应答位给应答
	
	return Data;                                                            //返回接收到的数据
}



void MPU6050_Init(void)
{
	RCC_APB2PeriphClockCmd(GPIO_CLOCK, ENABLE);  //第一步:打开GPIOB的时钟(因为I2C2的引脚10,11在GPIOB上)
	RCC_APB1PeriphClockCmd(I2C_CLOCK, ENABLE);   //第二步:打开I2C2的时钟
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStruct.GPIO_Pin = SCL | SDA;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_POART, &GPIO_InitStruct);        // 第三步:初始化GPIO。
	
	I2C_InitTypeDef I2C_InitStruct;
	I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
	I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitStruct.I2C_ClockSpeed = 100000;
	I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_16_9;
	I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStruct.I2C_OwnAddress1 = 0x00;
	I2C_Init(I2C2, &I2C_InitStruct);           // 第四步:初始化I2C2。
	
	I2C_Cmd(I2C2, ENABLE);                //第五步:开启I2C2。
}

uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(0x75);
}

这样就形成了最终的结果:

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

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

相关文章

09 MySQL--操作真题

1. 用一条 SQL 语句&#xff0c;查询出每门课程都大于 80 分的人。 分析&#xff1a; 去重查询出存在课程小于 80 分的人&#xff0c;设为集合A查询不在集合 A 中的人 # 第一步&#xff1a;找小于等于80分的学员姓名 select distinct name from t_student where fenshu <…

[Algorithm][滑动窗口][水果成篮][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解

目录 1.水果成篮1.题目链接2.算法原理讲解3.代码讲解 2.找到字符串中所有字母异位词1.题目链接2.算法原理讲解3.代码实现 3.串联所有单词的字串1.题目链接2.算法原理讲解3.代码实现 3.最小覆盖字串1.题目链接2.算法原理讲解 1.水果成篮 1.题目链接 水果成篮 2.算法原理讲解 …

Docker in Docker的原理与实战

Docker in Docker&#xff08;简称DinD&#xff09;是一种在Docker容器内部运行另一个Docker实例的技术。这种技术允许用户在一个隔离的Docker容器中创建、管理和运行其他Docker容器&#xff0c;从而提供了更灵活和可控的部署选项。以下是DinD的主要特点&#xff1a; 隔离性&am…

【工厂模式】工厂方法模式、抽象工厂模式-简单例子

简单工厂模式&#xff0c;请跳转到我的另一篇博客【工厂模式】简单工厂模式-简单例子-CSDN博客 四、工厂方法模式 &#xff08;1&#xff09;这部分还是不变&#xff0c;创建一个Car接口&#xff0c;和两个实现类。 public interface Car {void name(); }public class WuLing…

文献补充材料怎么查找获取

最近很多同学求助外文文献补充材料&#xff0c;有的同学在学校提供的资源中能找到全文却无法下载文献的补充材料&#xff0c;这是因为该校只收录了全文而没有收录补充材料。那么文献补充材料怎么查找又如何获取呢&#xff1f;请看本文的经验分享&#xff1a; 1、文献的补充材料…

在Linux系统中搜索当前路径及其子目录下所有PDF文件中是否包含特定字符串

目录标题 方法一&#xff1a;pdfgrep方法二&#xff1a;使用find和xargs与pdftotext&#xff08;将PDF转换为文本&#xff09;组合&#xff0c;然后用grep搜索 方法一&#xff1a;pdfgrep pdfgrep -ri "rockchip" .方法二&#xff1a;使用find和xargs与pdftotext&am…

Yolov8项目实践——基于yolov8与OpenCV实现目标物体运动热力图

概述 在数据驱动和定位的世界中&#xff0c;对数据进行解释、可视化和决策的能力变得日益重要。这表明&#xff0c;使用正确的工具和技术可能是项目成功的关键。在计算机视觉领域&#xff0c;存在许多技术来解释从视频&#xff08;包括录像、流媒体或实时视频&#xff09;中获…

【HC32L110】华大低功耗单片机启动文件详解

本文主要记录华大低功耗单片机 HC32L110 的 汇编启动过程&#xff0c;包括startup_hc32l110启动文件详细注释 目录 1.启动文件的作用2.堆栈定义2.1 栈2.2堆 3.向量表4.复位程序5.中断服务程序6.堆栈初始化启动过程详解7.1从0地址开始7.2在Reset_Handler中干了啥&#xff1f; 8.…

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

python_django中小学家校互动系统vue_flask家校联系

实现了一个完整的家校互动系统&#xff0c;其中主要有作业信息模块、学校管理员模块、学生学籍模块、学生成绩模块、学科模块、系统新闻模块、系统公告模块、校内新闻模块、校内公告模块、用户表模块、token表模块、关于我们模块、收藏表模块、年级模块、家长模块、教师模块、互…

openlayers学习(一)

首先感谢大佬们写的文章&#xff0c;博客链接已在文章最后贴出&#xff0c;在接下来的内容中&#xff0c;我将会引用其中的一些定义结论。 之前文章写过一个Arcgis api for js的小demo&#xff0c;openlayers项目代码就继续在写这个小demo框架上。 openlayers官网 初始化地图…

Flink学习(六)-容错处理

前言 Flink 是通过状态快照实现容错处理 一、State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。 一种基于 RocksDB 内嵌 key/value 存储将其工作状态保存在磁盘上&#x…

聚观早报 | 华为Pura70系列先锋计划;月之暗面升级Kimi

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月19日消息 华为Pura70系列先锋计划 月之暗面升级Kimi OPPO Find X7将推白色版本 波士顿动力推出人形机器人 v…

sql-labs(1-8关)

mysql数据结构 在练习靶场前我们需要了解以下mysql数据库结构&#xff0c;mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有…

面试: Hashtable vs ConcurrentHashMap

一、Hashtable和ConcurrentHashMap的不同和相同点 Hashtable 与 ConcurrentHashMap 都是线程安全的Map 集合。Hashtable 并发度低&#xff0c;整个Hashtable对应一把锁&#xff0c;同一时刻&#xff0c;只能有一个线程操作它。1.8之前ConcurrentHashMap使用了Segment 数组&…

爱普生发布一款16位MCU产品用于大电流LED驱动

精工爱普生发布一款内置Flash存储器的16位微控制器S1C17M13 该新品可以提供最大56mA的驱动电流用于驱动发光二极管(LED) 以往爱普生的微处理器大多继承了液晶驱动器电路&#xff0c;但近来随着工业自动化和家用设备使用7段LED显示的数量大幅增加&#xff0c;爱普生也推出了对应…

pdf加水印怎么加?自己原创的PDF资料分享到网络上需要采取一些版权保护的措施,添加水印就是个不错的选择

一&#xff0c;水印的基本概念 水印通常是一种用于标识文件来源、版权信息或防止非法复制的标记。它可以是文字、图形或图像等形式&#xff0c;以半透明或半淡化的方式嵌入到文件中&#xff0c;既不影响文件的正常阅读&#xff0c;又能起到标识和保护的作用。 二&#xff0c;…

如何查看Debian Linux的内核版本

2024年4月19日&#xff0c;周五上午 uname -r

测试数据整理--chatgpt 构造sql语句导出数据库数据

在测试过程中&#xff0c;我们有时候需要准备一些测试数据&#xff0c;若从系统中直接导出Excel数据&#xff0c;数据往往庞大且需要整合&#xff0c;不好整理&#xff0c;于是我们直接去数据库中查询一些表&#xff0c;数据整合后直接导出结果会更方便。 我们今天就 用 chatg…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + 星秒PAVO2单线激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;好久不见&#xff0c;最近这断时间出现了一点变故&#xff0c;开始自己创业&#xff0c;很多事需要忙&#xff0c;所以停更了大约大半年&#xff0c;最近一切已经理顺&#xff0c;所以我还是抽空继续我之前的FLAG&#xff0c;CSDN突破十…