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