1.mpu_dmp_init()
始终通过不了,运行debug之后发现卡在mpu_init(),不得不说正点这部分代码写的很瞎,我不太理解。自己找了很多资料都是返回8,然而我的却不是这种情况。只能把这部分替换掉下面的代码
u8 mpu_dmp_init(void)
{
int result;
// u8 res=0;
MPU_IIC_Init(); //初始化IIC总线
result = mpu_init();
if(!result)
{
printf("mpu initialization complete......\n "); //mpu_set_sensor
if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))
printf("mpu_set_sensor complete ......\n");
else
printf("mpu_set_sensor come across error ......\n");
if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL)) //mpu_configure_fifo
printf("mpu_configure_fifo complete ......\n");
else
printf("mpu_configure_fifo come across error ......\n");
if(!mpu_set_sample_rate(DEFAULT_MPU_HZ)) //mpu_set_sample_rate
printf("mpu_set_sample_rate complete ......\n");
else
printf("mpu_set_sample_rate error ......\n");
if(!dmp_load_motion_driver_firmware()) //dmp_load_motion_driver_firmvare
printf("dmp_load_motion_driver_firmware complete ......\n");
else
printf("dmp_load_motion_driver_firmware come across error ......\n");
if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation))) //dmp_set_orientation
printf("dmp_set_orientation complete ......\n");
else
printf("dmp_set_orientation come across error ......\n");
if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |
DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |
DMP_FEATURE_GYRO_CAL)) //dmp_enable_feature
printf("dmp_enable_feature complete ......\n");
else
printf("dmp_enable_feature come across error ......\n");
if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ)) //dmp_set_fifo_rate
printf("dmp_set_fifo_rate complete ......\n");
else
printf("dmp_set_fifo_rate come across error ......\n");
run_self_test();
if(!mpu_set_dmp_state(1))
printf("mpu_set_dmp_state complete ......\n");
else
printf("mpu_set_dmp_state come across error ......\n");
}
return 0;
}
2.MPU_Init()
一开始运行时候只出现上面的问题,但是上面问题解决又出现这种问题。网上搜了很多说是硬件的问题,我开始查看是不是焊接出现了问题。
然而都没有什么用,最后发现是引脚的问题。我自己的板子F103RCT6看原理图是PB10和PB11是I2C的引脚,就觉得需要修改。其实这里 PB10和PB11是硬件的,我们这里使用到的是软件上的 所以不能用。我修改成了PB6和PB7问题解决。
3.mpu_dmp_get_data(&pitch, &roll, &yaw)
出现上面那么多问题都解决以为,成功了没想到读取角度还有错误心态崩溃。
用debug进去发现是if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))return 1; 这一句的问题,再进去看dmp_read_fifo这个函数发现是这个mpu_read_fifo_stream函数的问题。再进去看是
if (fifo_count < length) {
more[0] = 0;
return -1;
这个的问题,网上有直接注释掉这一步的,但是我一开始注释掉有用,后来又没用具体不知道。我再后来再移植一下就又可以了,就很离谱。
最后再补充一下这个容易出错的地方,推荐使用以下代码读取数据,用if的话可能出现FIFO堆栈满了的情况。
while (mpu_dmp_get_data(&pitch, &roll, &yaw) != 0)
本文详细记录了解决mpu_dmp_init函数初始化失败的问题,涉及I2C配置、引脚更换、数据读取错误修复等过程,重点在于硬件和软件调试技巧。
1783





