A library for the Invensense MPU9150

Dependencies:   I2CHelper

Dependents:   Atlas_Test

MPU9150.h

Committer:
ethanharstad
Date:
2014-06-09
Revision:
2:581fad93a809
Parent:
1:1b0ada1695a7

File content as of revision 2:581fad93a809:

#ifndef MPU9150_H_
#define MPU9150_H_

#include "mbed.h"
#include "I2CHelper.h"

#define MPU9150_ADDRESS_AD0_LOW         0x68
#define MPU9150_ADDRESS_AD0_HIGH        0x69
#define MPU9150_ADDRESS_DEFAULT         MPU9150_ADDRESS_AD0_LOW

#define MPU9150_RA_SELF_TEST_X          0x0D
#define MPU9150_RA_SELF_TEST_Y          0x0E
#define MPU9150_RA_SELF_TEST_Z          0x0F
#define MPU9150_RA_SELF_TEST_A          0x10
#define MPU9150_RA_SMPRT_DIV            0x19
#define MPU9150_RA_CONFIG               0x1A
#define MPU9150_RA_GYRO_CONFIG          0x1B
#define MPU9150_RA_ACCEL_CONFIG         0x1C
#define MPU9150_RA_FIFO_EN              0x23
#define MPU9150_RA_I2C_MST_CTRL         0x24
#define MPU9150_RA_I2C_SLV0_ADDR        0x25
#define MPU9150_RA_I2C_SLV0_REG         0x26
#define MPU9150_RA_I2C_SLV0_CTRL        0x27
#define MPU9150_RA_I2C_SLV1_ADDR        0x28
#define MPU9150_RA_I2C_SLV1_REG         0x29
#define MPU9150_RA_I2C_SLV1_CTRL        0x2A
#define MPU9150_RA_I2C_SLV2_ADDR        0x2B
#define MPU9150_RA_I2C_SLV2_REG         0x2C
#define MPU9150_RA_I2C_SLV2_CTRL        0x2D
#define MPU9150_RA_I2C_SLV3_ADDR        0x2E
#define MPU9150_RA_I2C_SLV3_REG         0x2F
#define MPU9150_RA_I2C_SLV3_CTRL        0x30
#define MPU9150_RA_I2C_SLV4_ADDR        0x31
#define MPU9150_RA_I2C_SLV4_REG         0x32
#define MPU9150_RA_I2C_SLV4_DO          0x33
#define MPU9150_RA_I2C_SLV4_CTRL        0x34
#define MPU9150_RA_I2C_SLV4_DI          0x35
#define MPU9150_RA_I2C_MST_STATUS       0x36
#define MPU9150_RA_INT_PIN_CFG          0x37
#define MPU9150_RA_INT_ENABLE           0x38
#define MPU9150_RA_INT_STATUS           0x3A
#define MPU9150_RA_ACCEL_XOUT_H         0x3B
#define MPU9150_RA_ACCEL_XOUT_L         0x3C
#define MPU9150_RA_ACCEL_YOUT_H         0x3D
#define MPU9150_RA_ACCEL_YOUT_L         0x3E
#define MPU9150_RA_ACCEL_ZOUT_H         0x3F
#define MPU9150_RA_ACCEL_ZOUT_L         0x40
#define MPU9150_RA_TEMP_OUT_H           0x41
#define MPU9150_RA_TEMP_OUT_L           0x42
#define MPU9150_RA_GYRO_XOUT_H          0x43
#define MPU9150_RA_GYRO_XOUT_L          0x44
#define MPU9150_RA_GYRO_YOUT_H          0x45
#define MPU9150_RA_GYRO_YOUT_L          0x46
#define MPU9150_RA_GYRO_ZOUT_H          0x47
#define MPU9150_RA_GYRO_ZOUT_L          0x48
#define MPU9150_RA_EXT_SENS_DATA_00     0x49
#define MPU9150_RA_EXT_SENS_DATA_01     0x4A
#define MPU9150_RA_EXT_SENS_DATA_02     0x4B
#define MPU9150_RA_EXT_SENS_DATA_03     0x4C
#define MPU9150_RA_EXT_SENS_DATA_04     0x4D
#define MPU9150_RA_EXT_SENS_DATA_05     0x4E
#define MPU9150_RA_EXT_SENS_DATA_06     0x4F
#define MPU9150_RA_EXT_SENS_DATA_07     0x50
#define MPU9150_RA_EXT_SENS_DATA_08     0x51
#define MPU9150_RA_EXT_SENS_DATA_09     0x52
#define MPU9150_RA_EXT_SENS_DATA_10     0x53
#define MPU9150_RA_EXT_SENS_DATA_11     0x54
#define MPU9150_RA_EXT_SENS_DATA_12     0x55
#define MPU9150_RA_EXT_SENS_DATA_13     0x56
#define MPU9150_RA_EXT_SENS_DATA_14     0x57
#define MPU9150_RA_EXT_SENS_DATA_15     0x58
#define MPU9150_RA_EXT_SENS_DATA_16     0x59
#define MPU9150_RA_EXT_SENS_DATA_17     0x5A
#define MPU9150_RA_EXT_SENS_DATA_18     0x5B
#define MPU9150_RA_EXT_SENS_DATA_19     0x5C
#define MPU9150_RA_EXT_SENS_DATA_20     0x5D
#define MPU9150_RA_EXT_SENS_DATA_21     0x5E
#define MPU9150_RA_EXT_SENS_DATA_22     0x5F
#define MPU9150_RA_EXT_SENS_DATA_23     0x60
#define MPU9150_RA_I2C_SLV0_DO          0x63
#define MPU9150_RA_I2C_SLV1_DO          0x64
#define MPU9150_RA_I2C_SLV2_DO          0x65
#define MPU9150_RA_I2C_SLV3_DO          0x66
#define MPU9150_RA_I2C_MST_DELAY_CTRL   0x67
#define MPU9150_RA_SIGNAL_PATH_RESET    0x68
#define MPU9150_RA_USER_CTRL            0x6A
#define MPU9150_RA_PWR_MGMT_1           0x6B
#define MPU9150_RA_PWR_MGMT_2           0x6C
#define MPU9150_RA_FIFO_COUNTH          0x72
#define MPU9150_RA_FIFO_COUNTL          0x73
#define MPU9150_RA_FIFO_R_W             0x74
#define MPU9150_RA_WHO_AM_I             0x75

