|
相信很多人在移植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[ii]))
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初始化,可读出正确数据)
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|