无以伦比小五郎 2023-08-16 21:49 采纳率: 0%
浏览 83
已结题

MPU6050dmp初始化遇到的奇葩现象

#MPU6050 DMP初始化卡在固件加载不通过,问题比较玄学,还没找到解决办法。
板子为CH549,代码改的正点原子stm32的代码,跟大多数人一样,卡在了mpu_dmp_init()中的dmp_load_motion_driver_firmware函数上,也是memcmp(firmware+ii, cur, this_write)不通过,但是在我把通信的数据通过串口发送出来后,跟inv_mpu_dmp_motion_driver.c
中的dmp_memory一对比,发现完全不一样。已经排除其他问题,就是在大数组写入这一块出问题。

 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]))
                {
                    CH549UART1SendStr(firmware+ii);
                    CH549UART1SendByte(0x01);
                    CH549UART1SendByte(0x02);                
                    return -1;
                }//写数据操作无误
                    CH549UART1SendByte(firmware[ii]);
                    mDelayuS(5);
        if (mpu_read_mem(ii, this_write, cur))
                {
                    CH549UART1SendStr(cur);
                    CH549UART1SendByte(0x02);
                    CH549UART1SendByte(0x01);                    
                    return -1;
                }//读数据操作无误
                    CH549UART1SendByte((*cur));
                    mDelayuS(5);
        if (memcmp(firmware+ii, cur, this_write))//比较错误,可能是读或写错误
                {
                    CH549UART1SendStr2((firmware+ii),this_write);
                    CH549UART1SendByte(0x00);
                    CH549UART1SendByte(0xFF);
                    CH549UART1SendStr2(cur,this_write);
                    CH549UART1SendByte(0x00);
                    CH549UART1SendByte(0xFF);
                    CH549UART1SendByte(this_write);
                    CH549UART1SendByte(0x09);
                    return -2;}
                mDelayuS(5);
                CH549UART1SendByte(0xcc);                
    }

img

img

1。在代码里,由于我将#define LOAD_CHUNK 16改成了1,所以每次只会写读一个字节。
(2)在上图,第一个0x68是器件地址,最后一个0x04代表dmp初始化失败,返回值为0x04,也就是dmp固件加载失败的意思。第二个0xD9本应该是dmp_memory中的第1个,第三个数据0xD9是将数据写入再读取出来后的结果,也是0xD9,说明读取成功,也证明我的IIC通讯没有写错,但奇怪的点就在这里,连续写了1000多个数据都能正常通过memcmp,但一到一个特定的数据就会发生读取错误,导致dmp固件载入错误,且每次都是这个位置导致中断停止。
(3)也想过会不会是中断的问题,把全局中断关了也无济于事,
(4)更神奇的是,我直接用串口发送dmp_memory中的数据,结果第一个数据也是0xD9,跟dmp_memory完全不一样,而且数据量也只有一百多个就结束了跟(2)中发了1000多个数据才中断不一样,原数组更是有3000多个数据,全部冲突。

img


(5)尝试过把memcmp注释掉,结果在获取欧拉角那里四元数超出范围,提示dmp初始化错误,想似了。
希望有解决相关问题的uu可以说一下解决思路,没遇到就别深究,折磨人。这小小dmp不用也罢

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-17 08:18
    关注

    【以下回答由 GPT 生成】

    问题分析: 根据问题描述,在MPU6050 DMP初始化过程中,遇到了一些奇怪的现象,具体表现为在mpu_dmp_init()函数中的dmp_load_motion_driver_firmware()函数处,memcmp(firmware+ii, cur, this_write)的比较不通过。通过串口发送通信的数据与inv_mpu_dmp_motion_driver.c中的dmp_memory对比,发现完全不一样。根据问题描述,怀疑问题出在数据写入这一块。

    解决方案:

    1. 首先,确认串口通信正常。
    2. 检查串口连接是否正确,包括引脚连接、波特率设置等。
    3. 确保串口发送和接收功能正常,可以使用简单的串口通信测试代码进行验证。

    4. 确保MPU6050硬件连接正确。

    5. 检查MPU6050与开发板之间的连接是否正确,包括I2C引脚连接、供电连接等。
    6. 确保MPU6050的电源供应稳定,并且电压符合规格要求。
    7. 可以尝试使用其他的I2C设备进行通信测试,验证I2C通信是否正常。

    8. 确保MPU6050的驱动程序正确。

    9. 核对所使用的MPU6050驱动代码,确保使用的是最新版的驱动程序。
    10. 根据提供的资料,参考正点原子stm32的代码进行修改,确保修改的过程正确,没有遗漏或错误的地方。
    11. 检查代码中的初始化参数是否正确,包括采样率、加速度计和陀螺仪的量程等。

    12. 检查数据写入的问题。

    13. 根据问题描述,可以尝试修改串口发送和接收的代码,增加更多的调试信息,输出更详细的数据。
    14. 检查数据写入和读取的函数,确保函数参数和返回值的使用正确。
    15. 检查数据写入和读取的地址是否正确,参考MPU6050的数据手册确认地址是否一致。

    16. 考虑硬件或固件的问题。

    17. 如果上述步骤都没有解决问题,有可能是硬件或固件的问题,可以尝试使用其他的开发板或者MPU6050模块进行测试。
    18. 如果问题依然存在,可以尝试联系MPU6050的厂商或者社区寻求帮助,获取更多的技术支持。

    如果以上步骤都不能解决问题,建议进一步深入调试或联系相关技术支持进行协助解决。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月10日
  • 修改了问题 8月16日
  • 创建了问题 8月16日

悬赏问题

  • ¥15 STM32F103C8T6使用标准库stm32f10x.h驱动ws2812
  • ¥20 我是数控机床电气工程师,主要是做840DSL与one,请问如何自学
  • ¥20 显示器休眠后重新唤醒出现蓝屏,蓝屏代码为DRIVER-POWER.STATE-FAILURE
  • ¥20 alt+tab怎么恢复到以前的模式
  • ¥15 来一个会抓包app支付链接的
  • ¥15 MMdetection安装
  • ¥15 STM32U535系列stop3模式进入和RTC唤醒
  • ¥15 如何提取全民K歌没下载过但播放过很多次的音频?
  • ¥15 树莓派运行detect.py
  • ¥15 pdfplumber提起文本内容如何过滤水印内容