STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序

发布者:快乐舞步最新更新时间:2025-01-16 来源: jianshu关键字:STM32  IIC读取  MPU6050  陀螺仪  芯片数据 手机看文章 扫描二维码
随时随地手机看文章

1  简 介

最近,想学角度融合算法在网上买一个JY61的模块。他们家的模块用起来还不错。模块分为串口通讯和IIC通讯的。串口读取数据他们家有例程,我就不说了。想分享给大家这个模块的IIC是怎么去读取MPU6050芯片数据的。

作读取寄存器。大致过程就是STM32和MPU6050先建立好IIC通讯。再去初始化MPU6050芯片。然后单片机再去读取寄存器,就能把数据读取出来了。


2  配置32单片机的IIC引脚

根据你32单片机的原理图,找到你的IIC引脚。


a 时钟RCC的配置

自己写的为例子。

b GPIO口的配置


注意:SCL和SDA都得接上两个4.7K的电阻。不然你是读取不到MPU6050的数据。

c 32的IIC的配置


3  初始化 MPU6050

void MPU6050_Initialize()

{

MPU6050_I2C_ByteWrite(0xd0,0x00,MPU6050_RA_PWR_MGMT_1);

MPU6050_I2C_ByteWrite(0xd0,0x07,MPU6050_RA_SMPLRT_DIV);

MPU6050_I2C_ByteWrite(0xd0,0x06,MPU6050_RA_CONFIG);

MPU6050_I2C_ByteWrite(0xd0,0x01,MPU6050_RA_ACCEL_CONFIG);

MPU6050_I2C_ByteWrite(0xd0,0x18,MPU6050_RA_GYRO_CONFIG);

}

注意:0xD0 表示 MPU6050 的地址。MPU6050有 8 位的地址,前 7 位由 WHO AM I 确定,第 8 位由 AD0 的电平决定。WHO AM I 默认值是 0x68H(1101000B),AD0 接低电平,所以 MPU6050 的 I2C 地址是 0xD0H(11010000B)。


4  核心读取程序

总结: 发送开始信号 -> 起始成功? -> 发送 MPU6050 地址、状态(写)-> 写地址成功? -> 发送 MPU6050内部某个待写寄存器地址 -> 发送成功? -> 发送要写入的内容 -> 发送成功? -> 发送结束信号

void MPU6050_I2C_BufferRead(u8 slaveAddr, u8* pBuffer, u8 readAddr, u16 NumByteToRead)

{

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

I2C_GenerateSTART(I2C1, ENABLE);//发送开始条件

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上测试并清除

I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter); //发送MOU6050地址进行写操作

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//在EV6上测试并清除

I2C_Cmd(I2C1, ENABLE);//通过再次设置PE位来清除EV6

I2C_SendData(I2C1, readAddr);//发送MPU6050的内部地址来写入

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//在EV8上测试并清除

I2C_GenerateSTART(I2C1, ENABLE);//第二次发送STRAT条件

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上测试并清除

I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Receiver);//发送MPU6050地址进行写操作

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//在EV6上测试并清除

while(NumByteToRead)//当有数据被读取到的时候

{

if(NumByteToRead == 1)

{

I2C_AcknowledgeConfig(I2C1, DISABLE);//Acknowledge不使能

I2C_GenerateSTOP(I2C1, ENABLE);//发送停止条件

}

if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))//在EV7上测试并清除

{

*pBuffer = I2C_ReceiveData(I2C1);//从MPU6050读取一个字节

pBuffer++;//指向将保存读取的字节的下一个位置

NumByteToRead--;//读取字节计数器减一

}

}

I2C_AcknowledgeConfig(I2C1, ENABLE);//启用确认以准备再次接收

}


关键字:STM32  IIC读取  MPU6050  陀螺仪  芯片数据 引用地址:STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序

上一篇:单片机stm32直流电机驱动与测速学习笔记
下一篇:【STM32学习笔记6.1】USART基本概念

推荐阅读最新更新时间:2026-03-25 11:02

