A multifunctional and modular Firmware for Multitech's mDot based on ARM mBed provides a widerange of functionality for several Sensors such as MAX44009, BME280, MPU9250, SI1143 and uBlox. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

Dependencies:   mDot_LoRa_Sensornode_Flowmeter_impl mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU9250.h Source File

MPU9250.h

Go to the documentation of this file.
00001 /**
00002  * @file MPU9250.h
00003  *
00004  * @author Adrian
00005  * @date 19.05.2016
00006  *
00007  */
00008 #include "I2C_RT.h "
00009 #include "MPU9250Config.h "
00010 
00011 #ifndef APP_MPU9250_H_
00012 #define APP_MPU9250_H_
00013 
00014 #define MPU9250_DEFAULT_ADDRESS         0xD1
00015 #define MPU9250_ALT_DEFAULT_ADDRESS     0xD2
00016 
00017 #define MPU9250_SELF_TEST_X_GYRO        0x00
00018 #define MPU9250_SELF_TEST_Y_GYRO        0x01
00019 #define MPU9250_SELF_TEST_Z_GYRO        0x02
00020 
00021 #define MPU9250_SELF_TEST_X_ACCEL       0x0D
00022 #define MPU9250_SELF_TEST_Y_ACCEL       0x0E
00023 #define MPU9250_SELF_TEST_Z_ACCEL       0x0F
00024 
00025 #define MPU9250_XG_OFFSET_H             0x13
00026 #define MPU9250_XG_OFFSET_L             0x14
00027 #define MPU9250_YG_OFFSET_H             0x15
00028 #define MPU9250_YG_OFFSET_L             0x16
00029 #define MPU9250_ZG_OFFSET_H             0x17
00030 #define MPU9250_ZG_OFFSET_L             0x18
00031 #define MPU9250_SMPLRT_DIV              0x19
00032 #define MPU9250_CONFIG                  0x1A
00033 #define MPU9250_GYRO_CONFIG             0x1B
00034 #define MPU9250_ACCEL_CONFIG            0x1C
00035 #define MPU9250_ACCEL_CONFIG2           0x1D
00036 #define MPU9250_LP_ACCEL_ODR            0x1E
00037 #define MPU9250_WOM_THR                 0x1F
00038 
00039 #define MPU9250_FIFO_EN                 0x23
00040 #define MPU9250_I2C_MST_CTRL            0x24
00041 #define MPU9250_I2C_SLV0_ADDR           0x25
00042 #define MPU9250_I2C_SLV0_REG            0x26
00043 #define MPU9250_I2C_SLV0_CTRL           0x27
00044 #define MPU9250_I2C_SLV1_ADDR           0x28
00045 #define MPU9250_I2C_SLV1_REG            0x29
00046 #define MPU9250_I2C_SLV1_CTRL           0x2A
00047 #define MPU9250_I2C_SLV2_ADDR           0x2B
00048 #define MPU9250_I2C_SLV2_REG            0x2C
00049 #define MPU9250_I2C_SLV2_CTRL           0x2D
00050 #define MPU9250_I2C_SLV3_ADDR           0x2E
00051 #define MPU9250_I2C_SLV3_REG            0x2F
00052 #define MPU9250_I2C_SLV3_CTRL           0x30
00053 #define MPU9250_I2C_SLV4_ADDR           0x31
00054 #define MPU9250_I2C_SLV4_REG            0x32
00055 #define MPU9250_I2C_SLV4_DO             0x33
00056 #define MPU9250_I2C_SLV4_CTRL           0x34
00057 #define MPU9250_I2C_SLV4_DI             0x35
00058 #define MPU9250_I2C_MST_STATUS          0x36
00059 #define MPU9250_INT_PIN_CFG             0x37
00060 #define MPU9250_INT_ENABLE              0x38
00061 
00062 #define MPU9250_INT_STATUS              0x3A
00063 #define MPU9250_ACCEL_XOUT_H            0x3B
00064 #define MPU9250_ACCEL_XOUT_L            0x3C
00065 #define MPU9250_ACCEL_YOUT_H            0x3D
00066 #define MPU9250_ACCEL_YOUT_L            0x3E
00067 #define MPU9250_ACCEL_ZOUT_H            0x3F
00068 #define MPU9250_ACCEL_ZOUT_L            0x40
00069 #define MPU9250_TEMP_OUT_H              0x41
00070 #define MPU9250_TEMP_OUT_L              0x42
00071 #define MPU9250_GYRO_XOUT_H             0x43
00072 #define MPU9250_GYRO_XOUT_L             0x44
00073 #define MPU9250_GYRO_YOUT_H             0x45
00074 #define MPU9250_GYRO_YOUT_L             0x46
00075 #define MPU9250_GYRO_ZOUT_H             0x47
00076 #define MPU9250_GYRO_ZOUT_L             0x48
00077 #define MPU9250_EXT_SENS_DATA_00        0x49
00078 #define MPU9250_EXT_SENS_DATA_01        0x4A
00079 #define MPU9250_EXT_SENS_DATA_02        0x4B
00080 #define MPU9250_EXT_SENS_DATA_03        0x4C
00081 #define MPU9250_EXT_SENS_DATA_04        0x4D
00082 #define MPU9250_EXT_SENS_DATA_05        0x4E
00083 #define MPU9250_EXT_SENS_DATA_06        0x4F
00084 #define MPU9250_EXT_SENS_DATA_07        0x50
00085 #define MPU9250_EXT_SENS_DATA_08        0x51
00086 #define MPU9250_EXT_SENS_DATA_09        0x52
00087 #define MPU9250_EXT_SENS_DATA_10        0x53
00088 #define MPU9250_EXT_SENS_DATA_11        0x54
00089 #define MPU9250_EXT_SENS_DATA_12        0x55
00090 #define MPU9250_EXT_SENS_DATA_13        0x56
00091 #define MPU9250_EXT_SENS_DATA_14        0x57
00092 #define MPU9250_EXT_SENS_DATA_15        0x58
00093 #define MPU9250_EXT_SENS_DATA_16        0x59
00094 #define MPU9250_EXT_SENS_DATA_17        0x5A
00095 #define MPU9250_EXT_SENS_DATA_18        0x5B
00096 #define MPU9250_EXT_SENS_DATA_19        0x5C
00097 #define MPU9250_EXT_SENS_DATA_20        0x5D
00098 #define MPU9250_EXT_SENS_DATA_21        0x5E
00099 #define MPU9250_EXT_SENS_DATA_22        0x5F
00100 #define MPU9250_EXT_SENS_DATA_23        0x60
00101 
00102 #define MPU9250_I2C_SLV0_DO             0x63
00103 #define MPU9250_I2C_SLV1_DO             0x64
00104 #define MPU9250_I2C_SLV2_DO             0x65
00105 #define MPU9250_I2C_SLV3_DO             0x66
00106 #define MPU9250_I2C_MST_DELAY_CTRL      0x67
00107 #define MPU9250_SIGNAL_PATH_RESET       0x68
00108 #define MPU9250_MOT_DETECT_CTRL         0x69
00109 #define MPU9250_USER_CTRL               0x6A
00110 #define MPU9250_PWR_MGMT_1              0x6B
00111 #define MPU9250_PWR_MGMT_2              0x6C
00112 
00113 #define MPU9250_FIFO_COUNTH             0x72
00114 #define MPU9250_FIFO_COUNTL             0x73
00115 #define MPU9250_FIFO_R_W                0x74
00116 #define MPU9250_WHO_AM_I                0x75
00117 #define MPU9250_XA_OFFSET_H             0x77
00118 #define MPU9250_XA_OFFSET_L             0x78
00119 
00120 #define MPU9250_YA_OFFSET_H             0x7A
00121 #define MPU9250_YA_OFFSET_L             0x7B
00122 
00123 #define MPU9250_ZA_OFFSET_H             0x7D
00124 #define MPU9250_ZA_OFFSET_L             0x7E
00125 
00126 //reset values
00127 #define WHOAMI_RESET_VAL                0x71
00128 #define POWER_MANAGMENT_1_RESET_VAL     0x01
00129 #define DEFAULT_RESET_VALUE             0x00
00130 
00131 #define WHOAMI_DEFAULT_VAL              0x68
00132 
00133 //CONFIG register masks
00134 #define MPU9250_FIFO_MODE_MASK          0x40
00135 #define MPU9250_EXT_SYNC_SET_MASK       0x38
00136 #define MPU9250_DLPF_CFG_MASK           0x07
00137 
00138 //GYRO_CONFIG register masks
00139 #define MPU9250_XGYRO_CTEN_MASK         0x80
00140 #define MPU9250_YGYRO_CTEN_MASK         0x40
00141 #define MPU9250_ZGYRO_CTEN_MASK         0x20
00142 #define MPU9250_GYRO_FS_SEL_MASK        0x18
00143 #define MPU9250_FCHOICE_B_MASK          0x03
00144 
00145 //ACCEL_CONFIG register masks
00146 #define MPU9250_AX_ST_EN_MASK           0x80
00147 #define MPU9250_AY_ST_EN_MASK           0x40
00148 #define MPU9250_AZ_ST_EN_MASK           0x20
00149 #define MPU9250_ACCEL_FS_SEL_MASK       0x18
00150 
00151 //ACCEL_CONFIG_2 register masks
00152 #define MPU9250_ACCEL_FCHOICE_B_MASK    0xC0
00153 #define MPU9250_A_DLPF_CFG_MASK         0x03
00154 
00155 //LP_ACCEL_ODR register masks
00156 #define MPU9250_LPOSC_CLKSEL_MASK       0x0F
00157 
00158 //FIFO_EN register masks
00159 #define MPU9250_TEMP_FIFO_EN_MASK       0x80
00160 #define MPU9250_GYRO_XOUT_MASK          0x40
00161 #define MPU9250_GYRO_YOUT_MASK          0x20
00162 #define MPU9250_GYRO_ZOUT_MASK          0x10
00163 #define MPU9250_ACCEL_MASK              0x08
00164 #define MPU9250_SLV2_MASK               0x04
00165 #define MPU9250_SLV1_MASK               0x02
00166 #define MPU9250_SLV0_MASK               0x01
00167 
00168 //I2C_MST_CTRL register masks
00169 #define MPU9250_MULT_MST_EN_MASK        0x80
00170 #define MPU9250_WAIT_FOR_ES_MASK        0x40
00171 #define MPU9250_SLV_3_FIFO_EN_MASK      0x20
00172 #define MPU9250_I2C_MST_P_NSR_MASK      0x10
00173 #define MPU9250_I2C_MST_CLK_MASK        0x0F
00174 
00175 //I2C_SLV0_ADDR register masks
00176 #define MPU9250_I2C_SLV0_RNW_MASK       0x80
00177 #define MPU9250_I2C_ID_0_MASK           0x7F
00178 
00179 //I2C_SLV0_CTRL register masks
00180 #define MPU9250_I2C_SLV0_EN_MASK        0x80
00181 #define MPU9250_I2C_SLV0_BYTE_SW_MASK   0x40
00182 #define MPU9250_I2C_SLV0_REG_DIS_MASK   0x20
00183 #define MPU9250_I2C_SLV0_GRP_MASK       0x10
00184 #define MPU9250_I2C_SLV0_LENG_MASK      0x0F
00185 
00186 //I2C_SLV1_ADDR register masks
00187 #define MPU9250_I2C_SLV1_RNW_MASK       0x80
00188 #define MPU9250_I2C_ID_1_MASK           0x7F
00189 
00190 //I2C_SLV1_CTRL register masks
00191 #define MPU9250_I2C_SLV1_EN_MASK        0x80
00192 #define MPU9250_I2C_SLV1_BYTE_SW_MASK   0x40
00193 #define MPU9250_I2C_SLV1_REG_DIS_MASK   0x20
00194 #define MPU9250_I2C_SLV1_GRP_MASK       0x10
00195 #define MPU9250_I2C_SLV1_LENG_MASK      0x0F
00196 
00197 //I2C_SLV2_ADDR register masks
00198 #define MPU9250_I2C_SLV2_RNW_MASK       0x80
00199 #define MPU9250_I2C_ID_2_MASK           0x7F
00200 
00201 //I2C_SLV2_CTRL register masks
00202 #define MPU9250_I2C_SLV2_EN_MASK        0x80
00203 #define MPU9250_I2C_SLV2_BYTE_SW_MASK   0x40
00204 #define MPU9250_I2C_SLV2_REG_DIS_MASK   0x20
00205 #define MPU9250_I2C_SLV2_GRP_MASK       0x10
00206 #define MPU9250_I2C_SLV2_LENG_MASK      0x0F
00207 
00208 //I2C_SLV3_ADDR register masks
00209 #define MPU9250_I2C_SLV3_RNW_MASK       0x80
00210 #define MPU9250_I2C_ID_3_MASK           0x7F
00211 
00212 //I2C_SLV3_CTRL register masks
00213 #define MPU9250_I2C_SLV3_EN_MASK        0x80
00214 #define MPU9250_I2C_SLV3_BYTE_SW_MASK   0x40
00215 #define MPU9250_I2C_SLV3_REG_DIS_MASK   0x20
00216 #define MPU9250_I2C_SLV3_GRP_MASK       0x10
00217 #define MPU9250_I2C_SLV3_LENG_MASK      0x0F
00218 
00219 //I2C_SLV4_ADDR register masks
00220 #define MPU9250_I2C_SLV4_RNW_MASK       0x80
00221 #define MPU9250_I2C_ID_4_MASK           0x7F
00222 
00223 //I2C_SLV4_CTRL register masks
00224 #define MPU9250_I2C_SLV4_EN_MASK        0x80
00225 #define MPU9250_SLV4_DONE_INT_EN_MASK   0x40
00226 #define MPU9250_I2C_SLV4_REG_DIS_MASK   0x20
00227 #define MPU9250_I2C_MST_DLY_MASK        0x1F
00228 
00229 //I2C_MST_STATUS register masks
00230 #define MPU9250_PASS_THROUGH_MASK       0x80
00231 #define MPU9250_I2C_SLV4_DONE_MASK      0x40
00232 #define MPU9250_I2C_LOST_ARB_MASK       0x20
00233 #define MPU9250_I2C_SLV4_NACK_MASK      0x10
00234 #define MPU9250_I2C_SLV3_NACK_MASK      0x08
00235 #define MPU9250_I2C_SLV2_NACK_MASK      0x04
00236 #define MPU9250_I2C_SLV1_NACK_MASK      0x02
00237 #define MPU9250_I2C_SLV0_NACK_MASK      0x01
00238 
00239 //INT_STATUS register masks
00240 #define MPU9250_WOM_INT_MASK            0x40
00241 #define MPU9250_FIFO_OFLOW_INT_MASK     0x10
00242 #define MPU9250_FSYNC_INT_MASK          0x08
00243 #define MPU9250_RAW_DATA_RDY_INT_MASK   0x01
00244 
00245 //I2C_MST_DELAY_CTRL register masks
00246 #define MPU9250_DELAY_ES_SHADOW_MASK    0x80
00247 #define MPU9250_I2C_SLV4_DLY_EN_MASK    0x10
00248 #define MPU9250_I2C_SLV3_DLY_EN_MASK    0x08
00249 #define MPU9250_I2C_SLV2_DLY_EN_MASK    0x04
00250 #define MPU9250_I2C_SLV1_DLY_EN_MASK    0x02
00251 #define MPU9250_I2C_SLV0_DLY_EN_MASK    0x01
00252 
00253 //SIGNAL_PATH_RESET register masks
00254 #define MPU9250_GYRO_RST_MASK           0x04
00255 #define MPU9250_ACCEL_RST_MASK          0x02
00256 #define MPU9250_TEMP_RST_MASK           0x01
00257 
00258 //MOT_DETECT_CTRL register masks
00259 #define MPU9250_ACCEL_INTEL_EN_MASK     0x80
00260 #define MPU9250_ACCEL_INTEL_MODE_MASK   0x40
00261 
00262 //USER_CTRL register masks
00263 #define MPU9250_FIFO_EN_MASK            0x40
00264 #define MPU9250_I2C_MST_EN_MASK         0x20
00265 #define MPU9250_I2C_IF_DIS_MASK         0x10
00266 #define MPU9250_FIFO_RST_MASK           0x04
00267 #define MPU9250_I2C_MST_RST_MASK        0x02
00268 #define MPU9250_SIG_COND_RST_MASK       0x01
00269 
00270 //PWR_MGMT_1 register masks
00271 #define MPU9250_H_RESET_MASK            0x80
00272 #define MPU9250_SLEEP_MASK              0x40
00273 #define MPU9250_CYCLE_MASK              0x20
00274 #define MPU9250_GYRO_STANDBY_CYCLE_MASK 0x10
00275 #define MPU9250_PD_PTAT_MASK            0x08
00276 #define MPU9250_CLKSEL_MASK             0x07
00277 
00278 //PWR_MGMT_2 register masks
00279 #define MPU9250_DISABLE_XA_MASK         0x20
00280 #define MPU9250_DISABLE_YA_MASK         0x10
00281 #define MPU9250_DISABLE_ZA_MASK         0x08
00282 #define MPU9250_DISABLE_XG_MASK         0x04
00283 #define MPU9250_DISABLE_YG_MASK         0x02
00284 #define MPU9250_DISABLE_ZG_MASK         0x01
00285 
00286 #define MPU9250_DISABLE_XYZA_MASK       0x38
00287 #define MPU9250_DISABLE_XYZG_MASK       0x07
00288 
00289 //Magnetometer register maps
00290 #define MPU9250_MAG_ADDRESS             0x0C<<1//Shift by 1 needed for access via I2C
00291 
00292 #define MPU9250_MAG_WIA                 0x00
00293 #define MPU9250_MAG_INFO                0x01
00294 #define MPU9250_MAG_ST1                 0x02
00295 #define MPU9250_MAG_XOUT_L              0x03
00296 #define MPU9250_MAG_XOUT_H              0x04
00297 #define MPU9250_MAG_YOUT_L              0x05
00298 #define MPU9250_MAG_YOUT_H              0x06
00299 #define MPU9250_MAG_ZOUT_L              0x07
00300 #define MPU9250_MAG_ZOUT_H              0x08
00301 #define MPU9250_MAG_ST2                 0x09
00302 #define MPU9250_MAG_CNTL1               0x0A
00303 #define MPU9250_MAG_CNTL2               0x0B //reserved mystery meat
00304 #define MPU9250_MAG_ASTC                0x0C
00305 #define MPU9250_MAG_TS1                 0x0D
00306 #define MPU9250_MAG_TS2                 0x0E
00307 #define MPU9250_MAG_I2CDIS              0x0F
00308 #define MPU9250_MAG_ASAX                0x10
00309 #define MPU9250_MAG_ASAY                0x11
00310 #define MPU9250_MAG_ASAZ                0x12
00311 
00312 //Magnetometer register masks
00313 #define MPU9250_WIA_MASK 0x48
00314 
00315 /**
00316  * @class MPU9250
00317  * @brief Provides Functionality to control the MPU9250 Sensor on the Sensbert
00318  */
00319 class MPU9250 {
00320 public:
00321     MPU9250(I2C_RT* i2c);
00322     virtual ~MPU9250();
00323 
00324     /**
00325      * @brief Initializes the MPU9250 according to the desired MPU9250_MODE
00326      * @param desiredMode the desired Mode depending on which the MPU9250 has to be
00327      * configured
00328      */
00329     void init(MPU9250_MODE desiredMode);
00330 
00331 
00332     /**
00333      * @brief Gets the measured x-axis acceleration.
00334      * Important: Acceleration measurement first needs to be enable by
00335      * enableAccelerationMeasurement()
00336      * @return
00337      */
00338     float getXAxisAcceleration();
00339 
00340     /**
00341      * @brief Gets the measured y-axis acceleration.
00342      * Important: Acceleration measurement first needs to be enable by
00343      * enableAccelerationMeasurement()
00344      * @return
00345      */
00346     float getYAxisAcceleration();
00347 
00348     /**
00349      * @brief Gets the measured z-axis acceleration.
00350      * Important: Acceleration measurement first needs to be enable by
00351      * enableAccelerationMeasurement()
00352      * @return
00353      */
00354     float getZAxisAcceleration();
00355 
00356     /**
00357      * @brief Gets the measured x-axis gyroscope value.
00358      * Important: Acceleration measurement first needs to be enable by
00359      * enableAccelerationMeasurement()
00360      * @return
00361      */
00362     float getXAxisGyro();
00363 
00364     /**
00365      * @brief Gets the measured y-axis gyroscope value
00366      * Important: Gyroscope measurement first needs to be enable by
00367      * enableGyroscopeMeasurement()
00368      * @return
00369      */
00370     float getYAxisGyro();
00371 
00372     /**
00373      * @brief Gets the measured z-axis gyroscope value.
00374      * Important: Gyroscope measurement first needs to be enable by
00375      * enableGyroscopeMeasurement()
00376      * @return
00377      */
00378     float getZAxisGyro();
00379 
00380     /**
00381      * @brief Gets the measured x-axis tesla value.
00382      * Important: Gyroscope measurement first needs to be enable by
00383      * enableGyroscopeMeasurement()
00384      * @return
00385      */
00386     float getXAxisTesla();
00387 
00388     /**
00389      * @brief Gets the measured y-axis tesla value.
00390      * Important: Tesla measurement first needs to be enable by
00391      * enableTeslaMeasurement()
00392      * @return
00393      */
00394     float getYAxisTesla();
00395 
00396     /**
00397      * @brief Gets the measured z-axis tesla value.
00398      * Important: Tesla measurement first needs to be enable by
00399      * enableTeslaMeasurement()
00400      * @return
00401      */
00402     float getZAxisTesla();
00403 private:
00404     I2C_RT* i2c;
00405     MPU9250Config* config;
00406 
00407     /**
00408      * @brief Set the i2c that is used to control the MPU9250
00409      * @param i2c the i2c that is used to control the MPU9250
00410      */
00411     void setI2c(I2C_RT* i2c);
00412 
00413     /**
00414      * @brief enables the acceleration measurement for all axis
00415      * according to the MPU9250Config.
00416      */
00417     void enableAxisAccelerationMeasurement();
00418 
00419     /**
00420      * @brief enables the gyroscope measurement for all axis
00421      * according to the MPU9250Config.
00422      */
00423     void enableAxisGyroscopeMeasurement();
00424 
00425     /**
00426      * @brief enables the tesla measurement for all axis
00427      * according to the MPU9250Config.
00428      */
00429     void enableAxisTeslaMeasurement();
00430 
00431 
00432     /**
00433      * @brief Configures and enables interrupts according to the MPU9250Config
00434      */
00435     void configureInterrupts();
00436 
00437     /**
00438      * @brief Sets the motion threshold in g when an interupt is triggered
00439      * according to the MPU9250Config
00440      */
00441     void setWakeOnReceiveThreshold();
00442 };
00443 
00444 #endif /* APP_MPU9250_H_ */