MPU9250在STM32单片机SPI通信接口下的初始化及九轴数据读取总结
很多人用SPI接口读取MPU9250磁力计数据读不出来,关键问题在于MPU9250内部与磁力计是IIC接口(很坑,技术文档也没有特别说明,只在内部结构图中有展示),所以读取时必须要加延时,若只读取加速度和陀螺仪数据才可以达到1-20MHz的速率。
大部分单片机IIC接口不是很好用,相信很多朋友在调试的时候踩过不少坑,而且由于IIC自身的限制,采样速率有时不足为用,所以被迫换为SPI接口。但SPI接口调试磁力计依然受内部IIC限制,不过若只使用加速度和陀螺仪数据,速率便会比IIC快几倍。
本次博客记录笔者在实际调试过程中遇到的一些问题,以提醒后人在调试中应该注意的事项,以免踩坑。
本次调试采用STM32f103系列单片机进行数据读取。
一、初始化流程:
1.解除休眠;
2.初始化内部IIC(mpu9250内部采用IIC与磁力计通信);
3.SPI初始化加速度计和陀螺仪(配置参数具体参考技术手册);
4.通过SPI与内部IIC通信,初始化磁力计;
5.根据需求决定FIFO、DMP是否启用。
注意:
1.解除休眠后要加至少100ms延时,以保证mpu9250初始化完毕(内部IIC通信较慢),若只读取加速度计和陀螺仪的六轴数据而不使用磁力计的话,可以省去磁力计的初始化部分。
2.加速度计和陀螺仪的量程(精度)由实际使用情况配置,人体姿态捕获建议加速度计±8g,陀螺仪设置最大±2000°/s;
keil5环境初始化程序:
void Init_MPU9250(void)
{
MPU9250_Write_Reg(PWR_MGMT_1, 0x80); //解除休眠状态
delay_ms(100);//延时保证复位
/**********************Init SLV0 i2c**********************************/
//Use SPI-bus read slave0使能内部iic(mpu9250内部是通过iic与磁力计通信的)
MPU9250_Write_Reg(INT_PIN_CFG ,0x30);// INT Pin / Bypass Enable Configuration
MPU9250_Write_Reg(I2C_MST_CTRL,0x4d);//I2C MAster mode and Speed 400 kHz
MPU9250_Write_Reg(USER_CTRL ,0x20); // I2C_MST _EN
MPU9250_Write_Reg(I2C_MST_DELAY_CTRL ,0x01);//延时使能I2C_SLV0 _DLY_ enable
MPU9250_Write_Reg(I2C_SLV0_CTRL ,0x81); //enable IIC and EXT_SENS_DATA==1 Byte
///*******************Init GYRO and ACCEL******************************/
MPU9250_Write_Reg(CONFIG, 0x07); //低通滤波频率,典型值:0x07(3600Hz)此寄存器内决定Internal_Sample_Rate==8K
MPU9250_Write_Reg(SMPLRT_DIV, 0x07); //陀螺仪采样率,典型值:0x07(1kHz) (SAMPLE_RATE= Internal_Sample_Rate / (1 + SMPLRT_DIV) )
MPU9250_Write_Reg(GYRO_CONFIG, 0x08); //陀螺仪自检及测量范围,典型值: