DMP移植dmp_load_motion_driver_firmware错误大揭密!
相信很多人在移植DMP时都卡在了dmp_load_motion_driver_firmware这个函数的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))
return -1;
if (mpu_read_mem(ii, this_write, cur))
return -1;
if (memcmp(firmware+ii, cur, this_write))
return -2;
}这个地方错误了。这个地方真的很坑!!!
论坛里面的大神们都说是IIC读写的问题,很多人都去测试自己的IIC读写,发现根本没有问题,放在这里就是不行,特别是那些不是用软件模拟的IIC更会出现这个问题,这里告诉你们你们IIC没有问题,这个DMP库也没有问题,问题是我们自己没有高清6050刷固件读写寄存器。
很明显上面的函数是先写再读再比较,但注意if (i2c_write(st.hw->addr, st.reg->mem_r_w, length, data))这个 st.reg->mem_r_w地址是固定的不管前面的ii(循环写的次数)是0还是16还是32,每次写的地址都是 st.reg->mem_r_w这个固定的值,就是说MPU6050刷固件的这个地址st.reg->mem_r_w寄存器斌不一定是起始地址,可能在只是个6050的IIC接收器,然后再转给别的地址,因为没有手册,也不确定,实验过每次只读这一个地址寄存器每次的值不一样。
这样问题就出来了,如果你的IIC写函数不能一次连续写16个数,而是采取分了几次写,然后把st.reg->mem_r_w当成起始地址在上面加上你分段的次数形成新的地址再写,这样你写到6050里面肯定不是应该写到的地址。所以你必须把 st.reg->mem_r_w这个地址当成一个6050的IIc接受寄存器来看待才行,但本人也试验过一直只向 st.reg->mem_r_w这个地址分几次写完16个数据,读出来还是不正确,猜测可能是接收器不只这一个地址可能还有 st.reg->mem_r_w+1或者更多,最后必须改成一次向里面写16个数据才行,而且你们看看那那个刷固件的大数组,看出应该是没16个数据一个bank什么的。
以上只是个人经历,没有很确定的结论,但希望能帮到大家!!(本人用的dsp,iic不需要用软件模拟,所以发现上面问题,现在已经完成DMP初始化,可读出正确数据)
如果大家觉得上面的信息有用,请顶贴让更多人看到! 楼主我想问一下怎么看懂DMP里面的函数? backlaneboy 发表于 2014-8-16 00:12
楼主我想问一下怎么看懂DMP里面的函数?
要是说想完全看懂里面的函数,还没那个能力,只能根据他的英文注释和用法来估计一下。 楼主,能否贴上驱动例程(DSP的驱动),谢谢
最近驱动成功,但是卡在这个函数了 {:smile:}{:smile:}{:smile:} 顶一下,同求。。。 楼主怎么用DMP读出三轴加速度? 帮顶一下 DMP库还是很好移的,自己的IIC代码跟DMP的read\write函数对上就好了。
但是四轴用DMP更新太慢,不推荐 楼上不用DMP,用的什么方法? 读了两遍没有看出楼主改的哪里,是我错过啥了吗? 请教一下楼主,如果不能一次写16字节这个问题该怎么解决呢,在线等 很急 我的103程序移植好了再移植到407上就gg了,后来发现无法写,只能读,最近还在调试中
页:
[1]