// CONFIG Register
#define MPU9150_EXT_SYNC_DISABLED       0x00
#define MPU9150_EXT_SYNC_TEMP_OUT_L     0x01
#define MPU9150_EXT_SYNC_GYRO_XOUT_L    0x02
#define MPU9150_EXT_SYNC_GYRO_YOUT_L    0x03
#define MPU9150_EXT_SYNC_GYRO_ZOUT_L    0x04
#define MPU9150_EXT_SYNC_ACCEL_XOUT_L   0x05
#define MPU9150_EXT_SYNC_ACCEL_YOUT_L   0x06
#define MPU9150_EXT_SYNC_ACCEL_ZOUT_L   0x07
#define MPU9150_DLPF_BW_256             0x00
#define MPU9150_DLPF_BW_188             0x01
#define MPU9150_DLPF_BW_98              0x02
#define MPU9150_DLPF_BW_42              0x03
#define MPU9150_DLPF_BW_20              0x04
#define MPU9150_DLPF_BW_10              0x05
#define MPU9150_DLPF_BW_5               0x06

// GYRO_CONFIG Register
#define MPU9150_GYRO_FS_250             0x00
#define MPU9150_GYRO_FS_500             0x01
#define MPU9150_GYRO_FS_1000            0x02
#define MPU9150_GYRO_FS_2000            0x03

// ACCEL_CONFIG Register
#define MPU9150_ACCEL_FS_2              0x00
#define MPU9150_ACCEL_FS_4              0x01
#define MPU9150_ACCEL_FS_8              0x02
#define MPU9150_ACCEL_FS_16             0x03

// SIGNAL_PATH_RESET Register
#define MPU9150_SIGNAL_PATH_GYRO_RESET  0x04
#define MPU9150_SIGNAL_PATH_ACCEL_RESET 0x02
#define MPU9150_SIGNAL_PATH_TEMP_RESET  0x01

// USER_CTRL Register
#define MPU9150_USER_CTRL_FIFO_EN       0x40
#define MPU9150_USER_CTRL_I2C_MST_EN    0x20
#define MPU9150_USER_CTRL_FIFO_RESET    0x04
#define MPU9150_USER_CTRL_I2C_MST_RESET 0x02
#define MPU9150_USER_CTRL_SIG_RESET     0x01

