我用stm32读取mpu9250中的磁力计数据,但是发现其数值一直不会改变。我进行了一下尝试:1.将scl和sda线的GPIO口改为开漏输出 2.每读一次磁力计数据都经过如下流程(先开启bypass,再开启单次测量模式,然后读磁力计数据,再关闭bypass) 3.在开启bypass和开启单次测量模式后都加上了延时。 但是,试过了以上做法,读出来的磁力计数据还是不会改变,我实在不知道该怎么做了,不知道有没有大佬能指导一下
这是我读取mpu9250原始数据的程序
void data_to_computer(void) //上位机版本:4.34
{
uint8_t accbuf[6],grobuf[6],data_to_send[18];
uint8_t magbuf[6];
MPU_Read_Len(MPU9250_ADDR,MPU_ACCEL_XOUTH_REG,6,accbuf);
MPU_Read_Len(MPU9250_ADDR,MPU_GYRO_XOUTH_REG,6,grobuf);
//开通bypass
MPU_Write_Byte(MPU9250_ADDR,MPU_INTBP_CFG_REG,0X82);
delay_ms(6);
//AK8963每次读完以后都需要重新设置为单次测量模式
MPU_Write_Byte(AK8963_ADDR,MAG_CNTL1,0X11);
delay_ms(6);
MPU_Read_Len(AK8963_ADDR,MAG_XOUT_L,6,magbuf);
mpu_set_bypass(0);
delay_ms(6);
data_to_send[0] = accbuf[0];
data_to_send[1] = accbuf[1];
data_to_send[2] = accbuf[2];
data_to_send[3] = accbuf[3];
data_to_send[4] = accbuf[4];
data_to_send[5] = accbuf[5];
data_to_send[6] = grobuf[0];//取data[0]数据的高字节,
data_to_send[7] = grobuf[1];
data_to_send[8] = grobuf[2];
data_to_send[9] = grobuf[3];
data_to_send[10] = grobuf[4];
data_to_send[11] = grobuf[5];
data_to_send[12] = magbuf[0];
data_to_send[13] = magbuf[1];
data_to_send[14] = magbuf[2];
data_to_send[15] = magbuf[3];
data_to_send[16] = magbuf[4];
data_to_send[17] = magbuf[5];
for(int i = 0; i < 18; i ++)
{
Usart_SendByte(USART1,data_to_send[i]); //发送18个u8数据
}
}
这是初始化的代码
u8 MPU9250_Init(void)
{
u8 res=0;
//IIC_Init();
MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X80); //复位MPU9250
delay_ms(100);
MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X00); //唤醒MPU9250
MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps (人体姿态捕捉最好设置为2000dps,8g)
MPU_Set_Accel_Fsr(2); //加速度传感器,±8g
MPU_Set_Rate(500); //设置采样率500Hz
MPU_Write_Byte(MPU9250_ADDR,MPU_INT_EN_REG,0X00); //关闭所有中断
MPU_Write_Byte(MPU9250_ADDR,MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
delay_ms(2);
MPU_Write_Byte(MPU9250_ADDR,MPU_FIFO_EN_REG,0X00); //关闭FIFO
MPU_Write_Byte(MPU9250_ADDR,MPU_INTBP_CFG_REG,0X82); //INT引脚低电平有效,开启bypass模式,可以直接读取磁力计
delay_ms(2);
res=MPU_Read_Byte(MPU9250_ADDR,MPU_DEVICE_ID_REG); //读取MPU6500的ID
if(res==MPU6500_ID) //器件ID正确
{
MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU9250_ADDR,MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作
MPU_Set_Rate(500); //设置采样率为500Hz
}else return 1;
res=MPU_Read_Byte(AK8963_ADDR,MAG_WIA); //读取AK8963 ID
if(res==AK8963_ID)
{
MPU_Write_Byte(AK8963_ADDR,MAG_CNTL1,0X11); //设置AK8963为单次测量模式
delay_ms(2);
}else return 1;
return 0;
}
反正现在就是除了磁力计其他数据都是好的,还恳请大佬指点一下