OpenEdv-开源电子网

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

MPU6050利用DMP读取fifo数据时出错

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-11-22
在线时间
0 小时
发表于 2015-1-14 15:57:11 | 显示全部楼层 |阅读模式
5金钱
    根据F4“MPU6050 六轴传感器实验“部分稍微修改了一下(核心代码基本没改),初始化啥的没有什么问题,但是在mpu_dmp_get_data(&pitch,&roll,&yaw)时候失败了,调试时候发现在执行时对应  mpu_dmp_get_data()-->dmp_read_fifo()-->mpu_read_fifo_stream()这一函数下执行了:
[mw_shl_code=c,true]if (tmp[0] & BIT_FIFO_OVERFLOW) { mpu_reset_fifo(); return -2; }[/mw_shl_code]
也就是说FIFO溢出了??网上说可能是I2C驱动的读写驱动有问题但是我MPU6050的原始数据是可以正确读出来的(下图),不知道有谁遇到过这个问题指点一下!


最佳答案

查看完整内容[请看2#楼]

回复【3楼】知星: --------------------------------- 你说的很对,我实验过了,我使用的是硬件iic,可以自己看出设置的速度是多少,我的实验发现的是如果iic速率高了,我这里是超过200KHZ的画,就会出现加载DMP固件,以及其他的初始化设置mpu_dmp_init()的时候就会出错,但是如果iic的速率低了,我实验的是如果开优化的话,低于100khz时候,读取dmp fifo就会出错了,读不出值,如果不开优化,那么速度可以低到80KHZ去读取fif ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2015-2-11
在线时间
0 小时
发表于 2015-1-14 15:57:12 | 显示全部楼层
回复【3楼】知星:
---------------------------------
你说的很对,我实验过了,我使用的是硬件iic,可以自己看出设置的速度是多少,我的实验发现的是如果iic速率高了,我这里是超过200KHZ的画,就会出现加载DMP固件,以及其他的初始化设置mpu_dmp_init()的时候就会出错,但是如果iic的速率低了,我实验的是如果开优化的话,低于100khz时候,读取dmp fifo就会出错了,读不出值,如果不开优化,那么速度可以低到80KHZ去读取fifo,开了优化基本要大于100KHZ才行,等于100KHZ也是不行的,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-14 23:14:59 | 显示全部楼层
帮顶....
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-11-22
在线时间
0 小时
 楼主| 发表于 2015-1-21 21:01:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
网上其他地方的说法是:“ dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more)读取数据的速度要快,如果你读取的速度不够快的话,MPU的FIFO就会溢出,估计会出问题,这也是一直无法读出数据的原因。这样肯定是有问题的,所以使用这一个函数一定要放在一个定时回调函数里面,同时应该加上一些保护措施。听网上一些说,应该保证FIFO里面的有个计数保证数据在32-512之间  因为超过512就会检查是不是溢出了”
虽然我好像找到了原因但是还是没调试成功。。。。哎
回复

使用道具 举报

5

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-1-10
在线时间
19 小时
发表于 2015-1-24 14:24:19 | 显示全部楼层
我把MPU6050的程序一直到了MINI板子上,mpu_dmp_init()这一步出错,返回值是8,求大神指教。
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-3-27
在线时间
0 小时
发表于 2015-4-17 21:39:58 | 显示全部楼层
回复【3楼】知星:
---------------------------------
我也遇到这个问题了,请问解决了么?
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-12
在线时间
2 小时
发表于 2015-5-13 19:16:12 | 显示全部楼层
楼主,问题解决了吗?
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-2-11
在线时间
13 小时
发表于 2015-6-22 16:59:54 | 显示全部楼层
请问楼主,问题解决了么?我出现的问题也是FIFO溢出,读出的值一直是0X13,请问怎么解决?谢谢
知识在于分享
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-7-30
在线时间
0 小时
发表于 2015-8-2 21:54:05 | 显示全部楼层
同求解决办法
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2015-2-11
在线时间
0 小时
发表于 2015-9-4 22:53:34 | 显示全部楼层
速率低,初始化设置肯定没有问题,但是读取DMP fifo有问题了,速率高,初始化过不去,加载一些项,比如写固件操作就不行了,但是读取FIFO肯定是没有问题的了
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2015-9-11 21:26:44 | 显示全部楼层
回复【9楼】摩天轮1111:
---------------------------------
请问这里的速度指的是什么速度?模拟IIC如何把这个速度设置到100KHZ-200KHZ之间?
回复

使用道具 举报

6

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-8-12
在线时间
32 小时
发表于 2015-10-28 17:22:21 | 显示全部楼层
我的是偶尔可以,偶尔不行
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-12-9
在线时间
0 小时
发表于 2015-12-9 16:23:50 | 显示全部楼层
回复【4楼】Director_Liu:
---------------------------------
静止状态初始化就不出现8的错误码了!
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-7-28
在线时间
2 小时
发表于 2015-12-23 16:11:49 | 显示全部楼层
请问楼主,mpu6050,dmp初始化的时候,u8 mpu_dmp_init(void)的返回值是10. 追到if(mpu_init()==0) //初始化6050.。 其返回值不是0而是255 请问这是怎么回事。也就是说没初始化 成功dmp。,是什么原因呢,跪谢啊 啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2016-2-13
在线时间
0 小时
发表于 2016-2-13 20:26:03 | 显示全部楼层
多谢提醒,我调试通过了。特意注册了账号来说下我的解决方案。在FIFO溢出之后函数是直接返回错误信息的,我们可以在reset_fifo之后重新读取一次fifo,也就是重新执行一次该函数,我是用了goto回到函数起点。这样就正常读取了欧拉角数据。