STM32IIC通讯升级版--SHT30温湿度读取
针对上篇文章对于程序可移植性不强的问题进行优化,基本思路是首先搭建好IIC底层驱动程序,该程序可用于任何IIC通讯设备,然后针对不同的IIC设备单独编写应用程序,本篇文章仍以SHT30为例。 一、IIC底层驱动之myiic.h #ifndef __MYIIC_H #define __MYIIC_H #include sys.h //IO方向设置 #define SDA_IN() {GPIOC- CRH&=0XFFFF0FFF;GPIOC- CRH|=8 12;} #define SDA_OUT() {GPIOC- CRH&=0XFFFF0FFF;GPIOC- CRH|=3 12;} //IO操作函数
[单片机]
<font color='red'>STM32</font>之<font color='red'>IIC</font>通讯升级版--SHT30温湿度<font color='red'>读取</font>
STM32IIC基本原理(实例:普通IO口模拟IIC时序读取24C02)
IIC的基本介绍 IIC的简介 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。它是半双工通信方式。 IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。 IIC总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
[单片机]
【<font color='red'>STM32</font>】<font color='red'>IIC</font>基本原理(实例:普通IO口模拟<font color='red'>IIC</font>时序<font color='red'>读取</font>24C02)
STM32F103通过IIC总线读取EEPROM
IIC总线是常用的串行总线,它只需要简单的两根线就可以实现数据的高速传输,同时还可以实现多机通信功能。 在单片机中用的比较多的就是通过IIC总线操作EEPROM芯片。比较常用的EEPROM芯片就是24Cxx系列的芯片,主要用来存储系统运行过程中的关键数据。 要操作这个芯片的话,必须按照一定的时序去读写。这个时序通常被称为通信协议。24Cxx系列芯片通信协议如下。 I2 C 总线协议 I 2 C 总线协议定义如下: 只有在总线空闲时才允许启动数据传送 在数据传送过程中 当时钟线为高电平时 数据线必须保持稳定状态 不允许有跳变 时钟线为高电平时 数据线的任何电平变化将被看作总线的起始或停止信号。 起始信号
[单片机]
STM32F103通过<font color='red'>IIC</font>总线<font color='red'>读取</font>EEPROM
IIC总线读取E2PROM存储器数据
简单介绍一下I2C总线原理:         IIC总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。       IIC总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 (记住这个就够了,其他都是废话!)       II C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 注意到IIC总线是需要接上拉电阻的!因为连到IIC总线的器件的输出基本为开漏输出.   起始和终止信号 :SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL
[嵌入式]
STM32实现MPU6050原始数据读取
最近项目组在做自主导航的小车,需要读取底盘的姿态,所以准备往上面加mpu6050,于是整理了这样的文档供以后学习,程序是在正点原子的库上更改的。 1.了解MPU6050 MPU-60x0 是全球首例 9 轴运动处理传感器。它集成了 3 轴MEMS陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion Processor)。 MPU-60x0 对陀螺仪和加速度计分别用了三个 16 位的 ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为 ±250,±500,±1000,±2000°/秒(dps),加速度计可测范围
[单片机]
stm32专题二十七:MPU6050介绍
MPU6050介绍 (1)飞行姿态 (2)三种常用的坐标系 抽象来说,姿态是“载体坐标系”与“地理坐标系”之间的转换关系。 地球坐标系:就是以地球球心的三维坐标系; 地理坐标系:就是日常生活中的东南西北; 载体坐标系:基于载体本身姿态的坐标系; 三种坐标系的描述: 关于欧拉角:这些角度也称欧拉角,是用于描述姿态的非常直观的角度。 关于载体坐标系和地理坐标系的转换: (3)传感器介绍: MEMS:微机电系统(MEMS, Micro-Electro-Mechanical System),也叫做微电子机械系统、微系统、微机械等,指尺寸在几毫米乃至更小的高科技装置。 (4)陀螺仪 使用陀
[单片机]
<font color='red'>stm32</font>专题二十七:<font color='red'>MPU6050</font>介绍
mpu6050 +STM32 休眠唤醒问题+低功耗
这几天在调STM32+MPU6050实现 低功耗唤醒功 功能描述: 1. 平时没有数据的时候,mcu处于 stop模式下, 2. 利用RTC实现定时唤醒, 3.以上功能中已经实现 mcu低功耗唤醒 及RTC定时唤醒。 下一步要尝试 mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态 如果有朋友也在做 mpu6050低功耗唤醒单片机的功能希望能够一起交流。 这里附上qq :1812669090 如果 要低功耗 和定时唤醒的代码欢迎和我联系 首先说一下STM32低功耗模式 这张表意思看一下就行,我这里用的是停止模式,理由很简单,任一中断都能唤醒,只不过唤醒后的配置相对待机模式要麻烦一点。
[单片机]
<font color='red'>mpu6050</font> +<font color='red'>STM32</font> 休眠唤醒问题+低功耗
MPU6050工作原理及STM32控制MPU6050
一·简介: 1.要想知道MPU6050工作原理,得先了解下面俩个传感器: ①陀螺仪传感器: 陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。我们骑自行车其实也是利用了这个原理。轮子转得越快越不容易倒,因为车轴有一股保持水平的力量。现代陀螺仪可以精确地确定运动物体的方位的仪器,它在现代航空,航海,航天和国防工业中广泛使用的一种惯性导航仪器。传统的惯性陀螺仪主要部分有机械式的陀螺仪,而机械式的陀螺仪对工艺结构的要求很高。70年代提出了现代光纤陀螺仪的基本设想,到八十年代以后,光纤陀螺仪就得到了
[单片机]
<font color='red'>MPU6050</font>工作原理及<font color='red'>STM32</font>控制<font color='red'>MPU6050</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved