本帖最后由 小白来学习 于 2016-7-28 17:45 编辑
众所众知,SPI的读写速度非常诱人,对于MPU9250而言,除了加速度、陀螺仪外,新增了磁力计模块,但是磁力计模块只支持I2C的读写,
为了能够利用起SPI的优势,此时MPU 内部的i2c Master功能为此提供了方便
楼主不才,花了一些功夫,仔细研读了MPU9250 datasheet 整理出SPI读取MPU9250全套工程源码,亲测可用。
楼主觉得有需要注意之处,都配有详细注释(若有不对之处请多多包涵)
希望能提供给大家一些参考价值(工程已打包附件,内附MPU datasheet资料及i2c源码)
MPU9250.rar
(9.73 MB, 下载次数: 179484)
2016-7-28 17:27 上传
点击文件名下载附件
下图为楼主SPI读取9轴数据——Jlink仿真结果
file:///C:UsersAdministratorAppDataRoamingTencentUsers312485168QQWinTempRichOleCG]XJ9D7$UK%PI00)8D90R0.png
谢谢楼主!程序的确可用很强大!
有个问题想要请教,就是spi读取磁力计的延时问题。看程序中是5000次循环等待内部I2C转发完成,发送一个字节竟然耗时2ms多,减小循环次数为3000出错,磁力计数据传回来的为0。而我用模拟I2C读取磁力计6个字节才用时2ms, 那这样的话spi读取就没有太大优势了,是设置问题?[mw_shl_code=applescript,true]/***************************************************************/
// MPU9250读取磁力计
//I2C_SLVx_ADDR: MPU9250_AK8963_ADDR
//I2C_SLVx_REG: reg
//return value: EXT_SENS_DATA_00 register value
/***************************************************************/
static u8 i2c_Mag_read(u8 reg)
{
u16 j=5000;
MPU9250_Write_Reg(I2C_SLV0_ADDR ,MPU9250_AK8963_ADDR|0x80); //磁力计地址,读操作
MPU9250_Write_Reg(I2C_SLV0_REG ,reg);// set reg addr
MPU9250_Write_Reg(I2C_SLV0_DO ,0xff);//read
while(j--);//等待内部I2C转发完成
return MPU9250_Read_Reg(EXT_SENS_DATA_00);
}[/mw_shl_code]
在内部芯片限定了采样频率的情况下,读数再快也是没办法的。
非常的赞同这句话
感谢回复!最后我设置了加速度陀螺仪200hz,磁力计60几hz读取,就是说检测磁力计数据没准备好的话,就直接跳过不更新(磁力计循环采样是100hz) // i2c_Mag_write(AK8963_CNTL1_REG,0x01);
flag1 = i2c_Mag_read(AK8963_ST1_REG);
flag2 = i2c_Mag_read(AK8963_ST2_REG);
if(!(flag1 & AK8963_STATUS_DRDY) || (flag1 & AK8963_STATUS_DOR) || (flag2 & AK8963_STATUS_HOFL))
return;
一周热门 更多>