MUP6050加载DMP固件失败
unsigned char mpu_dmp_init(void)
{
u8 res=0;
IIC_InitPort();
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);//设置FIFO
if(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); //使能DMP
if(res)return 9;
}else return 10;
return 0;
}
当程序跑到res=dmp_load_motion_driver_firmware();时就出错了,加载固件失败,
for (ii = 0; ii < length; ii += this_write) {
this_write = min(LOAD_CHUNK, length - ii);
if (mpu_write_mem(ii, this_write, (unsigned char*)&firmware[ii]))
return -1;
if (mpu_read_mem(ii, this_write, cur))
return -1;
if (memcmp(firmware+ii, cur, this_write))
{
printf("ii = 0x%x
",ii);
return -2;
}
}
串口助手打印如下图,每次上电或复位时都这样。希望大神帮忙解决一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你好~~请教你个问题哈~~我是用LPC1788来开发MPU6050的~~然后初试话MPU_DMP时候也出现了加载DMP固件失败的情况~~请问你连接的MPU6050的都是哪些引脚??
我只用了其中四个引脚:vcc、gnd、sda、scl。其他的都事空闲着的~~对吗这样?为啥你会用到AD0引脚呢??在线求解~~~~
“MPU6050.h”文件中有下面一段
//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR 0X68
////因为模块AD0默认接GND,所以转为读写地址后,为0XD1和0XD0(如果接VCC,则为0XD3和0XD2)
//#define MPU_READ 0XD1
//#define MPU_WRITE 0XD0
所以AD0脚必须接的,可以串联10K电阻接地,或接3.3V。
就是说如果你把AD09引脚断开的话也会使得固件加载不成功吗??还有为啥还要串联一个10k的电阻,直接接地不行吗?
AD0 的作用:I2C 通讯中从机是要有地址的,以区别多个从机。当 AD0 管脚接低电平的时候,从机地址是 0xD0。从 MPU6050 的寄存器中我们可以得到答案,MPU6050 作为一个 IIC 从机设备的时候,有 8 位地址,高7 位的地址是固定的,就是 WHO AM I 寄存器的默认——0x68,最低的一位是由 AD0 的连线决定的。
一周热门 更多>