MPU6050是一款6轴(三轴加速度+三轴角速度)姿态传感器。

最近需要用到这款传感器,但在使用过程中发现模块DMP初始化总是失败,网上查资料有的说使模块坏了,也有的说是模块出厂漏焊了两个电容,但总觉的这类说法有问题,因为有时候模块可以正常初始化。最终在网上看到一个大神说初始化的时候把模块放平可以解决问题,亲测有效。

直说吧,MPU6050初始化失败且错误代码8,原因是因为MPU的DMP驱动程序是用的InvenSense Corporation官方的代码,而官方代码中初始化要求模块必须平放
下面给出理由:
选中初始化代码mpu_dmp_init();按下F12,追溯DMP初始代码是inv_mpu.c下的一个功能段,代码如下:

u8 mpu_dmp_init(void)
{u8 res=0;MPU_IIC_Init();  //初始化IIC总线if(mpu_init()==0)   //初始化MPU6050{res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器if(res)return 1; res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置FIFOif(res)return 2; res=mpu_set_sample_rate(DEFAULT_MPU_HZ);    //设置采样率if(res)return 3; res=dmp_load_motion_driver_firmware();     //加载dmp固件if(res)return 4; res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向if(res)return 5; res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|    //设置dmp功能DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL);if(res)return 6; res=dmp_set_fifo_rate(DEFAULT_MPU_HZ); //设置DMP输出速率(最大不超过200Hz)if(res)return 7;   res=run_self_test();     //自检if(res)return 8;    res=mpu_set_dmp_state(1);  //使能DMPif(res)return 9;     }else return 10;return 0;
}

该程序是MPU6050模块的DMP初始化代码,我自己初始化的时候,总是报错,错误代码返回数字8,即res=run_self_test(); if(res)return 8;
自检失败,选中run_self_test(); 继续追溯,追溯代码为与前段代码同 .c 文件下的程序,程序如下:

u8 run_self_test(void)
{int result;//char test_packet[4] = {0};long gyro[3], accel[3]; result = mpu_run_self_test(gyro, accel);if (result == 0x3) {/* Test passed. We can trust the gyro data here, so let's push it down* to the DMP.*/float sens;unsigned short accel_sens;mpu_get_gyro_sens(&sens);gyro[0] = (long)(gyro[0] * sens);gyro[1] = (long)(gyro[1] * sens);gyro[2] = (long)(gyro[2] * sens);dmp_set_gyro_bias(gyro);mpu_get_accel_sens(&accel_sens);accel[0] *= accel_sens;accel[1] *= accel_sens;accel[2] *= accel_sens;dmp_set_accel_bias(accel);return 0;}else return 1;
}

选中mpu_run_self_test(gyro, accel);继续追溯,代码仍在上述 .c 文件下,代码及相关注释如下:

/***  @brief      Trigger gyro/accel/compass self-test.*  On success/error, the self-test returns a mask representing the sensor(s)*  that failed. For each bit, a one (1) represents a "pass" case; conversely,*  a zero (0) indicates a failure.**  \n The mask is defined as follows:*  \n Bit 0:   Gyro.*  \n Bit 1:   Accel.*  \n Bit 2:   Compass.**  \n Currently, the hardware self-test is unsupported for MPU6500. However,*  this function can still be used to obtain the accel and gyro biases.**  \n This function must be called with the device either face-up or face-down*  (z-axis is parallel to gravity).*  @param[out] gyro        Gyro biases in q16 format.*  @param[out] accel       Accel biases (if applicable) in q16 format.*  @return     Result mask (see above).*/
int mpu_run_self_test(long *gyro, long *accel)
{#ifdef MPU6050const unsigned char tries = 2;long gyro_st[3], accel_st[3];unsigned char accel_result, gyro_result;
#ifdef AK89xx_SECONDARYunsigned char compass_result;
#endifint ii;
#endifint result;unsigned char accel_fsr, fifo_sensors, sensors_on;unsigned short gyro_fsr, sample_rate, lpf;unsigned char dmp_was_on;if (st.chip_cfg.dmp_on) {mpu_set_dmp_state(0);dmp_was_on = 1;} elsedmp_was_on = 0;/* Get initial settings. */mpu_get_gyro_fsr(&gyro_fsr);mpu_get_accel_fsr(&accel_fsr);mpu_get_lpf(&lpf);mpu_get_sample_rate(&sample_rate);sensors_on = st.chip_cfg.sensors;mpu_get_fifo_config(&fifo_sensors);/* For older chips, the self-test will be different. */
#if defined MPU6050for (ii = 0; ii < tries; ii++)if (!get_st_biases(gyro, accel, 0))break;if (ii == tries) {/* If we reach this point, we most likely encountered an I2C error.* We'll just report an error for all three sensors.*/result = 0;goto restore;}for (ii = 0; ii < tries; ii++)if (!get_st_biases(gyro_st, accel_st, 1))break;if (ii == tries) {/* Again, probably an I2C error. */result = 0;goto restore;}accel_result = accel_self_test(accel, accel_st);gyro_result = gyro_self_test(gyro, gyro_st);result = 0;if (!gyro_result)result |= 0x01;if (!accel_result)result |= 0x02;#ifdef AK89xx_SECONDARYcompass_result = compass_self_test();if (!compass_result)result |= 0x04;
#endif
restore:
#elif defined MPU6500/* For now, this function will return a "pass" result for all three sensors* for compatibility with current test applications.*/get_st_biases(gyro, accel, 0);result = 0x7;
#endif/* Set to invalid values to ensure no I2C writes are skipped. */st.chip_cfg.gyro_fsr = 0xFF;st.chip_cfg.accel_fsr = 0xFF;st.chip_cfg.lpf = 0xFF;st.chip_cfg.sample_rate = 0xFFFF;st.chip_cfg.sensors = 0xFF;st.chip_cfg.fifo_enable = 0xFF;st.chip_cfg.clk_src = INV_CLK_PLL;mpu_set_gyro_fsr(gyro_fsr);mpu_set_accel_fsr(accel_fsr);mpu_set_lpf(lpf);mpu_set_sample_rate(sample_rate);mpu_set_sensors(sensors_on);mpu_configure_fifo(fifo_sensors);if (dmp_was_on)mpu_set_dmp_state(1);return result;
}

