lora sensnode
Dependencies: libmDot mbed-rtos mbed
Fork of mDot_LoRa_Sensornode by
Diff: app/MPU9250.h
- Revision:
- 0:f2815503561f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/MPU9250.h Wed Jul 06 20:40:36 2016 +0000 @@ -0,0 +1,444 @@ +/** + * @file MPU9250.h + * + * @author Adrian + * @date 19.05.2016 + * + */ +#include "I2C_RT.h" +#include "MPU9250Config.h" + +#ifndef APP_MPU9250_H_ +#define APP_MPU9250_H_ + +#define MPU9250_DEFAULT_ADDRESS 0xD1 +#define MPU9250_ALT_DEFAULT_ADDRESS 0xD2 + +#define MPU9250_SELF_TEST_X_GYRO 0x00 +#define MPU9250_SELF_TEST_Y_GYRO 0x01 +#define MPU9250_SELF_TEST_Z_GYRO 0x02 + +#define MPU9250_SELF_TEST_X_ACCEL 0x0D +#define MPU9250_SELF_TEST_Y_ACCEL 0x0E +#define MPU9250_SELF_TEST_Z_ACCEL 0x0F + +#define MPU9250_XG_OFFSET_H 0x13 +#define MPU9250_XG_OFFSET_L 0x14 +#define MPU9250_YG_OFFSET_H 0x15 +#define MPU9250_YG_OFFSET_L 0x16 +#define MPU9250_ZG_OFFSET_H 0x17 +#define MPU9250_ZG_OFFSET_L 0x18 +#define MPU9250_SMPLRT_DIV 0x19 +#define MPU9250_CONFIG 0x1A +#define MPU9250_GYRO_CONFIG 0x1B +#define MPU9250_ACCEL_CONFIG 0x1C +#define MPU9250_ACCEL_CONFIG2 0x1D +#define MPU9250_LP_ACCEL_ODR 0x1E +#define MPU9250_WOM_THR 0x1F + +#define MPU9250_FIFO_EN 0x23 +#define MPU9250_I2C_MST_CTRL 0x24 +#define MPU9250_I2C_SLV0_ADDR 0x25 +#define MPU9250_I2C_SLV0_REG 0x26 +#define MPU9250_I2C_SLV0_CTRL 0x27 +#define MPU9250_I2C_SLV1_ADDR 0x28 +#define MPU9250_I2C_SLV1_REG 0x29 +#define MPU9250_I2C_SLV1_CTRL 0x2A +#define MPU9250_I2C_SLV2_ADDR 0x2B +#define MPU9250_I2C_SLV2_REG 0x2C +#define MPU9250_I2C_SLV2_CTRL 0x2D +#define MPU9250_I2C_SLV3_ADDR 0x2E +#define MPU9250_I2C_SLV3_REG 0x2F +#define MPU9250_I2C_SLV3_CTRL 0x30 +#define MPU9250_I2C_SLV4_ADDR 0x31 +#define MPU9250_I2C_SLV4_REG 0x32 +#define MPU9250_I2C_SLV4_DO 0x33 +#define MPU9250_I2C_SLV4_CTRL 0x34 +#define MPU9250_I2C_SLV4_DI 0x35 +#define MPU9250_I2C_MST_STATUS 0x36 +#define MPU9250_INT_PIN_CFG 0x37 +#define MPU9250_INT_ENABLE 0x38 + +#define MPU9250_INT_STATUS 0x3A +#define MPU9250_ACCEL_XOUT_H 0x3B +#define MPU9250_ACCEL_XOUT_L 0x3C +#define MPU9250_ACCEL_YOUT_H 0x3D +#define MPU9250_ACCEL_YOUT_L 0x3E +#define MPU9250_ACCEL_ZOUT_H 0x3F +#define MPU9250_ACCEL_ZOUT_L 0x40 +#define MPU9250_TEMP_OUT_H 0x41 +#define MPU9250_TEMP_OUT_L 0x42 +#define MPU9250_GYRO_XOUT_H 0x43 +#define MPU9250_GYRO_XOUT_L 0x44 +#define MPU9250_GYRO_YOUT_H 0x45 +#define MPU9250_GYRO_YOUT_L 0x46 +#define MPU9250_GYRO_ZOUT_H 0x47 +#define MPU9250_GYRO_ZOUT_L 0x48 +#define MPU9250_EXT_SENS_DATA_00 0x49 +#define MPU9250_EXT_SENS_DATA_01 0x4A +#define MPU9250_EXT_SENS_DATA_02 0x4B +#define MPU9250_EXT_SENS_DATA_03 0x4C +#define MPU9250_EXT_SENS_DATA_04 0x4D +#define MPU9250_EXT_SENS_DATA_05 0x4E +#define MPU9250_EXT_SENS_DATA_06 0x4F +#define MPU9250_EXT_SENS_DATA_07 0x50 +#define MPU9250_EXT_SENS_DATA_08 0x51 +#define MPU9250_EXT_SENS_DATA_09 0x52 +#define MPU9250_EXT_SENS_DATA_10 0x53 +#define MPU9250_EXT_SENS_DATA_11 0x54 +#define MPU9250_EXT_SENS_DATA_12 0x55 +#define MPU9250_EXT_SENS_DATA_13 0x56 +#define MPU9250_EXT_SENS_DATA_14 0x57 +#define MPU9250_EXT_SENS_DATA_15 0x58 +#define MPU9250_EXT_SENS_DATA_16 0x59 +#define MPU9250_EXT_SENS_DATA_17 0x5A +#define MPU9250_EXT_SENS_DATA_18 0x5B +#define MPU9250_EXT_SENS_DATA_19 0x5C +#define MPU9250_EXT_SENS_DATA_20 0x5D +#define MPU9250_EXT_SENS_DATA_21 0x5E +#define MPU9250_EXT_SENS_DATA_22 0x5F +#define MPU9250_EXT_SENS_DATA_23 0x60 + +#define MPU9250_I2C_SLV0_DO 0x63 +#define MPU9250_I2C_SLV1_DO 0x64 +#define MPU9250_I2C_SLV2_DO 0x65 +#define MPU9250_I2C_SLV3_DO 0x66 +#define MPU9250_I2C_MST_DELAY_CTRL 0x67 +#define MPU9250_SIGNAL_PATH_RESET 0x68 +#define MPU9250_MOT_DETECT_CTRL 0x69 +#define MPU9250_USER_CTRL 0x6A +#define MPU9250_PWR_MGMT_1 0x6B +#define MPU9250_PWR_MGMT_2 0x6C + +#define MPU9250_FIFO_COUNTH 0x72 +#define MPU9250_FIFO_COUNTL 0x73 +#define MPU9250_FIFO_R_W 0x74 +#define MPU9250_WHO_AM_I 0x75 +#define MPU9250_XA_OFFSET_H 0x77 +#define MPU9250_XA_OFFSET_L 0x78 + +#define MPU9250_YA_OFFSET_H 0x7A +#define MPU9250_YA_OFFSET_L 0x7B + +#define MPU9250_ZA_OFFSET_H 0x7D +#define MPU9250_ZA_OFFSET_L 0x7E + +//reset values +#define WHOAMI_RESET_VAL 0x71 +#define POWER_MANAGMENT_1_RESET_VAL 0x01 +#define DEFAULT_RESET_VALUE 0x00 + +#define WHOAMI_DEFAULT_VAL 0x68 + +//CONFIG register masks +#define MPU9250_FIFO_MODE_MASK 0x40 +#define MPU9250_EXT_SYNC_SET_MASK 0x38 +#define MPU9250_DLPF_CFG_MASK 0x07 + +//GYRO_CONFIG register masks +#define MPU9250_XGYRO_CTEN_MASK 0x80 +#define MPU9250_YGYRO_CTEN_MASK 0x40 +#define MPU9250_ZGYRO_CTEN_MASK 0x20 +#define MPU9250_GYRO_FS_SEL_MASK 0x18 +#define MPU9250_FCHOICE_B_MASK 0x03 + +//ACCEL_CONFIG register masks +#define MPU9250_AX_ST_EN_MASK 0x80 +#define MPU9250_AY_ST_EN_MASK 0x40 +#define MPU9250_AZ_ST_EN_MASK 0x20 +#define MPU9250_ACCEL_FS_SEL_MASK 0x18 + +//ACCEL_CONFIG_2 register masks +#define MPU9250_ACCEL_FCHOICE_B_MASK 0xC0 +#define MPU9250_A_DLPF_CFG_MASK 0x03 + +//LP_ACCEL_ODR register masks +#define MPU9250_LPOSC_CLKSEL_MASK 0x0F + +//FIFO_EN register masks +#define MPU9250_TEMP_FIFO_EN_MASK 0x80 +#define MPU9250_GYRO_XOUT_MASK 0x40 +#define MPU9250_GYRO_YOUT_MASK 0x20 +#define MPU9250_GYRO_ZOUT_MASK 0x10 +#define MPU9250_ACCEL_MASK 0x08 +#define MPU9250_SLV2_MASK 0x04 +#define MPU9250_SLV1_MASK 0x02 +#define MPU9250_SLV0_MASK 0x01 + +//I2C_MST_CTRL register masks +#define MPU9250_MULT_MST_EN_MASK 0x80 +#define MPU9250_WAIT_FOR_ES_MASK 0x40 +#define MPU9250_SLV_3_FIFO_EN_MASK 0x20 +#define MPU9250_I2C_MST_P_NSR_MASK 0x10 +#define MPU9250_I2C_MST_CLK_MASK 0x0F + +//I2C_SLV0_ADDR register masks +#define MPU9250_I2C_SLV0_RNW_MASK 0x80 +#define MPU9250_I2C_ID_0_MASK 0x7F + +//I2C_SLV0_CTRL register masks +#define MPU9250_I2C_SLV0_EN_MASK 0x80 +#define MPU9250_I2C_SLV0_BYTE_SW_MASK 0x40 +#define MPU9250_I2C_SLV0_REG_DIS_MASK 0x20 +#define MPU9250_I2C_SLV0_GRP_MASK 0x10 +#define MPU9250_I2C_SLV0_LENG_MASK 0x0F + +//I2C_SLV1_ADDR register masks +#define MPU9250_I2C_SLV1_RNW_MASK 0x80 +#define MPU9250_I2C_ID_1_MASK 0x7F + +//I2C_SLV1_CTRL register masks +#define MPU9250_I2C_SLV1_EN_MASK 0x80 +#define MPU9250_I2C_SLV1_BYTE_SW_MASK 0x40 +#define MPU9250_I2C_SLV1_REG_DIS_MASK 0x20 +#define MPU9250_I2C_SLV1_GRP_MASK 0x10 +#define MPU9250_I2C_SLV1_LENG_MASK 0x0F + +//I2C_SLV2_ADDR register masks +#define MPU9250_I2C_SLV2_RNW_MASK 0x80 +#define MPU9250_I2C_ID_2_MASK 0x7F + +//I2C_SLV2_CTRL register masks +#define MPU9250_I2C_SLV2_EN_MASK 0x80 +#define MPU9250_I2C_SLV2_BYTE_SW_MASK 0x40 +#define MPU9250_I2C_SLV2_REG_DIS_MASK 0x20 +#define MPU9250_I2C_SLV2_GRP_MASK 0x10 +#define MPU9250_I2C_SLV2_LENG_MASK 0x0F + +//I2C_SLV3_ADDR register masks +#define MPU9250_I2C_SLV3_RNW_MASK 0x80 +#define MPU9250_I2C_ID_3_MASK 0x7F + +//I2C_SLV3_CTRL register masks +#define MPU9250_I2C_SLV3_EN_MASK 0x80 +#define MPU9250_I2C_SLV3_BYTE_SW_MASK 0x40 +#define MPU9250_I2C_SLV3_REG_DIS_MASK 0x20 +#define MPU9250_I2C_SLV3_GRP_MASK 0x10 +#define MPU9250_I2C_SLV3_LENG_MASK 0x0F + +//I2C_SLV4_ADDR register masks +#define MPU9250_I2C_SLV4_RNW_MASK 0x80 +#define MPU9250_I2C_ID_4_MASK 0x7F + +//I2C_SLV4_CTRL register masks +#define MPU9250_I2C_SLV4_EN_MASK 0x80 +#define MPU9250_SLV4_DONE_INT_EN_MASK 0x40 +#define MPU9250_I2C_SLV4_REG_DIS_MASK 0x20 +#define MPU9250_I2C_MST_DLY_MASK 0x1F + +//I2C_MST_STATUS register masks +#define MPU9250_PASS_THROUGH_MASK 0x80 +#define MPU9250_I2C_SLV4_DONE_MASK 0x40 +#define MPU9250_I2C_LOST_ARB_MASK 0x20 +#define MPU9250_I2C_SLV4_NACK_MASK 0x10 +#define MPU9250_I2C_SLV3_NACK_MASK 0x08 +#define MPU9250_I2C_SLV2_NACK_MASK 0x04 +#define MPU9250_I2C_SLV1_NACK_MASK 0x02 +#define MPU9250_I2C_SLV0_NACK_MASK 0x01 + +//INT_STATUS register masks +#define MPU9250_WOM_INT_MASK 0x40 +#define MPU9250_FIFO_OFLOW_INT_MASK 0x10 +#define MPU9250_FSYNC_INT_MASK 0x08 +#define MPU9250_RAW_DATA_RDY_INT_MASK 0x01 + +//I2C_MST_DELAY_CTRL register masks +#define MPU9250_DELAY_ES_SHADOW_MASK 0x80 +#define MPU9250_I2C_SLV4_DLY_EN_MASK 0x10 +#define MPU9250_I2C_SLV3_DLY_EN_MASK 0x08 +#define MPU9250_I2C_SLV2_DLY_EN_MASK 0x04 +#define MPU9250_I2C_SLV1_DLY_EN_MASK 0x02 +#define MPU9250_I2C_SLV0_DLY_EN_MASK 0x01 + +//SIGNAL_PATH_RESET register masks +#define MPU9250_GYRO_RST_MASK 0x04 +#define MPU9250_ACCEL_RST_MASK 0x02 +#define MPU9250_TEMP_RST_MASK 0x01 + +//MOT_DETECT_CTRL register masks +#define MPU9250_ACCEL_INTEL_EN_MASK 0x80 +#define MPU9250_ACCEL_INTEL_MODE_MASK 0x40 + +//USER_CTRL register masks +#define MPU9250_FIFO_EN_MASK 0x40 +#define MPU9250_I2C_MST_EN_MASK 0x20 +#define MPU9250_I2C_IF_DIS_MASK 0x10 +#define MPU9250_FIFO_RST_MASK 0x04 +#define MPU9250_I2C_MST_RST_MASK 0x02 +#define MPU9250_SIG_COND_RST_MASK 0x01 + +//PWR_MGMT_1 register masks +#define MPU9250_H_RESET_MASK 0x80 +#define MPU9250_SLEEP_MASK 0x40 +#define MPU9250_CYCLE_MASK 0x20 +#define MPU9250_GYRO_STANDBY_CYCLE_MASK 0x10 +#define MPU9250_PD_PTAT_MASK 0x08 +#define MPU9250_CLKSEL_MASK 0x07 + +//PWR_MGMT_2 register masks +#define MPU9250_DISABLE_XA_MASK 0x20 +#define MPU9250_DISABLE_YA_MASK 0x10 +#define MPU9250_DISABLE_ZA_MASK 0x08 +#define MPU9250_DISABLE_XG_MASK 0x04 +#define MPU9250_DISABLE_YG_MASK 0x02 +#define MPU9250_DISABLE_ZG_MASK 0x01 + +#define MPU9250_DISABLE_XYZA_MASK 0x38 +#define MPU9250_DISABLE_XYZG_MASK 0x07 + +//Magnetometer register maps +#define MPU9250_MAG_ADDRESS 0x0C<<1//Shift by 1 needed for access via I2C + +#define MPU9250_MAG_WIA 0x00 +#define MPU9250_MAG_INFO 0x01 +#define MPU9250_MAG_ST1 0x02 +#define MPU9250_MAG_XOUT_L 0x03 +#define MPU9250_MAG_XOUT_H 0x04 +#define MPU9250_MAG_YOUT_L 0x05 +#define MPU9250_MAG_YOUT_H 0x06 +#define MPU9250_MAG_ZOUT_L 0x07 +#define MPU9250_MAG_ZOUT_H 0x08 +#define MPU9250_MAG_ST2 0x09 +#define MPU9250_MAG_CNTL1 0x0A +#define MPU9250_MAG_CNTL2 0x0B //reserved mystery meat +#define MPU9250_MAG_ASTC 0x0C +#define MPU9250_MAG_TS1 0x0D +#define MPU9250_MAG_TS2 0x0E +#define MPU9250_MAG_I2CDIS 0x0F +#define MPU9250_MAG_ASAX 0x10 +#define MPU9250_MAG_ASAY 0x11 +#define MPU9250_MAG_ASAZ 0x12 + +//Magnetometer register masks +#define MPU9250_WIA_MASK 0x48 + +/** + * @class MPU9250 + * @brief Provides Functionality to control the MPU9250 Sensor on the Sensbert + */ +class MPU9250 { +public: + MPU9250(I2C_RT* i2c); + virtual ~MPU9250(); + + /** + * @brief Initializes the MPU9250 according to the desired MPU9250_MODE + * @param desiredMode the desired Mode depending on which the MPU9250 has to be + * configured + */ + void init(MPU9250_MODE desiredMode); + + + /** + * @brief Gets the measured x-axis acceleration. + * Important: Acceleration measurement first needs to be enable by + * enableAccelerationMeasurement() + * @return + */ + float getXAxisAcceleration(); + + /** + * @brief Gets the measured y-axis acceleration. + * Important: Acceleration measurement first needs to be enable by + * enableAccelerationMeasurement() + * @return + */ + float getYAxisAcceleration(); + + /** + * @brief Gets the measured z-axis acceleration. + * Important: Acceleration measurement first needs to be enable by + * enableAccelerationMeasurement() + * @return + */ + float getZAxisAcceleration(); + + /** + * @brief Gets the measured x-axis gyroscope value. + * Important: Acceleration measurement first needs to be enable by + * enableAccelerationMeasurement() + * @return + */ + float getXAxisGyro(); + + /** + * @brief Gets the measured y-axis gyroscope value + * Important: Gyroscope measurement first needs to be enable by + * enableGyroscopeMeasurement() + * @return + */ + float getYAxisGyro(); + + /** + * @brief Gets the measured z-axis gyroscope value. + * Important: Gyroscope measurement first needs to be enable by + * enableGyroscopeMeasurement() + * @return + */ + float getZAxisGyro(); + + /** + * @brief Gets the measured x-axis tesla value. + * Important: Gyroscope measurement first needs to be enable by + * enableGyroscopeMeasurement() + * @return + */ + float getXAxisTesla(); + + /** + * @brief Gets the measured y-axis tesla value. + * Important: Tesla measurement first needs to be enable by + * enableTeslaMeasurement() + * @return + */ + float getYAxisTesla(); + + /** + * @brief Gets the measured z-axis tesla value. + * Important: Tesla measurement first needs to be enable by + * enableTeslaMeasurement() + * @return + */ + float getZAxisTesla(); +private: + I2C_RT* i2c; + MPU9250Config* config; + + /** + * @brief Set the i2c that is used to control the MPU9250 + * @param i2c the i2c that is used to control the MPU9250 + */ + void setI2c(I2C_RT* i2c); + + /** + * @brief enables the acceleration measurement for all axis + * according to the MPU9250Config. + */ + void enableAxisAccelerationMeasurement(); + + /** + * @brief enables the gyroscope measurement for all axis + * according to the MPU9250Config. + */ + void enableAxisGyroscopeMeasurement(); + + /** + * @brief enables the tesla measurement for all axis + * according to the MPU9250Config. + */ + void enableAxisTeslaMeasurement(); + + + /** + * @brief Configures and enables interrupts according to the MPU9250Config + */ + void configureInterrupts(); + + /** + * @brief Sets the motion threshold in g when an interupt is triggered + * according to the MPU9250Config + */ + void setWakeOnReceiveThreshold(); +}; + +#endif /* APP_MPU9250_H_ */