Shimon AJISAKA / Lib_MPU9250_SPI

Dependents:   InvertedPendulum2017

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Lib_MPU9250.h Source File

Lib_MPU9250.h

00001 #ifndef __LIBRARY_MPU9250_SPI_H__
00002 #define __LIBRARY_MPU9250_SPI_H__
00003 
00004 #include "mbed.h"
00005 
00006 #define MPU9250_FREQ_DEFAULT    (4000000)           // default clock speed
00007 #define MPU9250_ADDR            (0x68)
00008 #define AK8963_ADDR             (0x0C)              // magnetometer address
00009 
00010 #define I2C_WRITE_FLAG          (0x00)
00011 #define I2C_READ_FLAG           (0x01)
00012 
00013 #define MPU9250A_2G             ((float)0.000061035156f)  // 0.000061035156 g/LSB
00014 #define MPU9250A_4G             ((float)0.000122070312f)  // 0.000122070312 g/LSB
00015 #define MPU9250A_8G             ((float)0.000244140625f)  // 0.000244140625 g/LSB
00016 #define MPU9250A_16G            ((float)0.000488281250f)  // 0.000488281250 g/LSB
00017  
00018 #define MPU9250G_250DPS         ((float)0.007633587786f)  // 0.007633587786 dps/LSB
00019 #define MPU9250G_500DPS         ((float)0.015267175572f)  // 0.015267175572 dps/LSB
00020 #define MPU9250G_1000DPS        ((float)0.030487804878f)  // 0.030487804878 dps/LSB
00021 #define MPU9250G_2000DPS        ((float)0.060975609756f)  // 0.060975609756 dps/LSB
00022 
00023 /*
00024 #define MPU9250G_250DPS_RAD     ((float)0.00013323124f)   // 0.00013323124 rad/LSB
00025 #define MPU9250G_500DPS_RAD     ((float)0.00026646248f)   // 0.00026646248 rad/LSB
00026 #define MPU9250G_1000DPS_RAD    ((float)0.00053211257f)   // 0.00053211257 rad/LSB
00027 #define MPU9250G_2000DPS_RAD    ((float)0.00106422515f)   // 0.00106422515 rad/LSB
00028 */
00029 
00030 #define MPU9250M_4800uT         ((float)0.6f)             // 0.6 uT/LSB
00031 #define MPU9250T_85degC         ((float)0.002995177763f)  // 0.002995177763 degC/LSB
00032 
00033 #define MPU9250G_DEG2RAD        ((float)0.01745329251f)   // degree to radian
00034 
00035 // enum
00036 typedef enum _MPU9250REG{
00037     // gyro and accel
00038     SELF_TEST_X_GYRO    =   0x00,
00039     SELF_TEST_Y_GYRO    =   0x01,
00040     SELF_TEST_Z_GYRO    =   0x02,
00041     
00042     SELF_TEST_X_ACCEL   =   0x0D,
00043     SELF_TEST_Y_ACCEL   =   0x0E,
00044     SELF_TEST_Z_ACCEL   =   0x0F,
00045     
00046     XG_OFFSET_H         =   0x13,
00047     XG_OFFSET_L         =   0x14,
00048     YG_OFFSET_H         =   0x15,
00049     YG_OFFSET_L         =   0x16,
00050     ZG_OFFSET_H         =   0x17,
00051     ZG_OFFSET_L         =   0x18,
00052     
00053     SMPLRT_DIV          =   0x19,
00054     CONFIG              =   0x1A,   
00055     GYRO_CONFIG         =   0x1B,
00056     ACCEL_CONFIG        =   0x1C,
00057     ACCEL_CONFIG2       =   0x1D,
00058     LP_ACCEL_ODR        =   0x1E,
00059     WOM_THR             =   0x1F,
00060     
00061     FIFO_EN             =   0x23,
00062     
00063     I2C_MST_CTRL        =   0x24,
00064     I2C_SLV0_ADDR       =   0x25,
00065     I2C_SLV0_REG        =   0x26,
00066     I2C_SLV0_CTRL       =   0x27,
00067     I2C_SLV1_ADDR       =   0x28,
00068     I2C_SLV1_REG        =   0x29,
00069     I2C_SLV1_CTRL       =   0x2A,
00070     I2C_SLV2_ADDR       =   0x2B,
00071     I2C_SLV2_REG        =   0x2C,
00072     I2C_SLV2_CTRL       =   0x2D,
00073     I2C_SLV3_ADDR       =   0x2E,
00074     I2C_SLV3_REG        =   0x2F,
00075     I2C_SLV3_CTRL       =   0x30,
00076     I2C_SLV4_ADDR       =   0x31,
00077     I2C_SLV4_REG        =   0x32,
00078     I2C_SLV4_DO         =   0x33,
00079     I2C_SLV4_CTRL       =   0x34,
00080     I2C_SLV4_DI         =   0x35,
00081     I2C_MST_STATUS      =   0x36,
00082     
00083     INT_PIN_CFG         =   0x37,
00084     INT_ENABLE          =   0x38,
00085     INT_STATUS          =   0x3A,
00086     
00087     ACCEL_XOUT_H        =   0x3B,
00088     ACCEL_XOUT_L        =   0x3C,
00089     ACCEL_YOUT_H        =   0x3D,
00090     ACCEL_YOUT_L        =   0x3E,
00091     ACCEL_ZOUT_H        =   0x3F,
00092     ACCEL_ZOUT_L        =   0x40,
00093     
00094     TEMP_OUT_H          =   0x41,
00095     TEMP_OUT_L          =   0x42,
00096     
00097     GYRO_XOUT_H         =   0x43,
00098     GYRO_XOUT_L         =   0x44,
00099     GYRO_YOUT_H         =   0x45,
00100     GYRO_YOUT_L         =   0x46,
00101     GYRO_ZOUT_H         =   0x47,
00102     GYRO_ZOUT_L         =   0x48,
00103 
00104     EXT_SENS_DATA_00    =   0x49,
00105     EXT_SENS_DATA_01    =   0x4A,
00106     EXT_SENS_DATA_02    =   0x4B,
00107     EXT_SENS_DATA_03    =   0x4C,
00108     EXT_SENS_DATA_04    =   0x4D,
00109     EXT_SENS_DATA_05    =   0x4E,
00110     EXT_SENS_DATA_06    =   0x4F,
00111     EXT_SENS_DATA_07    =   0x50,
00112     EXT_SENS_DATA_08    =   0x51,
00113     EXT_SENS_DATA_09    =   0x52,
00114     EXT_SENS_DATA_10    =   0x53,
00115     EXT_SENS_DATA_11    =   0x54,
00116     EXT_SENS_DATA_12    =   0x55,
00117     EXT_SENS_DATA_13    =   0x56,
00118     EXT_SENS_DATA_14    =   0x57,
00119     EXT_SENS_DATA_15    =   0x58,
00120     EXT_SENS_DATA_16    =   0x59,
00121     EXT_SENS_DATA_17    =   0x5A,
00122     EXT_SENS_DATA_18    =   0x5B,
00123     EXT_SENS_DATA_19    =   0x5C,
00124     EXT_SENS_DATA_20    =   0x5D,
00125     EXT_SENS_DATA_21    =   0x5E,
00126     EXT_SENS_DATA_22    =   0x5F,
00127     EXT_SENS_DATA_23    =   0x60,
00128 
00129     I2C_SLV0_DO         =   0x63,
00130     I2C_SLV1_DO         =   0x64,
00131     I2C_SLV2_DO         =   0x65,
00132     I2C_SLV3_DO         =   0x66,
00133 
00134     I2C_MST_DELAY_CTRL  =   0x67,
00135     SIGNAL_PATH_RESET   =   0x68,
00136     MOT_DETECT_CTRL     =   0x69,
00137     USER_CTRL           =   0x6A,
00138     PWR_MGMT_1          =   0x6B,
00139     PWR_MGMT_2          =   0x6C,
00140     
00141     FIFO_COUNTH         =   0x72,
00142     FIFO_COUNTL         =   0x73,
00143     FIFO_R_W            =   0x74,
00144     WHO_AM_I            =   0x75,
00145     
00146     XA_OFFSET_H         =   0x77,
00147     XA_OFFSET_L         =   0x78,
00148     YA_OFFSET_H         =   0x7A,
00149     YA_OFFSET_L         =   0x7B,
00150     ZA_OFFSET_H         =   0x7D,
00151     ZA_OFFSET_L         =   0x7E,
00152 } MPU9250REG;
00153 
00154 typedef enum _AK8963REG{    
00155     // magnetometer
00156     WIA                 =   0x00,
00157     INFO                =   0x01,
00158     ST1                 =   0x02,
00159     
00160     HXL                 =   0x03,
00161     HXH                 =   0x04,
00162     HYL                 =   0x05,
00163     HYH                 =   0x06,
00164     HZL                 =   0x07,
00165     HZH                 =   0x08,
00166 
00167     ST2                 =   0x09,
00168     CNTL1               =   0x0A,
00169     CNTL2               =   0x0B,
00170     ASTC                =   0x0C,
00171     TS1                 =   0x0D,
00172     TS2                 =   0x0E,
00173     I2CDIS              =   0x0F,
00174 
00175     ASAX                =   0x10,
00176     ASAY                =   0x11,
00177     ASAZ                =   0x12,
00178 } AK8963REG;
00179 
00180 typedef enum _MPU9250BIT{
00181     BIT_SLEEP                   =   0x40,
00182     BIT_H_RESET                 =   0x80,
00183     BITS_CLKSEL                 =   0x07,
00184     MPU_CLK_SEL_PLLGYROX        =   0x01,
00185     MPU_CLK_SEL_PLLGYROZ        =   0x03,
00186     MPU_EXT_SYNC_GYROX          =   0x02,
00187     BITS_FS_250DPS              =   0x00,
00188     BITS_FS_500DPS              =   0x08,
00189     BITS_FS_1000DPS             =   0x10,
00190     BITS_FS_2000DPS             =   0x18,
00191     BITS_FS_2G                  =   0x00,
00192     BITS_FS_4G                  =   0x08,
00193     BITS_FS_8G                  =   0x10,
00194     BITS_FS_16G                 =   0x18,
00195     BITS_FS_MASK                =   0x18,
00196     BITS_DLPF_CFG_256HZ_NOLPF2  =   0x00,
00197     BITS_DLPF_CFG_188HZ         =   0x01,
00198     BITS_DLPF_CFG_98HZ          =   0x02,
00199     BITS_DLPF_CFG_42HZ          =   0x03,
00200     BITS_DLPF_CFG_20HZ          =   0x04,
00201     BITS_DLPF_CFG_10HZ          =   0x05,
00202     BITS_DLPF_CFG_5HZ           =   0x06,
00203     BITS_DLPF_CFG_2100HZ_NOLPF  =   0x07,
00204     BITS_DLPF_CFG_MASK          =   0x07,
00205     BIT_INT_ANYRD_2CLEAR        =   0x10,
00206     BIT_RAW_RDY_EN              =   0x01,
00207     BIT_I2C_IF_DIS              =   0x10
00208 } MPU9250BIT;
00209 
00210 typedef enum _MPU9250IF{
00211     MPU9250_SPI                 =   0x00,
00212     MPU9250_I2C                 =   0x10
00213 } MPU9250IF;
00214 
00215 class MPU9250{
00216     public:
00217         MPU9250( PinName cs, PinName mosi, PinName miso, PinName sck );     // constructor( SPI )
00218         MPU9250( PinName sda, PinName scl, uint8_t addr = MPU9250_ADDR );   // constructor( I2C )        
00219         ~MPU9250();                                                         // destructor
00220         
00221         void    begin( void );
00222         void    reset( void );
00223         
00224         uint8_t getWhoAmI( void );
00225         
00226         void    setAccelRange( MPU9250BIT range );
00227         void    setGyroRange( MPU9250BIT range );
00228         void    setDLPF( MPU9250BIT range );
00229 
00230         void    read6AxisRaw( 
00231             int16_t* ax, int16_t* ay, int16_t* az, 
00232             int16_t* gx, int16_t* gy, int16_t* gz );
00233         void    read9AxisRaw( 
00234             int16_t* ax, int16_t* ay, int16_t* az, 
00235             int16_t* gx, int16_t* gy, int16_t* gz, 
00236             int16_t* mx, int16_t* my, int16_t* mz );
00237         void    readAccelRaw( int16_t* ax, int16_t* ay, int16_t* az );
00238         void    readGyroRaw(  int16_t* gx, int16_t* gy, int16_t* gz );
00239         void    readMagRaw(   int16_t* mx, int16_t* my, int16_t* mz );
00240         int16_t readTempRaw( void );
00241 
00242         void    read6Axis( 
00243             float* ax, float* ay, float* az, 
00244             float* gx, float* gy, float* gz );
00245         void    read9Axis( 
00246             float* ax, float* ay, float* az, 
00247             float* gx, float* gy, float* gz, 
00248             float* mx, float* my, float* mz );
00249         void    readAccel( float* ax, float* ay, float* az );
00250         void    readGyro(  float* gx, float* gy, float* gz );
00251         void    readMag(   float* mx, float* my, float* mz );
00252         float   readTemp( void );
00253 
00254     private:
00255         DigitalOut* _cs;
00256         SPI*        _spi;
00257         I2C*        _i2c;
00258         uint8_t     _i2c_addr;
00259         MPU9250IF   _imu_if;
00260         
00261         float       _accscale;
00262         float       _gyroscale;
00263 //      float       _gyroscalerad;
00264         
00265         uint8_t _readRegister(   MPU9250REG addr );
00266         uint8_t _writeRegister(  MPU9250REG addr, uint8_t data );
00267         uint8_t _readBuffer(     MPU9250REG addr, uint8_t len, uint8_t* buf );
00268         uint8_t _writeBuffer(    MPU9250REG addr, uint8_t len, uint8_t* buf );
00269 };
00270 
00271 #endif