// PWR_MGMT_1 Register
#define MPU9150_PWR_MGMT_DEVICE_RESET   0x80
#define MPU9150_PWR_MGMT_SLEEP          0x40
#define MPU9150_PWR_MGMT_CYCLE          0x20
#define MPU9150_PWR_MGMT_TEMP_DISABLE   0x08
#define MPU9150_PWR_MGMT_CLOCK_INTERNAL 0x00
#define MPU9150_PWR_MGMT_CLOCK_GYRO_X   0x01
#define MPU9150_PWR_MGMT_CLOCK_GYRO_Y   0x02
#define MPU9150_PWR_MGMT_CLOCK_GYRO_Z   0x03
#define MPU9150_PWR_MGMT_CLOCK_EXT_32k  0x04
#define MPU9150_PWR_MGMT_CLOCK_EXT_19M  0x05
#define MPU9150_PWR_MGMT_CLOCK_DISABLE  0x07

// PWR_MGMT_2 Register
#define MPU9150_PWR_MGMT_STBY_GYRO_Z    0x01
#define MPU9150_PWR_MGMT_STBY_GYRO_Y    0x02
#define MPU9150_PWR_MGMT_STBY_GYRO_X    0x04
#define MPU9150_PWR_MGMT_STBY_ACCEL_Z   0x08
#define MPU9150_PWR_MGMT_STBY_ACCEL_Y   0x10
#define MPU9150_PWR_MGMT_STBY_ACCEL_X   0x20
#define MPU9150_PWR_MGMT_CYCLE_1_25HZ   0x00
#define MPU9150_PWR_MGMT_CYCLE_5HZ      0x01
#define MPU9150_PWR_MGMT_CYCLE_20HZ     0x02
#define MPU9150_PWR_MGMT_CYCLE_40HZ     0x03

class MPU9150 {
public:
    MPU9150();
    explicit MPU9150(const bool AD0);
    MPU9150(const PinName sda, const PinName scl, const bool AD0);
    
    void initialize();
    bool test();
    
    // SMPRT_DIV Register
    uint8_t getSampleRateDivider();
    void setSampleRateDivider(const uint8_t divider);
    
    // CONFIG Register
    uint8_t getExternalFrameSync();
    void setExternalFrameSync(const uint8_t sync);
    uint8_t getDLPFBandwidth();
    void setDLPFBandwidth(const uint8_t bandwidth);
    
    // GYRO_CONFIG Register
    uint8_t getGyroFullScaleRange();
    void setGyroFullScaleRange(const uint8_t range);
    
    // ACCEL_CONFIG Register
    uint8_t getAccelFullScaleRange();
    void setAccelFullScaleRange(const uint8_t range);
    
    // ACCEL_OUT_* Registers
    int16_t getAccelX();
    int16_t getAccelY();
    int16_t getAccelZ();
    
    // TEMP_OUT_* Registers
    int16_t getTemp();
    
    // GYRO_OUT_* Registers
    int16_t getGyroX();
    int16_t getGyroY();
    int16_t getGyroZ();
    
    // SIGNAL_PATH_RESET Register
    void resetGyroPath();
    void resetAccelPath();
    void resetTempPath();
    
    // USER_CTRL Register
    bool getFifoEnabled();
    void setFifoEnabled(const bool fifo);
    bool getI2CMasterEnabled();
    void setI2CMasterEnabled(const bool master);
    void resetFifo();
    void resetI2CMaster();
    void resetSensors();
    
    // PWR_MGMT_1 Register
    void reset();
    bool getSleepEnabled();
    void setSleepEnabled(const bool sleep);
    bool getCycleEnabled();
    void setCycleEnabled(const bool cycle);
    bool getTempEnabled();
    void setTempEnabled(const bool temp);
    uint8_t getClockSource();
    void setClockSource(const uint8_t source);
    
    // PWR_MGMT_2 Register
    uint8_t getCycleFrequency();
    void setCycleFrequency(const uint8_t frequency);
    bool getStandbyAccelXEnabled();
    void setStandbyAccelXEnabled(const bool enabled);
    bool getStandbyAccelYEnabled();
    void setStandbyAccelYEnabled(const bool enabled);
    bool getStandbyAccelZEnabled();
    void setStandbyAccelZEnabled(const bool enabled);
    bool getStandbyGyroXEnabled();
    void setStandbyGyroXEnabled(const bool enabled);
    bool getStandbyGyroYEnabled();
    void setStandbyGyroYEnabled(const bool enabled);
    bool getStandbyGyroZEnabled();
    void setStandbyGyroZEnabled(const bool enabled);
    
    // WHO_AM_I Register
    uint8_t getDeviceID();

private:
    I2CHelper i2c_;
    uint8_t address_;
    uint8_t accelRange_;
    uint8_t gyroRange_;
};

#endif