STM32 读取 MPU-6050 参数
1、摘要
整体代码是建立在野火的MPU-6050 的代码之上,原版是使用hal 库做的
原版的地址:
https://doc.embedfire.com/module/module_tutorial/zh/latest/Module_Manual/iic_class/mpu6050.html
我将代码移植到STM32F103C8T6 上, 上层应用完全照搬, 只是重写了
下面这两个函数, 使用标准库完成。
u8 Sensors_I2C_WriteRegister(unsigned char slave_addr,
unsigned char reg_addr,
unsigned short len,
const unsigned char *data_ptr)
u8 Sensors_I2C_ReadRegister(unsigned char slave_addr,
unsigned char reg_addr,
unsigned short len,
unsigned char *data_ptr)
代码实现 就在下面的 iic.c 中。
2、移植过程中的问题
1、 是因为没有在接收倒数第二个字节是取消ACK, 就是这一句, 导致总线一致处于Busy 状态, 复位也不能解决, 只能断电。
if (i == len - 2) {
I2C_AcknowledgeConfig(I2Cx, DISABLE);
}
2、 在第一个问题上,忽略了发送一个字节的情况, 导致发送一个字节还是会卡住, 因为总线处于Busy 状态。 所以加了这一句。
if (len == 1) {
I2C_AcknowledgeConfig(I2Cx, DISABLE);
}
注意EV7_1, NA 是通过 I2C_AcknowledgeConfig 实现, 取消后, 在程序最后还要使能,避免后续程序出问题。
3、主函数:
if (MPU6050ReadID() == 1) {
// 读取一个字节的情况, 问题2解决的
while (1) {
delay_s(1);
printf("1\r\n");
MPU6050ReadAcc(Acel); // 读取多个字节情况, 问题1 解决的
printf("1\r\n");
printf("加速度: %8d %8d %8d\r\n",Acel[