Icarus Sensors / Mbed 2 deprecated SelfTestBoot

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_UARTConsole by Bluetooth Low Energy

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU9250Sensor.h Source File

MPU9250Sensor.h

00001 #ifndef MBED_MPU9250_SENSOR_H
00002 #define MBED_MPU9250_SENSOR_H
00003  
00004 #include "mbed.h"
00005 
00006 #include "BaseSensor.h"
00007 
00008 // mpu9250 registers
00009 #define MPU9250_SELF_TEST_X_GYRO 0x00
00010 #define MPU9250_SELF_TEST_Y_GYRO 0x01
00011 #define MPU9250_SELF_TEST_Z_GYRO 0x02
00012 
00013 #define MPU9250_SELF_TEST_X_ACCEL 0x0D
00014 #define MPU9250_SELF_TEST_Y_ACCEL 0x0E
00015 #define MPU9250_SELF_TEST_Z_ACCEL 0x0F
00016 
00017 
00018 #define MPU9250_XG_OFFSET_H 0x13
00019 #define MPU9250_XG_OFFSET_L 0x14
00020 #define MPU9250_YG_OFFSET_H 0x15
00021 #define MPU9250_YG_OFFSET_L 0x16
00022 #define MPU9250_ZG_OFFSET_H 0x17
00023 #define MPU9250_ZG_OFFSET_L 0x18
00024 #define MPU9250_SMPLRT_DIV 0x19
00025 #define MPU9250_CONFIG 0x1A
00026 #define MPU9250_GYRO_CONFIG 0x1B
00027 #define MPU9250_ACCEL_CONFIG 0x1C
00028 #define MPU9250_ACCEL_CONFIG_2      0x1D
00029 #define MPU9250_LP_ACCEL_ODR        0x1E
00030 #define MPU9250_MOT_THR             0x1F
00031 #define MPU9250_FIFO_EN             0x23
00032 #define MPU9250_I2C_MST_CTRL        0x24
00033 #define MPU9250_I2C_SLV0_ADDR       0x25
00034 #define MPU9250_I2C_SLV0_REG        0x26
00035 #define MPU9250_I2C_SLV0_CTRL       0x27
00036 #define MPU9250_I2C_SLV1_ADDR       0x28
00037 #define MPU9250_I2C_SLV1_REG        0x29
00038 #define MPU9250_I2C_SLV1_CTRL       0x2A
00039 #define MPU9250_I2C_SLV2_ADDR       0x2B
00040 #define MPU9250_I2C_SLV2_REG        0x2C
00041 #define MPU9250_I2C_SLV2_CTRL       0x2D
00042 #define MPU9250_I2C_SLV3_ADDR       0x2E
00043 #define MPU9250_I2C_SLV3_REG        0x2F
00044 #define MPU9250_I2C_SLV3_CTRL       0x30
00045 #define MPU9250_I2C_SLV4_ADDR       0x31
00046 #define MPU9250_I2C_SLV4_REG        0x32
00047 #define MPU9250_I2C_SLV4_DO         0x33
00048 #define MPU9250_I2C_SLV4_CTRL       0x34
00049 #define MPU9250_I2C_SLV4_DI         0x35
00050 #define MPU9250_I2C_MST_STATUS      0x36
00051 #define MPU9250_INT_PIN_CFG 0x37
00052 #define MPU9250_INT_ENABLE 0x38
00053 #define MPU9250_ACCEL_XOUT_H 0x3B
00054 #define MPU9250_ACCEL_XOUT_L 0x3C
00055 #define MPU9250_ACCEL_YOUT_H 0x3D
00056 #define MPU9250_ACCEL_YOUT_L 0x3E
00057 #define MPU9250_ACCEL_ZOUT_H 0x3F
00058 #define MPU9250_ACCEL_ZOUT_L 0x40
00059 #define MPU9250_TEMP_OUT_H 0x41
00060 #define MPU9250_TEMP_OUT_L 0x42
00061 #define MPU9250_GYRO_XOUT_H 0x43
00062 #define MPU9250_GYRO_XOUT_L 0x44
00063 #define MPU9250_GYRO_YOUT_H 0x45
00064 #define MPU9250_GYRO_YOUT_L 0x46
00065 #define MPU9250_GYRO_ZOUT_H 0x47
00066 #define MPU9250_GYRO_ZOUT_L 0x48
00067 #define MPU9250_EXT_SENS_DATA_00    0x49
00068 #define MPU9250_EXT_SENS_DATA_01    0x4A
00069 #define MPU9250_EXT_SENS_DATA_02    0x4B
00070 #define MPU9250_EXT_SENS_DATA_03    0x4C
00071 #define MPU9250_EXT_SENS_DATA_04    0x4D
00072 #define MPU9250_EXT_SENS_DATA_05    0x4E
00073 #define MPU9250_EXT_SENS_DATA_06    0x4F
00074 #define MPU9250_EXT_SENS_DATA_07    0x50
00075 #define MPU9250_EXT_SENS_DATA_08    0x51
00076 #define MPU9250_EXT_SENS_DATA_09    0x52
00077 #define MPU9250_EXT_SENS_DATA_10    0x53
00078 #define MPU9250_EXT_SENS_DATA_11    0x54
00079 #define MPU9250_EXT_SENS_DATA_12    0x55
00080 #define MPU9250_EXT_SENS_DATA_13    0x56
00081 #define MPU9250_EXT_SENS_DATA_14    0x57
00082 #define MPU9250_EXT_SENS_DATA_15    0x58
00083 #define MPU9250_EXT_SENS_DATA_16    0x59
00084 #define MPU9250_EXT_SENS_DATA_17    0x5A
00085 #define MPU9250_EXT_SENS_DATA_18    0x5B
00086 #define MPU9250_EXT_SENS_DATA_19    0x5C
00087 #define MPU9250_EXT_SENS_DATA_20    0x5D
00088 #define MPU9250_EXT_SENS_DATA_21    0x5E
00089 #define MPU9250_EXT_SENS_DATA_22    0x5F
00090 #define MPU9250_EXT_SENS_DATA_23    0x60
00091 #define MPU9250_I2C_SLV0_DO         0x63
00092 #define MPU9250_I2C_SLV1_DO         0x64
00093 #define MPU9250_I2C_SLV2_DO         0x65
00094 #define MPU9250_I2C_SLV3_DO         0x66
00095 #define MPU9250_I2C_MST_DELAY_CTRL  0x67
00096 #define MPU9250_SIGNAL_PATH_RESET   0x68
00097 #define MPU9250_MOT_DETECT_CTRL     0x69
00098 #define MPU9250_USER_CTRL 0x6A
00099 #define MPU9250_PWR_MGMT_1 0x6B
00100 #define MPU9250_PWR_MGMT_2 0x6C
00101 #define MPU9250_BANK_SEL 0x6D
00102 #define MPU9250_MEM_START_ADDR 0x6E
00103 #define MPU9250_MEM_R_W 0x6F
00104 #define MPU9250_DMP_CFG_1 0x70
00105 #define MPU9250_DMP_CFG_2 0x71
00106 #define MPU9250_FIFO_COUNTH 0x72
00107 #define MPU9250_FIFO_COUNTL 0x73
00108 #define MPU9250_FIFO_R_W 0x74
00109 #define MPU9250_WHOAMI 0x75
00110 #define MPU9250_XA_OFFSET_H         0x77
00111 #define MPU9250_XA_OFFSET_L         0x78
00112 #define MPU9250_YA_OFFSET_H         0x7A
00113 #define MPU9250_YA_OFFSET_L         0x7B
00114 #define MPU9250_ZA_OFFSET_H         0x7D
00115 #define MPU9250_ZA_OFFSET_L         0x7E
00116 /* ---- AK8963 Reg In MPU9250 ----------------------------------------------- */
00117 #define AK8963_I2C_ADDR             0x0c//0x18
00118 #define AK8963_Device_ID            0x48
00119  
00120 // Read-only Reg
00121 #define AK8963_WIA                  0x00
00122 #define AK8963_INFO                 0x01
00123 #define AK8963_ST1                  0x02
00124 #define AK8963_HXL                  0x03
00125 #define AK8963_HXH                  0x04
00126 #define AK8963_HYL                  0x05
00127 #define AK8963_HYH                  0x06
00128 #define AK8963_HZL                  0x07
00129 #define AK8963_HZH                  0x08
00130 #define AK8963_ST2                  0x09
00131 // Write/Read Reg
00132 #define AK8963_CNTL                 0x0A
00133 #define AK8963_RSV                  0x0B
00134 #define AK8963_ASTC                 0x0C
00135 #define AK8963_TS1                  0x0D
00136 #define AK8963_TS2                  0x0E
00137 #define AK8963_I2CDIS               0x0F
00138 // Read-only Reg ( ROM )
00139 #define AK8963_ASAX                 0x10
00140 #define AK8963_ASAY                 0x11
00141 #define AK8963_ASAZ                 0x12
00142 
00143 #define MPU9250_READ_FLAG 0x80
00144 
00145 #define MPU9250_AFS_2G 0
00146 #define MPU9250_AFS_4G 1
00147 #define MPU9250_AFS_8G 2
00148 #define MPU9250_AFS_16G 3
00149  
00150 #define MPU9250_GFS_250DPS 0
00151 #define MPU9250_GFS_500DPS 1
00152 #define MPU9250_GFS_1000DPS 2
00153 #define MPU9250_GFS_2000DPS 3
00154 
00155 
00156 #define MPU9250_AFS_2G_MULTIPLIER 2.0/32768.0
00157 #define MPU9250_AFS_4G_MULTIPLIER 4.0/32768.0
00158 #define MPU9250_AFS_8G_MULTIPLIER 8.0/32768.0
00159 #define MPU9250_AFS_16G_MULTIPLIER 16.0/32768.0
00160  
00161 
00162 #define MPU9250_GFS_250DPS_MULTIPLIER 250.0/32768.0
00163 #define MPU9250_GFS_500DPS_MULTIPLIER 500.0/32768.0
00164 #define MPU9250_GFS_1000DPS_MULTIPLIER 1000.0/32768.0
00165 #define MPU9250_GFS_2000DPS_MULTIPLIER 2000.0/32768.0
00166 
00167 
00168 /* ---- Sensitivity --------------------------------------------------------- */
00169  
00170 #define MPU9250A_2g       ((float)0.000061035156f) // 0.000061035156 g/LSB
00171 #define MPU9250A_4g       ((float)0.000122070312f) // 0.000122070312 g/LSB
00172 #define MPU9250A_8g       ((float)0.000244140625f) // 0.000244140625 g/LSB
00173 #define MPU9250A_16g      ((float)0.000488281250f) // 0.000488281250 g/LSB
00174  
00175 #define MPU9250G_250dps   ((float)0.007633587786f) // 0.007633587786 dps/LSB
00176 #define MPU9250G_500dps   ((float)0.015267175572f) // 0.015267175572 dps/LSB
00177 #define MPU9250G_1000dps  ((float)0.030487804878f) // 0.030487804878 dps/LSB
00178 #define MPU9250G_2000dps  ((float)0.060975609756f) // 0.060975609756 dps/LSB
00179  
00180 #define MPU9250M_4800uT   ((float)0.15f)            // 0.15 uT/LSB
00181  
00182 #define MPU9250T_85degC   ((float)0.002995177763f) // 0.002995177763 degC/LSB
00183 
00184  
00185 class MPU9250Sensor : public BaseSensor {
00186 public:
00187     //SPI at 1MHz
00188     MPU9250Sensor(SPI&,DigitalOut&, void (*debug_)(const char* format, ...)=0);
00189     //get sensor details from actual implementation
00190     virtual char* getSimpleName();
00191     virtual void getSensorDetails(sensor_t*);
00192     //verify basic integrity of underlining hardware
00193     virtual uint32_t verifyIntegrity(uint32_t*);
00194 private:  
00195     SPI& spi; 
00196     DigitalOut& cs;
00197     
00198     float magnetometerCalibration[3];
00199     void initMagnetometr();
00200     uint32_t selfTest(uint32_t* errorResult);
00201     uint32_t gyroscopeSelfTest(uint32_t* errorResult);
00202     uint32_t accelerometerSelfTest(uint32_t* errorResult);
00203     uint32_t magnetometerSelfTest(uint32_t* errorResult);
00204     void readGyroOffset(uint8_t reg, float* data);
00205     void averageData(uint8_t reg,int16_t* data);
00206     uint8_t readRegister( uint8_t reg);
00207     uint8_t readRegisterI2C( uint8_t reg);
00208     void readRegisters(uint8_t reg, uint8_t count, uint8_t * dest);
00209     void readRegistersI2C(uint8_t reg, uint8_t count, uint8_t * dest);
00210     void writeRegister( uint8_t reg,  uint8_t data, uint8_t mask = 0xff,uint8_t pos = 0);
00211     void writeRegisterI2C( uint8_t reg,  uint8_t data, uint8_t mask = 0xff,uint8_t pos = 0);
00212 };
00213  
00214 #endif