OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14817|回复: 17

MPU6050 DMP初始化失败求帮忙

[复制链接]

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
发表于 2017-1-4 18:40:25 | 显示全部楼层 |阅读模式
10金钱
代码是原子哥的代码;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通行也没问题
在初始化前我没开任何中断
               

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2017-1-5 09:53:30 | 显示全部楼层
   问题依然没找到  我把小车的本身的代码的 /*   if (memcmp(firmware+ii, cur, this_write))
            return -2;*/给注释掉了  小车依然可以站起来   有人知道这个函数是干嘛的不?
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2017-1-5 10:15:04 | 显示全部楼层
帮顶!!
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2017-1-5 10:33:47 | 显示全部楼层
我最近也刚刚做了平衡小车   我出现过mpu6050初始化失败的情况   一般都是停留在"mpu_set_sensor complete ......这里了   我的经验是首先连接6050的杜邦线一定要短  用胶枪战住 一松动导致电源供电不稳或者IIC都些错误就会产生这个        你的是加载运动库产生的错误看起来    建议你用只有6050的dmp库的程序测试一下   我感觉不是你6050模块有点问题就是dmp程序移植的时候出现了点小错误
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2017-1-5 11:27:23 | 显示全部楼层
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2017-1-5 16:18:04 | 显示全部楼层
zhaoyuaiweide 发表于 2017-1-5 10:33
我最近也刚刚做了平衡小车   我出现过mpu6050初始化失败的情况   一般都是停留在"mpu_set_sensor complete  ...

我现在只读取MPU6050的原始数据都OK了!!
问题:
我移植的是原子哥的代码 都是STM32 按说我只需要改下IIC的IO口就可以。我理解的可对?
在读取数据时发现 用原子哥代码里面的 连续读 就只能读X轴 后面就读不出来   我是用读一个字节的代码 读6次   才能把数据都读出来。  难道是原子哥的连续读代码有问题? 不应该啊 都是实测可以用的  我..哭晕在厕所了,,,,后面DMP的加载代码中 也有很多地方要用连续读 连续写的 代码   会不会是这个原因导致 不能加载呢?
回复

使用道具 举报

6

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2016-2-17
在线时间
192 小时
发表于 2017-1-5 23:02:13 来自手机 | 显示全部楼层
楼主可以分享下平衡车程序吗?
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7520
金钱
7520
注册时间
2016-11-30
在线时间
641 小时
发表于 2017-1-6 09:04:13 | 显示全部楼层
有用,帮顶一下!
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2017-1-6 10:02:34 | 显示全部楼层
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 输出高
}
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2017-1-6 14:32:01 | 显示全部楼层
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;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-1-6 17:14:27 | 显示全部楼层
这个一般是2个问题引起的:
1,开了中断,中断打断了DMP的初始化过程,导致失败。
2,模块没放平,导致初始化失败。

如果这两点都确认了,建议看看IIC波形,SCL的时钟,是不是和我们开发板一样。怀疑是IIC延时导致的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2017-1-10 10:11:17 | 显示全部楼层
正点原子 发表于 2017-1-6 17:14
这个一般是2个问题引起的:
1,开了中断,中断打断了DMP的初始化过程,导致失败。
2,模块没放平,导致初 ...

那我是DIY的,没有示波器啥的,我用的是你们的代码只改IO,,只是板子不一样会导致IIC波形不一样吗?现在的情况初始化MPU6050没问题 ,,只是不能加载固件库,,返回的那个函数特么是汇编的 也不知道有没有用IIC,,
回复

使用道具 举报

18

主题

96

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-10-26
在线时间
40 小时
发表于 2017-1-10 11:15:21 | 显示全部楼层
gexinyu1993 发表于 2017-1-10 10:11
那我是DIY的,没有示波器啥的,我用的是你们的代码只改IO,,只是板子不一样会导致IIC波形不一样吗?现在 ...

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

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-4-20
在线时间
1 小时
发表于 2017-6-11 21:45:35 | 显示全部楼层
我刚刚解决了,杜板线问题,换一个线,然后uart与usart的初始化放到DMP初始化的后面
回复

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-7-27
在线时间
73 小时
发表于 2017-6-12 09:22:06 | 显示全部楼层
注释掉自校准
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2017-7-16
在线时间
0 小时
发表于 2017-7-16 15:47:48 | 显示全部楼层
正点原子 发表于 2017-1-6 17:14
这个一般是2个问题引起的:
1,开了中断,中断打断了DMP的初始化过程,导致失败。
2,模块没放平,导致初 ...

请问为什么要把模块放平
回复

使用道具 举报

0

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2017-2-2
在线时间
24 小时
发表于 2017-7-25 16:01:59 | 显示全部楼层
otaganyuki 发表于 2017-7-16 15:47
请问为什么要把模块放平

不放平自检过不去,也可以把自检注释掉
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-7-30
在线时间
1 小时
发表于 2021-8-1 16:48:08 | 显示全部楼层
诸葛景云 发表于 2017-7-25 16:01
不放平自检过不去,也可以把自检注释掉

请问自检是在哪里呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表