bsp_mpu9250.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "main.h"
  2. //**************************************
  3. //写入一个字节数据
  4. //**************************************
  5. bool MPU9250_Write_Byte(uint8_t Device_Address,uint8_t REG_Address,uint8_t REG_data)
  6. {
  7. uint8_t buf[2];
  8. // DEBUG_LOG("MPU9250_Write_Byte\n");
  9. buf[0] = REG_Address;
  10. buf[1] = REG_data;
  11. return twi_master_transfer(Device_Address, buf, 2, TWI_ISSUE_STOP);
  12. }
  13. //**************************************
  14. //读取N个字节数据
  15. //**************************************
  16. bool MPU9250_Read_nBytes(uint8_t Device_Address,uint8_t REG_Address,uint8_t *readDataBuf,uint8_t readDataLen)
  17. {
  18. bool ret;
  19. ret = twi_master_transfer(Device_Address, &REG_Address, 1, TWI_DONT_ISSUE_STOP);
  20. ret &= twi_master_transfer(Device_Address|TWI_READ_BIT, readDataBuf, readDataLen, TWI_ISSUE_STOP);
  21. return ret;
  22. }
  23. bool MPU9250_register_write_len(uint8_t Device_Address,uint8_t register_address, uint8_t len,uint8_t *buf)
  24. {
  25. uint8_t w2_data[50],i;
  26. w2_data[0] = register_address;
  27. for(i=0;i<len;i++)w2_data[i+1] = *(buf+i);
  28. if(twi_master_transfer(Device_Address, w2_data, len+1, TWI_ISSUE_STOP) == true)return 0;
  29. else return true;
  30. }
  31. bool MPU9250_register_read_len(uint8_t Device_Address,uint8_t register_address, uint8_t number_of_bytes,uint8_t * destination )
  32. {
  33. bool transfer_succeeded;
  34. transfer_succeeded = twi_master_transfer(Device_Address, &register_address, 1, TWI_DONT_ISSUE_STOP);
  35. transfer_succeeded &= twi_master_transfer(Device_Address|TWI_READ_BIT, destination, number_of_bytes, TWI_ISSUE_STOP);
  36. if(transfer_succeeded == true)return 0;
  37. else return true;
  38. }
  39. int MPU9250_init(void)
  40. {
  41. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_PWR_MGMT_1,0x80)) return 1; //复位所有寄存器,复位完后自动进入睡眠模式,所以要sleep位要清0
  42. nrf_delay_ms(5);
  43. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_PWR_MGMT_1,0x00)) return 1; //唤醒mpu9250
  44. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_SMPLRT_DIV,0x07)) return 2;
  45. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_CONFIG,0x00)) return 3; //低通滤波5hz
  46. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_GYRO_CONFIG,0x18)) return 4; //不自检,2000deg/s
  47. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_ACCEL_CONFIG,0x18)) return 5; //(0x00 +-2g;) ( 0x08 +-4g;) (0x10 +-8g;) (0x18 +-16g)
  48. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_ACCEL_CONFIG_2,0x04)) return 6; //
  49. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_INT_PIN_CFG,0x02)) return 7;
  50. if(!MPU9250_Write_Byte(MPU9250_I2C_ADDR,MPU9250_USER_CTRL,0x00)) return 8; //使能I2C
  51. if(!MPU9250_Write_Byte(AK8963_I2C_ADDR,AK8963_CNTL1,0x0f)) return 9;
  52. return 0;
  53. }
  54. int MPU9250_Read(int16_t* acc,int16_t* gyr,int16_t* mag,int16_t* temperature)
  55. {
  56. uint8_t buf[14],bufM[6];
  57. if(!MPU9250_Read_nBytes(MPU9250_I2C_ADDR,MPU9250_ACCEL_XOUT_H, buf, 14)) return -1;//读取加速度,温度,陀螺仪传感器
  58. if(!MPU9250_Read_nBytes(AK8963_I2C_ADDR,AK8963_HXL, bufM, 6)) return -2;//读取地磁传感器
  59. if(!MPU9250_Write_Byte(AK8963_I2C_ADDR,AK8963_CNTL1,0x11)) return -3;//每读一次数据,ak8963会自动进入powerdown模式,这里需要重新设定为单测量模式
  60. acc[0] = ((int16_t)buf[0]<<8)|((int16_t)buf[1]);
  61. acc[1] = ((int16_t)buf[2]<<8)|((int16_t)buf[3]);
  62. acc[2] = ((int16_t)buf[4]<<8)|((int16_t)buf[5]);
  63. temperature[0] = ((int16_t)buf[6]<<8)|((int16_t)buf[7]);
  64. gyr[0] = ((int16_t)buf[8]<<8)|((int16_t)buf[9]);
  65. gyr[1] = ((int16_t)buf[10]<<8)|((int16_t)buf[11]);
  66. gyr[2] = ((int16_t)buf[12]<<8)|((int16_t)buf[13]);
  67. mag[0] = ((int16_t)bufM[1]<<8)|((int16_t)bufM[0]);
  68. mag[1] = ((int16_t)bufM[3]<<8)|((int16_t)bufM[2]);
  69. mag[2] = ((int16_t)bufM[5]<<8)|((int16_t)bufM[4]);
  70. return 0;
  71. }