STM32CubeIDE开发笔记7:IIC读取MPU6050
本文链接:https://blog.youkuaiyun.com/qq_42038029/article/details/103851481
版权声明:本文为优快云博主「遥望1415984987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
stm32CubeIDE所用版本:1.3.0
固件库包:f1 1.8.0
测试平台stm32c8t6
不得不说,IDE更新到1.3后体验改善了很多,编译下载的速度都快了很多,ST的生态打造确实做的好。
IIC配置
如图:
配置两步就好了,如果外设不支持快速模式,就选择标准模式。就算是快速模式,也只是400kbps,相较于其他协议来说很慢了,虽说有些从机可以配置到更高的速度,cube这里暂时只有这两种模式,可以自己在代码里改配置到更高的速度。
I2C相关函数
我们可以在下面这个文件里找到相关的API:
这些API有详细的注释,我们这此使用下面这个HAL_I2C_Mem_Read()函数读取MPU6050的寄存器的值;
这个函数的几个参数简单说一下:
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库改写就行。
其他有些小错误稍微改写一下就好了。
如果初始化MPU6050不成功,有很多原因,如:
1.AD0接GND或是接VDD器件的I2C地址是不同的(0x68\0x69),进而,Read\Write命令的地址也是不同的,注意根据自己需求进行区分。
2.mpu_dmp_init初始化自检不通过:常见原因有:5V电源和GND未正确接入,DMP输出频率过高,初始状态倾角较大。解决办法:电源的问题,调整至正确接线就行了,如果一直是FIFO的问题,可减低DMP频率(最高200Hz,将至50Hz以下),还有就算如前文中说的,如果I2C速度使用的是标准速度100KHz,这里也需要调整为高速模式即400Khz。由于使用参考坐标系,若初始状态大于设定的阈值,也可能造成自检不通过,因此初始化时需要将模块置于基本平衡的状态。当然,如果跳过自检可以读取正常数据,那也可以注释掉部分自检过程。
其他原因还有一些,这个坑挺多的,要玩好没想象的简单。
创作不易,点个赞吧!