OpenEdv-开源电子网

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

求助 已经调了3个星期的MPU9250了 还是失败了

[复制链接]

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
发表于 2018-6-3 14:20:26 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 c627933142 于 2018-6-3 15:37 编辑

问题出在移植的DMP库里面 在走mpu_dmp_get_data()的时候,里面有个mpu_read_fifo_stream()函数,里面有个if语句是这样的
if (fifo_count > (st.hw->max_fifo >> 1)) {
        /* FIFO is 50% full, better check overflow bit. */
        if (i2c_read(st.hw->addr, st.reg->int_status, 1, tmp))
            return -1;
        if (tmp[0] & BIT_FIFO_OVERFLOW) {
            mpu_reset_fifo();
            return -2;
        }
    }
问题出在里面第二个if,直接return2了,函数前有这么一段注释
Get one unparsed packet from the FIFO.
*  This function should be used if the packet is to be parsed elsewhere.
*  @param[in]  length  Length of one FIFO packet.
*  @param[in]  data    FIFO packet.
*  @param[in]  more    Number of remaining packets.
意思大概是获得一个不符合语法的FIFO包,但我不懂那段if的含义 也不知道怎么改,请大佬讲解
还想问一下 mpu_dmp_get_data()和mpu_mpl_get_data()有什么区别?

最佳答案

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

是I2C延时太多导致FIFO阻塞 解决了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-6-3 14:20:27 | 显示全部楼层
是I2C延时太多导致FIFO阻塞 解决了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-6-4 01:57:34 | 显示全部楼层
参考我们例程
回复

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2018-6-4 08:52:50 | 显示全部楼层
是返回 -2 还是 2?
如果返回 -2 了,按照注释可以看出是 FIFO 溢出了,可以提高数据读取速度,或增加 FIFO 大小试试看
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-6-4 13:39:27 来自手机 | 显示全部楼层
旦丁中号 发表于 2018-6-4 08:52
是返回 -2 还是 2?
如果返回 -2 了,按照注释可以看出是 FIFO 溢出了,可以提高数据读取速度,或增加 FIF ...

怎么提高读取速度?现在已经读出姿态角了 地面站也显示了 但是数据传着传着突然卡住了 数据还在传 但是我改变传感器位置数据不变
回复

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2018-6-4 15:24:36 | 显示全部楼层
c627933142 发表于 2018-6-4 13:39
怎么提高读取速度?现在已经读出姿态角了 地面站也显示了 但是数据传着传着突然卡住了 数据还在传 但是我 ...

试试提高你调用 mpu_dmp_get_data() 函数的频率,跟你在配置 DMP 时配置的 FIFO 匹配一下
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-6-4 17:21:23 来自手机 | 显示全部楼层
正点原子 发表于 2018-6-4 01:57
参考我们例程

就是参考你的的例程的 现在mpu数据无故卡死 重启还没有用 只能重新烧代码才能解决
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-6-4 17:22:45 来自手机 | 显示全部楼层
旦丁中号 发表于 2018-6-4 15:24
试试提高你调用 mpu_dmp_get_data() 函数的频率,跟你在配置 DMP 时配置的 FIFO 匹配一下

我都没有用中断了 我都直接在主函数里while(1)里面读数了 还是会卡死
回复

使用道具 举报

6

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2016-3-16
在线时间
166 小时
发表于 2018-6-5 08:37:05 | 显示全部楼层
c627933142 发表于 2018-6-4 17:22
我都没有用中断了 我都直接在主函数里while(1)里面读数了 还是会卡死

感觉这样读数据的话应该是有时返回 0 值表示读取正常,有时返回 非0 值表示读取失败,因为读取速度比数据生成的速度快了
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-6-6 07:55:12 来自手机 | 显示全部楼层
旦丁中号 发表于 2018-6-5 08:37
感觉这样读数据的话应该是有时返回 0 值表示读取正常,有时返回 非0 值表示读取失败,因为读取速度比数据 ...

不是越快越好吗?慢了FIFO会溢出
现在观察的结果是输出角度会卡在一定值上 不知道是不是fifo溢出了 地面站的3D模型一卡一卡的
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-6-27
在线时间
14 小时
发表于 2018-6-27 11:40:04 | 显示全部楼层
请问楼主,地面站显示3D模型姿态变化需要修改例程么?为什么我用例程只能读取到原始数据,晃动板子3D模型没有变化
回复

使用道具 举报

48

主题

157

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
240
金钱
240
注册时间
2018-4-21
在线时间
105 小时
 楼主| 发表于 2018-7-10 00:38:33 | 显示全部楼层
柠檬C 发表于 2018-6-27 11:40
请问楼主,地面站显示3D模型姿态变化需要修改例程么?为什么我用例程只能读取到原始数据,晃动板子3D模型没 ...

我现在用的是4.22的地面站 改改它自带的协议代码就读到了 3D模型的话只要传3个姿态角并解锁就行了 这么久没上不知道你搞定了没
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-6-27
在线时间
14 小时
发表于 2018-7-19 16:15:30 | 显示全部楼层
c627933142 发表于 2018-7-10 00:38
我现在用的是4.22的地面站 改改它自带的协议代码就读到了 3D模型的话只要传3个姿态角并解锁就行了 这么久 ...

嗯嗯谢谢LZ,搞定啦
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-11-1
在线时间
3 小时
发表于 2018-11-4 22:00:58 | 显示全部楼层
if (!st.chip_cfg.dmp_on)         return -1;     if (!st.chip_cfg.sensors)         return -1;      if (i2c_read(st.hw->addr, st.reg->fifo_count_h, 2, tmp))         return -1;     fifo_count = (tmp[0] << 8) | tmp[1];     if (fifo_count < length) {         more[0] = 0;         return -1;     }     if (fifo_count > (st.hw->max_fifo >> 1)) {         /* FIFO is 50% full, better check overflow bit. */         if (i2c_read(st.hw->addr, st.reg->int_status, 1, tmp))             return -1;         if (tmp[0] & BIT_FIFO_OVERFLOW) {             mpu_reset_fifo();             return -2;         }     }
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-11-1
在线时间
3 小时
发表于 2018-11-4 22:01:58 | 显示全部楼层
if (!st.chip_cfg.dmp_on)return -1;   我返回这个-1是什么原因呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 03:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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