STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序
2025-01-16 来源:jianshu
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微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




