MPU6050 DMP初始化失败求帮忙

2019-08-16 20:02发布

代码是原子哥的代码;mpu_dmp_init()   DMP初始化失败 我查代买发现是
res=dmp_load_motion_driver_firmware();                //加载固件库
                if(res)return 4;   实际返回4  说明加载失败 继续看发现
  if (memcmp(firmware+ii, cur, this_write))
            return -2;  是这个函数返回了-2  说以导致失败      这个函数 执行的是汇编 看不懂...


请问这是为什么?怎么解决呢?

首先可以确定的是我的小车原装代码是可以实现的  所以排除硬件问题  
MPU_Init();                                        //初始化MPU6050   这可以初始化   说明IIC通行也没问题
在初始化前我没开任何中断
               

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
lvkanger
1楼-- · 2019-08-17 19:15
有用,帮顶一下!
zhaoyuaiweide
2楼-- · 2019-08-18 00:53
gexinyu1993 发表于 2017-1-5 16:18
我现在只读取MPU6050的原始数据都OK了!!
问题:
我移植的是原子哥的代码 都是STM32 按说我只需要改下 ...

没太听懂楼主什么意思  如果你要打印出来陀螺仪原始数据相应的忘记那个.c了  好像是mpu6050.c就有u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)等函数  直接调用加上你想读取的参数就可以读出来原始数据   如果你要读DMP融合后的pitch roll yaw 的角度   就直接调用inv_mpu.c中的u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw)函数就可以读取    IIC如果要变一定要改全  不然肯定会失败

.h里面的
//IO方向设置
#define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}

//IO操作函数         
#define MPU_IIC_SCL    PBout(10)                 //SCL
#define MPU_IIC_SDA    PBout(11)                 //SDA         
#define MPU_READ_SDA   PBin(11)                 //输入SDA

.c里面的这个:
//初始化IIC
void MPU_IIC_Init(void)
{                                             
        RCC->APB2ENR|=1<<3;                //先使能外设IO PORTB时钟                                                          
        GPIOB->CRH&=0XFFFF00FF;        //PB10/11 推挽输出
        GPIOB->CRH|=0X00003300;          
        GPIOB->ODR|=3<<10;             //PB10,11 输出高
}
gexinyu1993
3楼-- · 2019-08-18 06:17
zhaoyuaiweide 发表于 2017-1-6 10:02
没太听懂楼主什么意思  如果你要打印出来陀螺仪原始数据相应的忘记那个.c了  好像是mpu6050.c就有u8 MPU_ ...

IO部分我都改过了
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
这个函数 调用的就是
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
        IIC_Start();
        IIC_Send_Byte((addr<<1)|0);//·¢&#203;í&#198;÷&#188;tμ&#216;&#214;·+D′&#195;üá&#238;       
        if(IIC_Wait_Ack())        //μè′yó|′e
        {
                IIC_Stop();                 
                return 1;               
        }
    IIC_Send_Byte(reg);        //D′&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
    IIC_Wait_Ack();                //μè′yó|′e
    IIC_Start();
        IIC_Send_Byte((addr<<1)|1);//·¢&#203;í&#198;÷&#188;tμ&#216;&#214;·+&#182;á&#195;üá&#238;       
    IIC_Wait_Ack();                //μè′yó|′e
        while(len)
        {
                if(len==1)*buf=IIC_Read_Byte(0);//&#182;áêy&#190;Y,·¢&#203;ínACK
                else *buf=IIC_Read_Byte(1);                //&#182;áêy&#190;Y,·¢&#203;íACK  
                len--;
                buf++;
        }   
    IIC_Stop();        //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t
        return 0;       
}

这个连续读 函数  这读出来就是原始数据   可是只能读1个数据出来  不知道为什么  我吧这函数改成
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
        u8 i;
        for(i=0;i<len;i++)
        {
                *buf=MPU_Read_Byte(reg);
                buf++;
                reg+=1;
        }
        return 0;
}

这样 就可以全部读出来  ,,现在读数据到没什么问题


现在DMP加载固件库失败  ,,,失败的地方那个函数  貌似 是 汇编的 还是不开源..
if (memcmp(firmware+ii, cur, this_write))
            return -2;
正点原子
4楼-- · 2019-08-18 11:43
这个一般是2个问题引起的:
1,开了中断,中断打断了DMP的初始化过程,导致失败。
2,模块没放平,导致初始化失败。

如果这两点都确认了,建议看看IIC波形,SCL的时钟,是不是和我们开发板一样。怀疑是IIC延时导致的问题。
gexinyu1993
5楼-- · 2019-08-18 14:30
 精彩回答 2  元偷偷看……
zhaoyuaiweide
6楼-- · 2019-08-18 16:31
gexinyu1993 发表于 2017-1-10 10:11
那我是DIY的,没有示波器啥的,我用的是你们的代码只改IO,,只是板子不一样会导致IIC波形不一样吗?现在 ...

你有用定时器吗    如果有的话把定时器初始化放在DMP初始化后面

一周热门 更多>