至于dmp-init出错,我也碰到过。我的是在dmp-init中的self_test未通过,把模块放正就通过了。
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2011-11-28
在线时间
6 小时
发表于 2016-2-23 19:02:30 | 显示全部楼层
菜鸟stm32丶 发表于 2015-12-23 16:11
请问楼主,mpu6050,dmp初始化的时候,u8 mpu_dmp_init(void)的返回值是10. 追到if(mpu_init()==0 ...

出现了同样的问题,请问您这里是否解决了?
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-3-1
在线时间
9 小时
发表于 2016-3-5 23:03:31 | 显示全部楼层
我也是这个问题,真的就是速率问题吗?
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-3-1
在线时间
9 小时
发表于 2016-3-6 07:33:52 | 显示全部楼层
maximus811009 发表于 2016-2-23 19:02
出现了同样的问题,请问您这里是否解决了?

我的这个问题解决了。
1、读不到reset fifo后再读一遍。
2、每次读之间的延时去掉。原本是调试使用,while中是延时500ms,读一次,把500ms延时去掉。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-3-8
在线时间
3 小时
发表于 2016-3-8 20:19:36 | 显示全部楼层
漫步 发表于 2016-3-6 07:33
我的这个问题解决了。
1、读不到reset fifo后再读一遍。
2、每次读之间的延时去掉。原本是调试使用,wh ...

你好,我也遇到了同样的问题,请问你读不到reset fifo后再读一遍的语句具体是怎么写的?
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-3-1
在线时间
9 小时
发表于 2016-3-9 09:21:25 | 显示全部楼层
绝缘体 发表于 2016-3-8 20:19
你好,我也遇到了同样的问题,请问你读不到reset fifo后再读一遍的语句具体是怎么写的?

没在家里,
if(readFifo()==ERROR)
{
if(readFifo()==ERROR)
{
return ERROE
}
}

手机回复不容易啊
回复

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2016-6-11
在线时间
82 小时
发表于 2016-7-10 16:11:04 | 显示全部楼层
请问楼主解决了吗?我也遇到了同样的问题,mpu_dmp_get_data(&pitch,&roll,&yaw)返回值总不为0
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-11-26
在线时间
7 小时
发表于 2016-8-6 20:52:12 | 显示全部楼层
不断进行循环读fiffo就可以得到正常数据。
形如这样
                while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0)
                {
                        printf("pitch=%f\troll=%f\tyaw=%f\r\n",pitch,roll,yaw);
                }
回复

使用道具 举报

9

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2014-5-2
在线时间
49 小时
发表于 2016-9-2 13:56:54 | 显示全部楼层
我用硬件i2c,100和400的速度都试过可以用,溢出问题正如前面说的,是因为函数mpu_dmp_get_data(&pitch,&roll,&yaw)执行的过慢,1S调取一次,一定会出现失败,后来我在main的while函数循环执行这个函数,然后根据业务需要定时提取pitch,roll,yaw三个数据,不是要的时候再调用这个函数,另外正点原子里面的参考例程,这个函数也是一直在快速执行的
回复

使用道具 举报

29

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
511
金钱
511
注册时间
2015-10-11
在线时间
102 小时
发表于 2016-10-5 12:38:27 | 显示全部楼层
残梦重生2016 发表于 2016-8-6 20:52
不断进行循环读fiffo就可以得到正常数据。
形如这样
                while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0) ...

神级人物,谢谢你呢啊,
回复

使用道具 举报

20

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2016-9-26
在线时间
59 小时
发表于 2016-12-8 19:30:01 | 显示全部楼层
帖子有用呀
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-8-8
在线时间
0 小时
发表于 2017-8-8 21:50:44 | 显示全部楼层
残梦重生2016 发表于 2016-8-6 20:52
不断进行循环读fiffo就可以得到正常数据。
形如这样
                while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0) ...

让它静止不动按照你的方法有效,一动就完蛋了
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-2-15
在线时间
2 小时
发表于 2022-4-21 01:30:31 | 显示全部楼层
while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0) ..
太牛了,最简单办法解决了大问题,神级人物!!谢谢!!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-2-15
在线时间
2 小时
发表于 2022-4-21 01:32:56 | 显示全部楼层
未来,我来 发表于 2016-10-5 12:38
神级人物,谢谢你呢啊,

最简单办法解决,牛!崇拜!
回复

使用道具 举报

7

主题

61

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2016-3-1
在线时间
76 小时
发表于 2024-4-11 22:20:44 | 显示全部楼层
我从寄存器直接读出来的原始数据也是正确的,但也老是卡到if (tmp[0] & BIT_FIFO_OVERFLOW)。我把I2C速率提高到100K,还是没解决问题
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-11-10
在线时间
5 小时
发表于 2024-9-29 09:53:04 | 显示全部楼层
wenfengand 发表于 2016-2-13 20:26
多谢提醒,我调试通过了。特意注册了账号来说下我的解决方案。在FIFO溢出之后函数是直接返回错误信息的,我 ...

大佬 reset_fifo是怎么操作的呀
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 09:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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