STM32CubeIDE开发笔记7:IIC读取MPU6050

STM32CubeIDE开发笔记7:IIC读取MPU6050

    • IIC配置
    • I2C相关函数
    • 读取MPU6050寄存器的值
    • 关于使用DMP

本文链接:https://blog.csdn.net/qq_42038029/article/details/103851481
版权声明:本文为CSDN博主「遥望1415984987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
stm32CubeIDE所用版本:1.3.0
固件库包:f1 1.8.0
测试平台stm32c8t6
不得不说,IDE更新到1.3后体验改善了很多,编译下载的速度都快了很多,ST的生态打造确实做的好。

IIC配置

如图:
STM32CubeIDE开发笔记7:IIC读取MPU6050_第1张图片
配置两步就好了,如果外设不支持快速模式,就选择标准模式。就算是快速模式,也只是400kbps,相较于其他协议来说很慢了,虽说有些从机可以配置到更高的速度,cube这里暂时只有这两种模式,可以自己在代码里改配置到更高的速度。

I2C相关函数

我们可以在下面这个文件里找到相关的API:
STM32CubeIDE开发笔记7:IIC读取MPU6050_第2张图片
这些API有详细的注释,我们这此使用下面这个HAL_I2C_Mem_Read()函数读取MPU6050的寄存器的值;
STM32CubeIDE开发笔记7:IIC读取MPU6050_第3张图片
这个函数的几个参数简单说一下:

I2C_HandleTypeDef *hi2c:  使用的i2c的句柄;
uint16_t DevAddress:      目标设备的i2c的读地址,这里是8位,设备的i2c地址7位加一位读写地址;
uint16_t MemAddress:      目标设备要读取的寄存器的地址;
uint16_t MemAddSize:      寄存器的位数,0x01u位8位,0x10位16位,具体看库里的宏定义;
uint8_t *pData:           读出的数据存储的地址;    
uint16_t Size:            要读的数据大小;
uint32_t Timeout:         阻塞延时,根据自己情况设置

读取MPU6050寄存器的值

下面我们使用这个函数:

HAL_I2C_Mem_Read(&hi2c1, 0xD1, 0x75, I2C_MEMADD_SIZE_8BIT, &r, 1, 0xfff);

我们知道MPU6050的i2c地址是0x68,这是它的7位地址,这里使用的是它的读地址,0x68<<1+1=0xD1,读取的是它的0x75,根据它的数据手册,这个寄存器的值是它的地址0x68;’I2C_MEMADD_SIZE_8BIT的值是0x01,宏定义。r是用来存放读回来的值,需要先声明;我们调试看一下结果:
可以看到r的值为104d,也就是0x68h;
在这里插入图片描述

关于使用DMP

网上dmp库的使用都是移植官方的,这里我简单讲一下移植:
主要是把mpu6050.c的最后4个函数用HAL库改写就行。
其他有些小错误稍微改写一下就好了。
STM32CubeIDE开发笔记7:IIC读取MPU6050_第4张图片
如果初始化MPU6050不成功,有很多原因,如:
1.AD0接GND或是接VDD器件的I2C地址是不同的(0x68\0x69),进而,Read\Write命令的地址也是不同的,注意根据自己需求进行区分。

2.mpu_dmp_init初始化自检不通过:常见原因有:5V电源和GND未正确接入,DMP输出频率过高,初始状态倾角较大。解决办法:电源的问题,调整至正确接线就行了,如果一直是FIFO的问题,可减低DMP频率(最高200Hz,将至50Hz以下),还有就算如前文中说的,如果I2C速度使用的是标准速度100KHz,这里也需要调整为高速模式即400Khz。由于使用参考坐标系,若初始状态大于设定的阈值,也可能造成自检不通过,因此初始化时需要将模块置于基本平衡的状态。当然,如果跳过自检可以读取正常数据,那也可以注释掉部分自检过程。
其他原因还有一些,这个坑挺多的,要玩好没想象的简单。
创作不易,点个赞吧!

你可能感兴趣的:(stm32)