单片机
返回首页

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);//启用确认以准备再次接收

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章