注意:上面代码的注释中,第11行注释
This function must be called with the device either face-up or face-down
即初始化必须把模块正面朝上或朝下放置

MPU6050初始化失败 错误代码8相关推荐

  1. MPU6050初始化失败原因与解决方法

    最近使用正点原子的例程驱动MPU6050模块时发现,模块初始化失败. 追踪源码: mpu_dmp_init() -> run_self_test() -> mpu_run_self_tes ...

  2. 调试MPU6050遇到的问题(初始化失败)

    先说下遇到的问题,自己焊接的MPU6050,烧录程序后初始化失败(程序没问题,在买来的MPU6050模块上测试过). 检查PCB和Schematic没问题,电压表测试各个引脚电压,发现C2(2200p ...

  3. TDSSNIClient 初始化失败,出现错误 0x7e,状态代码 0x60。

    sql2005出现无法连接的情况,查看事件后发现错误代码"TDSSNIClient 初始化失败,出现错误 0x7e,状态代码 0x60.",最终解决方法为:打开SQL SERVER ...

  4. 传奇更新服务器信息失败怎么回事啊,天天传奇更新失败错误代码422576147处理方法 问题解决方法大全...

    天天传奇玩家在更新的时候出现了异常提示,错误代码422576147.那么这种时候该怎么解决呢?我们就一起来了解下吧! 天天传奇更新失败错误代码422576147处理方法 出现原因: 更新时候无法连接服 ...

  5. 总结—什么妖引起的MongoDB副本集初始化失败?

    前言: 在之前搭建MongoDB集群中,遇到过一些小问题作妖引起的初始化副本集失败,初学至今踩过来的坑,在此做个小结. 1.IP错误引起MongoDB副本集初始化失败 这个错误在另一篇文章已经描述过, ...

  6. Visual Studio提示Bonjour backend初始化失败

    Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...

  7. 初始化java工具失败,spring初始化失败解决办法

    spring初始化失败 报错: 00:34:33,066  INFO [main] ClassPathXmlApplicationContext:513 - Refreshing org.spring ...

  8. java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...

    我是MapReduce的新手,我试图找到问题的解决方案.我试图链接两个地图reduce作业.第一份工作正在执行,但在第二份工作上我是得到一个错误如下java.io.IOException:所有收集器的 ...

  9. 【postgresql初始化失败】initdb: invalid locale settings; check LANG and LC_* environment variables(之二)

    背景 此前,曾写过一篇文章,解决描述的问题. [postgresql初始化失败]initdb: invalid locale settings: check LANG and LC_* environ ...

最新文章

  1. redis字符串匹配_Redis的数据类型和抽象概念介绍
  2. 清华大学何晓斌:未来人才培养是大数据、AI和人文社会科学的结合
  3. 如何在Azure machine learning中使用异常检测
  4. 安装Nginx1.14.2过程及配置
  5. 又肝了下微服务 API 网关“金刚”,也是蛮香的~
  6. 从Golang调度器的作者视角探究其设计之道!
  7. IDEA和VS code设置默认换行符为LF
  8. vue设置多选框默认勾选_vue中复选框怎么默认全选,至少选择4个才可以点击下一步...
  9. java能写驱动吗_使用纯java jdbc驱动程序实现数据库的连接
  10. USB加密狗复制USBTrace数据截取工具分享
  11. [转]WebQQ登录过程分析
  12. iphone win7无法识别_小编操作win7系统电脑不能识别iphone苹果设备的设置教程
  13. 良田高拍仪 网页版 二次开发_档案产品库良田书籍高拍仪BS3000P
  14. 瑞幸的野望,小鹿茶的突袭
  15. 【Matlab-NURBS工具箱简要教程及实例 】
  16. 数据链路层的子层MAC层(图文详解)
  17. HTML语句判断IE浏览器版本
  18. Webshell文件上传漏洞
  19. Markdown格式文档图片设置居中
  20. 大道至简——RISC-V架构之魂(下)

热门文章

  1. 计算机术语新年祝福,流行语:新年常用祝福用语
  2. 苹果nfc功能怎么开启_手机上面的NFC功能怎么用的
  3. Linux下常见的日志文件名
  4. 210325,禾望电气,西陇科学,红塔证券成交量检测
  5. 蜗牛星际做无盘服务器,打造蜗牛星际NAS一:安装WINSERVER2019,已无上车价值!...
  6. 星际无线服务器,蜗牛星际变身文件存储服务器
  7. mysql 重启mysql_不能轻视的mysql重启过程
  8. 环境变量是什么?一看就懂
  9. IOS开发之常用第三方框架(完善中)
  10. PIPIOJ 1286: PIPI运货 最短路径