MPU6000 SPI 陀螺仪数据正常读 加速度计数据读出来的值不会变。

2019-07-20 20:31发布

初始化:
void MPU6000_Init()

  uint8_t ctrl = 0x00;
 
  // 管脚初始化
  MPU6000_IO_Init();
 
 //MPU6000复位 往0x6B里面写0x80
 MPU6000_AccRebootCmd();
  HAL_Delay(20);
 
  //设置时钟源为陀螺仪的z轴
   ctrl = 0x03;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_PWR_MGMT_1, 1);
  HAL_Delay(20); 
 
 //启用SPI总线
  ctrl = 0x10;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_USER_CTRL, 1);
  HAL_Delay(20);
 
 //采样率分频,典型值:0x07(125Hz)
 ctrl = 0x07;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_SMPRT_DIV, 1); 
  HAL_Delay(20);
 
 //低通滤波频率,典型值0x06(5Hz)
 ctrl = 0x06;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_CONFIG, 1); 
  HAL_Delay(20);
 
  //陀螺仪量程+/-500
 ctrl = 0x08;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_GYRO_CONFIG, 1);
  HAL_Delay(20);
 
 //加速度量程+/-4g
 ctrl = 0x08;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_ACCEL_CONFIG, 1); 
  HAL_Delay(20);
 
  //配置中断模式,高电平有效。
 ctrl = 0x30;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_INT_PIN_CFG, 1);
 HAL_Delay(20);
 
 //允许中断
 ctrl = 0x01;
  MPU6000_IO_Write(&ctrl, MPU6000_RA_INT_ENABLE, 1);  
  HAL_Delay(20);
}

读芯片的ID:  
  MPU6000_IO_Read(&tmp, MPU6000_WHO_AM_I_ADDR, 1); 返回tmp的值是0x68

进入中断后读取加速度测量值
  MPU6000_IO_Read(tmpbuffer,MPU6000_OUT_X_H_A,6);//读取加速度的原始值值0x3B到0x40,数据X,Y方向一直为零,z方向一直是0x0083   for(i=0; i<3; i++)
    pnRawData=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]);

printf("pnRawData[0]= 0x%04x pnRawData[1]= 0x%04x pnRawData[2]= 0x%04x ",pnRawData[3],pnRawData[4],pnRawData[5]);

  MPU6000_IO_Read(tmpbuffer,MPU6000_OUT_X_H_M,6);//读取陀螺仪的原始值0x43到0x48,数据能随着板子变动而变动   for(i=3; i<6; i++)
    pnRawData=(int16_t)(((uint16_t)tmpbuffer[2*i] << 8) + tmpbuffer[2*i+1]); 

printf("pnRawData[3]= 0x%04x pnRawData[4]= 0x%04x  pnRawData[5]= 0x%04x ",pnRawData[3],pnRawData[4],pnRawData[5]);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。