MPU6050初始化失败 错误代码8
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相关推荐
- MPU6050初始化失败原因与解决方法
最近使用正点原子的例程驱动MPU6050模块时发现,模块初始化失败. 追踪源码: mpu_dmp_init() -> run_self_test() -> mpu_run_self_tes ...
- 调试MPU6050遇到的问题(初始化失败)
先说下遇到的问题,自己焊接的MPU6050,烧录程序后初始化失败(程序没问题,在买来的MPU6050模块上测试过). 检查PCB和Schematic没问题,电压表测试各个引脚电压,发现C2(2200p ...
- TDSSNIClient 初始化失败,出现错误 0x7e,状态代码 0x60。
sql2005出现无法连接的情况,查看事件后发现错误代码"TDSSNIClient 初始化失败,出现错误 0x7e,状态代码 0x60.",最终解决方法为:打开SQL SERVER ...
- 传奇更新服务器信息失败怎么回事啊,天天传奇更新失败错误代码422576147处理方法 问题解决方法大全...
天天传奇玩家在更新的时候出现了异常提示,错误代码422576147.那么这种时候该怎么解决呢?我们就一起来了解下吧! 天天传奇更新失败错误代码422576147处理方法 出现原因: 更新时候无法连接服 ...
- 总结—什么妖引起的MongoDB副本集初始化失败?
前言: 在之前搭建MongoDB集群中,遇到过一些小问题作妖引起的初始化副本集失败,初学至今踩过来的坑,在此做个小结. 1.IP错误引起MongoDB副本集初始化失败 这个错误在另一篇文章已经描述过, ...
- Visual Studio提示Bonjour backend初始化失败
Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...
- 初始化java工具失败,spring初始化失败解决办法
spring初始化失败 报错: 00:34:33,066 INFO [main] ClassPathXmlApplicationContext:513 - Refreshing org.spring ...
- java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...
我是MapReduce的新手,我试图找到问题的解决方案.我试图链接两个地图reduce作业.第一份工作正在执行,但在第二份工作上我是得到一个错误如下java.io.IOException:所有收集器的 ...
- 【postgresql初始化失败】initdb: invalid locale settings; check LANG and LC_* environment variables(之二)
背景 此前,曾写过一篇文章,解决描述的问题. [postgresql初始化失败]initdb: invalid locale settings: check LANG and LC_* environ ...
最新文章
- redis字符串匹配_Redis的数据类型和抽象概念介绍
- 清华大学何晓斌:未来人才培养是大数据、AI和人文社会科学的结合
- 如何在Azure machine learning中使用异常检测
- 安装Nginx1.14.2过程及配置
- 又肝了下微服务 API 网关“金刚”,也是蛮香的~
- 从Golang调度器的作者视角探究其设计之道!
- IDEA和VS code设置默认换行符为LF
- vue设置多选框默认勾选_vue中复选框怎么默认全选,至少选择4个才可以点击下一步...
- java能写驱动吗_使用纯java jdbc驱动程序实现数据库的连接
- USB加密狗复制USBTrace数据截取工具分享
- [转]WebQQ登录过程分析
- iphone win7无法识别_小编操作win7系统电脑不能识别iphone苹果设备的设置教程
- 良田高拍仪 网页版 二次开发_档案产品库良田书籍高拍仪BS3000P
- 瑞幸的野望,小鹿茶的突袭
- 【Matlab-NURBS工具箱简要教程及实例 】
- 数据链路层的子层MAC层(图文详解)
- HTML语句判断IE浏览器版本
- Webshell文件上传漏洞
- Markdown格式文档图片设置居中
- 大道至简——RISC-V架构之魂(下)
热门文章
- 计算机术语新年祝福,流行语:新年常用祝福用语
- 苹果nfc功能怎么开启_手机上面的NFC功能怎么用的
- Linux下常见的日志文件名
- 210325,禾望电气,西陇科学,红塔证券成交量检测
- 蜗牛星际做无盘服务器,打造蜗牛星际NAS一:安装WINSERVER2019,已无上车价值!...
- 星际无线服务器,蜗牛星际变身文件存储服务器
- mysql 重启mysql_不能轻视的mysql重启过程
- 环境变量是什么?一看就懂
- IOS开发之常用第三方框架(完善中)
- PIPIOJ 1286: PIPI运货 最短路径