#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);
}
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多个数据,全部冲突。
【以下回答由 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
对比,发现完全不一样。根据问题描述,怀疑问题出在数据写入这一块。
解决方案:
确保串口发送和接收功能正常,可以使用简单的串口通信测试代码进行验证。
确保MPU6050硬件连接正确。
可以尝试使用其他的I2C设备进行通信测试,验证I2C通信是否正常。
确保MPU6050的驱动程序正确。
检查代码中的初始化参数是否正确,包括采样率、加速度计和陀螺仪的量程等。
检查数据写入的问题。
检查数据写入和读取的地址是否正确,参考MPU6050的数据手册确认地址是否一致。
考虑硬件或固件的问题。
如果以上步骤都不能解决问题,建议进一步深入调试或联系相关技术支持进行协助解决。