Felix Rüdiger / MPU6050_lib

Dependents:   BLE_Nano_MPU6050Service

Committer:
fruediger
Date:
Wed Jul 22 12:20:10 2015 +0000
Revision:
3:a6e53ab2c8c0
Parent:
2:32b13cc64cb0
Child:
5:5739a7a6d0e9
port completed for the moment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fruediger 0:95916b07e8be 1 #pragma once
fruediger 0:95916b07e8be 2 #ifndef __MPU6050_H__
fruediger 0:95916b07e8be 3 #define __MPU6050_H__
fruediger 0:95916b07e8be 4
fruediger 0:95916b07e8be 5 /**
fruediger 0:95916b07e8be 6 * Based on the work of authors of
fruediger 0:95916b07e8be 7 * https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
fruediger 0:95916b07e8be 8 *
fruediger 0:95916b07e8be 9 * Ported by Felix Rüdiger, 2015
fruediger 0:95916b07e8be 10 * (scrapping all the I2C-slave-bus stuff)
fruediger 0:95916b07e8be 11 *
fruediger 0:95916b07e8be 12 */
fruediger 0:95916b07e8be 13
fruediger 0:95916b07e8be 14 #include "mbed.h"
fruediger 0:95916b07e8be 15 #include "helpers.h"
fruediger 2:32b13cc64cb0 16
fruediger 2:32b13cc64cb0 17 typedef struct
fruediger 2:32b13cc64cb0 18 {
fruediger 2:32b13cc64cb0 19 int16_t ax, ay, az;
fruediger 2:32b13cc64cb0 20 int16_t temp;
fruediger 2:32b13cc64cb0 21 int16_t ox, oy, oz;
fruediger 2:32b13cc64cb0 22 } MPU6050SensorReading;
fruediger 2:32b13cc64cb0 23
fruediger 0:95916b07e8be 24 class MPU6050
fruediger 0:95916b07e8be 25 {
fruediger 0:95916b07e8be 26 public:
fruediger 1:96a227d1ca7e 27 /**
fruediger 1:96a227d1ca7e 28 * Constants
fruediger 2:32b13cc64cb0 29 */
fruediger 1:96a227d1ca7e 30
fruediger 0:95916b07e8be 31 enum BaseAddress
fruediger 0:95916b07e8be 32 {
fruediger 0:95916b07e8be 33 // left shift by 1 bit is neccessary for mbed's I2C abstraction class
fruediger 0:95916b07e8be 34 // look at https://developer.mbed.org/users/okano/notebook/i2c-access-examples/
fruediger 0:95916b07e8be 35 ADDRESS_0 = BYTE(01101000) << 1,
fruediger 0:95916b07e8be 36 ADRESSS_1 = BYTE(01101001) << 1
fruediger 0:95916b07e8be 37 };
fruediger 0:95916b07e8be 38
fruediger 0:95916b07e8be 39 enum Register
fruediger 0:95916b07e8be 40 {
fruediger 0:95916b07e8be 41 REG_AUX_VDDIO = 0x01, // R/W
fruediger 0:95916b07e8be 42 REG_SMPLRT_DIV = 0x19, // R/W
fruediger 0:95916b07e8be 43 REG_CONFIG = 0x1A, // R/W
fruediger 0:95916b07e8be 44 REG_GYRO_CONFIG = 0x1B, // R/W
fruediger 0:95916b07e8be 45 REG_ACCEL_CONFIG = 0x1C, // R/W
fruediger 0:95916b07e8be 46 REG_FF_THR = 0x1D, // R/W
fruediger 0:95916b07e8be 47 REG_FF_DUR = 0x1E, // R/W
fruediger 0:95916b07e8be 48 REG_MOT_THR = 0x1F, // R/W
fruediger 0:95916b07e8be 49 REG_MOT_DUR = 0x20, // R/W
fruediger 0:95916b07e8be 50 REG_ZRMOT_THR = 0x21, // R/W
fruediger 0:95916b07e8be 51 REG_ZRMOT_DUR = 0x22, // R/W
fruediger 0:95916b07e8be 52 REG_FIFO_EN = 0x23, // R/W
fruediger 0:95916b07e8be 53 /* REG_I2C_MST_CTRL = 0x24, // R/W
fruediger 0:95916b07e8be 54 REG_I2C_SLV0_ADDR = 0x25, // R/W
fruediger 0:95916b07e8be 55 REG_I2C_SLV0_REG = 0x26, // R/W
fruediger 0:95916b07e8be 56 REG_I2C_SLV0_CTRL = 0x27, // R/W
fruediger 0:95916b07e8be 57 REG_I2C_SLV1_ADDR = 0x28, // R/W
fruediger 0:95916b07e8be 58 REG_I2C_SLV1_REG = 0x29, // R/W
fruediger 0:95916b07e8be 59 REG_I2C_SLV1_CTRL = 0x2A, // R/W
fruediger 0:95916b07e8be 60 REG_I2C_SLV2_ADDR = 0x2B, // R/W
fruediger 0:95916b07e8be 61 REG_I2C_SLV2_REG = 0x2C, // R/W
fruediger 0:95916b07e8be 62 REG_I2C_SLV2_CTRL = 0x2D, // R/W
fruediger 0:95916b07e8be 63 REG_I2C_SLV3_ADDR = 0x2E, // R/W
fruediger 0:95916b07e8be 64 REG_I2C_SLV3_REG = 0x2F, // R/W
fruediger 0:95916b07e8be 65 REG_I2C_SLV3_CTRL = 0x30, // R/W
fruediger 0:95916b07e8be 66 REG_I2C_SLV4_ADDR = 0x31, // R/W
fruediger 0:95916b07e8be 67 REG_I2C_SLV4_REG = 0x32, // R/W
fruediger 0:95916b07e8be 68 REG_I2C_SLV4_DO = 0x33, // R/W
fruediger 0:95916b07e8be 69 REG_I2C_SLV4_CTRL = 0x34, // R/W
fruediger 0:95916b07e8be 70 REG_I2C_SLV4_DI = 0x35, // R
fruediger 1:96a227d1ca7e 71 REG_I2C_MST_STATUS = 0x36, // R */
fruediger 0:95916b07e8be 72 REG_INT_PIN_CFG = 0x37, // R/W
fruediger 0:95916b07e8be 73 REG_INT_ENABLE = 0x38, // R/W
fruediger 0:95916b07e8be 74 REG_INT_STATUS = 0x3A, // R
fruediger 0:95916b07e8be 75 REG_ACCEL_XOUT_H = 0x3B, // R
fruediger 0:95916b07e8be 76 REG_ACCEL_XOUT_L = 0x3C, // R
fruediger 0:95916b07e8be 77 REG_ACCEL_YOUT_H = 0x3D, // R
fruediger 0:95916b07e8be 78 REG_ACCEL_YOUT_L = 0x3E, // R
fruediger 0:95916b07e8be 79 REG_ACCEL_ZOUT_H = 0x3F, // R
fruediger 0:95916b07e8be 80 REG_ACCEL_ZOUT_L = 0x40, // R
fruediger 0:95916b07e8be 81 REG_TEMP_OUT_H = 0x41, // R
fruediger 0:95916b07e8be 82 REG_TEMP_OUT_L = 0x42, // R
fruediger 0:95916b07e8be 83 REG_GYRO_XOUT_H = 0x43, // R
fruediger 0:95916b07e8be 84 REG_GYRO_XOUT_L = 0x44, // R
fruediger 0:95916b07e8be 85 REG_GYRO_YOUT_H = 0x45, // R
fruediger 0:95916b07e8be 86 REG_GYRO_YOUT_L = 0x46, // R
fruediger 0:95916b07e8be 87 REG_GYRO_ZOUT_H = 0x47, // R
fruediger 0:95916b07e8be 88 REG_GYRO_ZOUT_L = 0x48, // R
fruediger 1:96a227d1ca7e 89 /* REG_EXT_SENS_DATA_00 = 0x49, // R
fruediger 0:95916b07e8be 90 REG_EXT_SENS_DATA_01 = 0x4A, // R
fruediger 0:95916b07e8be 91 REG_EXT_SENS_DATA_02 = 0x4B, // R
fruediger 0:95916b07e8be 92 REG_EXT_SENS_DATA_03 = 0x4C, // R
fruediger 0:95916b07e8be 93 REG_EXT_SENS_DATA_04 = 0x4D, // R
fruediger 0:95916b07e8be 94 REG_EXT_SENS_DATA_05 = 0x4E, // R
fruediger 0:95916b07e8be 95 REG_EXT_SENS_DATA_06 = 0x4F, // R
fruediger 0:95916b07e8be 96 REG_EXT_SENS_DATA_07 = 0x50, // R
fruediger 0:95916b07e8be 97 REG_EXT_SENS_DATA_08 = 0x51, // R
fruediger 0:95916b07e8be 98 REG_EXT_SENS_DATA_09 = 0x52, // R
fruediger 0:95916b07e8be 99 REG_EXT_SENS_DATA_10 = 0x53, // R
fruediger 0:95916b07e8be 100 REG_EXT_SENS_DATA_11 = 0x54, // R
fruediger 0:95916b07e8be 101 REG_EXT_SENS_DATA_12 = 0x55, // R
fruediger 0:95916b07e8be 102 REG_EXT_SENS_DATA_13 = 0x56, // R
fruediger 0:95916b07e8be 103 REG_EXT_SENS_DATA_14 = 0x57, // R
fruediger 0:95916b07e8be 104 REG_EXT_SENS_DATA_15 = 0x58, // R
fruediger 0:95916b07e8be 105 REG_EXT_SENS_DATA_16 = 0x59, // R
fruediger 0:95916b07e8be 106 REG_EXT_SENS_DATA_17 = 0x5A, // R
fruediger 0:95916b07e8be 107 REG_EXT_SENS_DATA_18 = 0x5B, // R
fruediger 0:95916b07e8be 108 REG_EXT_SENS_DATA_19 = 0x5C, // R
fruediger 0:95916b07e8be 109 REG_EXT_SENS_DATA_20 = 0x5D, // R
fruediger 0:95916b07e8be 110 REG_EXT_SENS_DATA_21 = 0x5E, // R
fruediger 0:95916b07e8be 111 REG_EXT_SENS_DATA_22 = 0x5F, // R
fruediger 1:96a227d1ca7e 112 REG_EXT_SENS_DATA_23 = 0x60, // R */
fruediger 0:95916b07e8be 113 REG_MOT_DETECT_STATUS = 0x61, // R
fruediger 2:32b13cc64cb0 114 /* REG_I2C_SLV0_DO = 0x63, // R/W
fruediger 0:95916b07e8be 115 REG_I2C_SLV1_DO = 0x64, // R/W
fruediger 0:95916b07e8be 116 REG_I2C_SLV2_DO = 0x65, // R/W
fruediger 2:32b13cc64cb0 117 REG_I2C_SLV3_DO = 0x66, // R/W
fruediger 2:32b13cc64cb0 118 REG_I2C_MST_DELAY_CTRL = 0x67, // R/W */
fruediger 0:95916b07e8be 119 REG_SIGNAL_PATH_RESET = 0x68, // R/W
fruediger 0:95916b07e8be 120 REG_MOT_DETECT_CTRL = 0x69, // R/W
fruediger 0:95916b07e8be 121 REG_USER_CTRL = 0x6A, // R/W
fruediger 0:95916b07e8be 122 REG_PWR_MGMT_1 = 0x6B, // R/W
fruediger 0:95916b07e8be 123 REG_PWR_MGMT_2 = 0x6C, // R/W
fruediger 0:95916b07e8be 124 REG_FIFO_COUNTH = 0x72, // R/W
fruediger 0:95916b07e8be 125 REG_FIFO_COUNTL = 0x73, // R/W
fruediger 0:95916b07e8be 126 REG_FIFO_R_W = 0x74, // R/W
fruediger 0:95916b07e8be 127 REG_WHO_AM_I = 0x75 // R
fruediger 0:95916b07e8be 128 };
fruediger 0:95916b07e8be 129
fruediger 0:95916b07e8be 130 static const uint8_t AUX_VDDIO_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 131 enum AuxVDDIOLevel
fruediger 0:95916b07e8be 132 {
fruediger 0:95916b07e8be 133 AUX_VDDIO_VLOGIC = BYTE(00000000),
fruediger 0:95916b07e8be 134 AUX_VDDIO_VDD = BYTE(10000000)
fruediger 0:95916b07e8be 135 };
fruediger 0:95916b07e8be 136
fruediger 0:95916b07e8be 137 static const uint8_t EXT_SYNC_MASK = BYTE(00111000);
fruediger 0:95916b07e8be 138 enum ExtFrameSync
fruediger 0:95916b07e8be 139 {
fruediger 0:95916b07e8be 140 EXT_SYNC_DISABLED = BYTE(00000000),
fruediger 0:95916b07e8be 141 EXT_SYNC_TEMP_OUT_L = BYTE(00001000),
fruediger 0:95916b07e8be 142 EXT_SYNC_GYRO_XOUT_L = BYTE(00010000),
fruediger 0:95916b07e8be 143 EXT_SYNC_GYRO_YOUT_L = BYTE(00011000),
fruediger 0:95916b07e8be 144 EXT_SYNC_GYRO_ZOUT_L = BYTE(00100000),
fruediger 0:95916b07e8be 145 EXT_SYNC_ACCEL_XOUT_L = BYTE(00101000),
fruediger 0:95916b07e8be 146 EXT_SYNC_ACCEL_YOUT_L = BYTE(00110000),
fruediger 0:95916b07e8be 147 EXT_SYNC_ACCEL_ZOUT_L = BYTE(00111000)
fruediger 0:95916b07e8be 148 };
fruediger 0:95916b07e8be 149
fruediger 0:95916b07e8be 150 static const uint8_t DLPF_MASK = BYTE(00000111);
fruediger 0:95916b07e8be 151 enum DLPFBandwidth
fruediger 0:95916b07e8be 152 {
fruediger 0:95916b07e8be 153 DLPF_260HZ_256Hz = BYTE(00000000),
fruediger 0:95916b07e8be 154 DLPF_184HZ_188Hz = BYTE(00000001),
fruediger 0:95916b07e8be 155 DLPF_94HZ_98HZ = BYTE(00000010),
fruediger 0:95916b07e8be 156 DLPF_44HZ_42HZ = BYTE(00000011),
fruediger 0:95916b07e8be 157 DLPF_21HZ_20HZ = BYTE(00000100),
fruediger 0:95916b07e8be 158 DLPF_10HZ_10HZ = BYTE(00000101),
fruediger 0:95916b07e8be 159 DLPF_5HZ_5HZ = BYTE(00000110),
fruediger 0:95916b07e8be 160 DLPF_RESERVED = BYTE(00000111)
fruediger 0:95916b07e8be 161 };
fruediger 0:95916b07e8be 162
fruediger 0:95916b07e8be 163 static const uint8_t GYRO_X_ST_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 164 static const uint8_t GYRO_Y_ST_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 165 static const uint8_t GYRO_Z_ST_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 166
fruediger 0:95916b07e8be 167 static const uint8_t GYRO_RANGE_MASK = BYTE(00011000);
fruediger 0:95916b07e8be 168 enum GyroRange
fruediger 0:95916b07e8be 169 {
fruediger 0:95916b07e8be 170 GYRO_RANGE_250 = BYTE(00000000),
fruediger 0:95916b07e8be 171 GYRO_RANGE_500 = BYTE(00001000),
fruediger 0:95916b07e8be 172 GYRO_RANGE_1000 = BYTE(00010000),
fruediger 0:95916b07e8be 173 GYRO_RANGE_2000 = BYTE(00011000)
fruediger 0:95916b07e8be 174 };
fruediger 0:95916b07e8be 175
fruediger 0:95916b07e8be 176 static const uint8_t ACCEL_X_ST_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 177 static const uint8_t ACCEL_Y_ST_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 178 static const uint8_t ACCEL_Z_ST_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 179
fruediger 0:95916b07e8be 180 static const uint8_t ACCEL_HPF_MASK = BYTE(00000111);
fruediger 0:95916b07e8be 181 enum AccelHPFCutOff
fruediger 0:95916b07e8be 182 {
fruediger 0:95916b07e8be 183 ACCEL_HPF_RESET = BYTE(00000000),
fruediger 0:95916b07e8be 184 ACCEL_HPF_5HZ = BYTE(00000001),
fruediger 0:95916b07e8be 185 ACCEL_HPF_2_5HZ = BYTE(00000010),
fruediger 0:95916b07e8be 186 ACCEL_HPF_1_25HZ = BYTE(00000011),
fruediger 0:95916b07e8be 187 ACCEL_HPF_0_63HZ = BYTE(00000100),
fruediger 0:95916b07e8be 188 ACCEL_HPF_HOLD = BYTE(00000111)
fruediger 0:95916b07e8be 189 };
fruediger 0:95916b07e8be 190
fruediger 0:95916b07e8be 191 static const uint8_t ACCEL_RANGE_MASK = BYTE(00011000);
fruediger 0:95916b07e8be 192 enum AccelRange
fruediger 0:95916b07e8be 193 {
fruediger 0:95916b07e8be 194 ACCEL_RANGE_2G = BYTE(00000000),
fruediger 0:95916b07e8be 195 ACCEL_RANGE_4G = BYTE(00001000),
fruediger 0:95916b07e8be 196 ACCEL_RANGE_8G = BYTE(00010000),
fruediger 0:95916b07e8be 197 ACCEL_RANGE_16G = BYTE(00011000)
fruediger 0:95916b07e8be 198 };
fruediger 0:95916b07e8be 199
fruediger 0:95916b07e8be 200 static const uint8_t TEMP_FIFO_EN_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 201 static const uint8_t GYRO_X_FIFO_EN_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 202 static const uint8_t GYRO_Y_FIFO_EN_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 203 static const uint8_t GYRO_Z_FIFO_EN_MASK = BYTE(00010000);
fruediger 0:95916b07e8be 204 static const uint8_t ACCEL_FIFO_EN_MASK = BYTE(00001000);
fruediger 0:95916b07e8be 205
fruediger 1:96a227d1ca7e 206 static const uint8_t INT_LEVEL_MASK = BYTE(10000000);
fruediger 1:96a227d1ca7e 207 enum InterruptLevel
fruediger 1:96a227d1ca7e 208 {
fruediger 1:96a227d1ca7e 209 INT_LEVEL_ACTIVE_HIGH = BYTE(00000000),
fruediger 1:96a227d1ca7e 210 INT_LEVEL_ACTIVE_LOW = BYTE(10000000)
fruediger 1:96a227d1ca7e 211 };
fruediger 1:96a227d1ca7e 212
fruediger 1:96a227d1ca7e 213 static const uint8_t INT_DRIVE_MASK = BYTE(01000000);
fruediger 1:96a227d1ca7e 214 enum InterruptDrive
fruediger 1:96a227d1ca7e 215 {
fruediger 1:96a227d1ca7e 216 INT_DRIVE_PUSH_PULL = BYTE(00000000),
fruediger 1:96a227d1ca7e 217 INT_DRIVE_OPEN_DRAIN = BYTE(01000000)
fruediger 1:96a227d1ca7e 218 };
fruediger 1:96a227d1ca7e 219
fruediger 1:96a227d1ca7e 220 static const uint8_t INT_LATCH_MASK = BYTE(00100000);
fruediger 1:96a227d1ca7e 221 enum InterruptLatch
fruediger 1:96a227d1ca7e 222 {
fruediger 1:96a227d1ca7e 223 INT_LATCH_50US_PULSE = BYTE(00000000),
fruediger 1:96a227d1ca7e 224 INT_LATCH_WAIT_CLEARED = BYTE(00100000)
fruediger 1:96a227d1ca7e 225 };
fruediger 1:96a227d1ca7e 226
fruediger 1:96a227d1ca7e 227 static const uint8_t INT_CLEAR_MASK = BYTE(00010000);
fruediger 1:96a227d1ca7e 228 enum InterruptClear
fruediger 1:96a227d1ca7e 229 {
fruediger 1:96a227d1ca7e 230 INT_CLEAR_STATUS_ONLY_READ = BYTE(00000000),
fruediger 1:96a227d1ca7e 231 INT_CLEAR_ANY_READ = BYTE(00010000)
fruediger 1:96a227d1ca7e 232 };
fruediger 1:96a227d1ca7e 233
fruediger 1:96a227d1ca7e 234 static const uint8_t INT_FSYNC_LEVEL_MASK = BYTE(00001000);
fruediger 1:96a227d1ca7e 235 enum InterruptFSyncLevel
fruediger 1:96a227d1ca7e 236 {
fruediger 1:96a227d1ca7e 237 INT_FSYNC_LEVEL_ACTIVE_HIGH = BYTE(00000000),
fruediger 1:96a227d1ca7e 238 INT_FSYNC_LEVEL_ACTIVE_LOW = BYTE(00001000)
fruediger 1:96a227d1ca7e 239 };
fruediger 1:96a227d1ca7e 240
fruediger 1:96a227d1ca7e 241 static const uint8_t INT_FSYNC_EN_MASK = BYTE(00000100);
fruediger 1:96a227d1ca7e 242
fruediger 1:96a227d1ca7e 243 enum Interrupt
fruediger 1:96a227d1ca7e 244 {
fruediger 1:96a227d1ca7e 245 INT_FREEFALL = BYTE(10000000),
fruediger 1:96a227d1ca7e 246 INT_MOTION = BYTE(01000000),
fruediger 1:96a227d1ca7e 247 INT_ZERO_MOTION = BYTE(00100000),
fruediger 1:96a227d1ca7e 248 INT_FIFO_OVERFLOW = BYTE(00010000),
fruediger 1:96a227d1ca7e 249 /* INT_I2C_MASTER = BYTE(00001000),
fruediger 1:96a227d1ca7e 250 INT_PLL_READY = BYTE(00000100),
fruediger 1:96a227d1ca7e 251 INT_DMP_INIT = BYTE(00000010), */
fruediger 1:96a227d1ca7e 252 INT_DATA_READY = BYTE(00000001)
fruediger 1:96a227d1ca7e 253 };
fruediger 1:96a227d1ca7e 254 friend inline Interrupt operator|(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) | static_cast<int>(b)); }
fruediger 1:96a227d1ca7e 255 friend inline Interrupt operator&(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) & static_cast<int>(b)); }
fruediger 1:96a227d1ca7e 256
fruediger 2:32b13cc64cb0 257 enum Motion
fruediger 2:32b13cc64cb0 258 {
fruediger 2:32b13cc64cb0 259 MOT_NEGATIVE_X = BYTE(10000000),
fruediger 2:32b13cc64cb0 260 MOT_POSITIVE_X = BYTE(01000000),
fruediger 2:32b13cc64cb0 261 MOT_NEGATIVE_Y = BYTE(00100000),
fruediger 2:32b13cc64cb0 262 MOT_POSITIVE_Y = BYTE(00010000),
fruediger 2:32b13cc64cb0 263 MOT_NEGATIVE_Z = BYTE(00001000),
fruediger 2:32b13cc64cb0 264 MOT_POSITIVE_Z = BYTE(00000100),
fruediger 2:32b13cc64cb0 265 MOT_ZERO = BYTE(00000001)
fruediger 2:32b13cc64cb0 266 };
fruediger 2:32b13cc64cb0 267 friend inline Motion operator|(Motion a, Motion b) { return static_cast<Motion>(static_cast<int>(a) | static_cast<int>(b)); }
fruediger 2:32b13cc64cb0 268 friend inline Motion operator&(Motion a, Motion b) { return static_cast<Motion>(static_cast<int>(a) & static_cast<int>(b)); }
fruediger 2:32b13cc64cb0 269
fruediger 2:32b13cc64cb0 270 static const uint8_t GYRO_PATH_RESET_MASK = BYTE(00000100);
fruediger 2:32b13cc64cb0 271 static const uint8_t ACCEL_PATH_RESET_MASK = BYTE(00000010);
fruediger 2:32b13cc64cb0 272 static const uint8_t TEMP_PATH_RESET_MASK = BYTE(00000001);
fruediger 2:32b13cc64cb0 273
fruediger 3:a6e53ab2c8c0 274 static const uint8_t POWER_ON_DELAY_MASK = BYTE(00110000);
fruediger 3:a6e53ab2c8c0 275 enum PowerOnDelay
fruediger 3:a6e53ab2c8c0 276 {
fruediger 3:a6e53ab2c8c0 277 POWER_ON_DELAY_0MS = BYTE(00000000),
fruediger 3:a6e53ab2c8c0 278 POWER_ON_DELAY_1MS = BYTE(00010000),
fruediger 3:a6e53ab2c8c0 279 POWER_ON_DELAY_2MS = BYTE(00100000),
fruediger 3:a6e53ab2c8c0 280 POWER_ON_DELAY_3MS = BYTE(00110000)
fruediger 3:a6e53ab2c8c0 281 };
fruediger 3:a6e53ab2c8c0 282
fruediger 3:a6e53ab2c8c0 283 static const uint8_t FF_DETECTION_DEC_MASK = BYTE(00001100);
fruediger 3:a6e53ab2c8c0 284 enum FreefallDetectionDecrement
fruediger 3:a6e53ab2c8c0 285 {
fruediger 3:a6e53ab2c8c0 286 FF_DETECTION_DEC_RESET = BYTE(00000000),
fruediger 3:a6e53ab2c8c0 287 FF_DETECTION_DEC_1 = BYTE(00000100),
fruediger 3:a6e53ab2c8c0 288 FF_DETECTION_DEC_2 = BYTE(00001000),
fruediger 3:a6e53ab2c8c0 289 FF_DETECTION_DEC_4 = BYTE(00001100)
fruediger 3:a6e53ab2c8c0 290 };
fruediger 3:a6e53ab2c8c0 291
fruediger 3:a6e53ab2c8c0 292 static const uint8_t MOT_DETECTION_DEC_MASK = BYTE(00000011);
fruediger 3:a6e53ab2c8c0 293 enum MotionDetectionDecrement
fruediger 3:a6e53ab2c8c0 294 {
fruediger 3:a6e53ab2c8c0 295 MOT_DETECTION_DEC_RESET = BYTE(00000000),
fruediger 3:a6e53ab2c8c0 296 MOT_DETECTION_DEC_1 = BYTE(00000001),
fruediger 3:a6e53ab2c8c0 297 MOT_DETECTION_DEC_2 = BYTE(00000010),
fruediger 3:a6e53ab2c8c0 298 MOT_DETECTION_DEC_4 = BYTE(00000011)
fruediger 3:a6e53ab2c8c0 299 };
fruediger 3:a6e53ab2c8c0 300
fruediger 3:a6e53ab2c8c0 301 static const uint8_t FIFO_EN_MASK = BYTE(01000000);
fruediger 3:a6e53ab2c8c0 302 static const uint8_t FIFO_RESET_MASK = BYTE(00000100);
fruediger 3:a6e53ab2c8c0 303 static const uint8_t SIG_COND_RESET_MASK = BYTE(00000001);
fruediger 3:a6e53ab2c8c0 304
fruediger 3:a6e53ab2c8c0 305 static const uint8_t RESET_MASK = BYTE(10000000);
fruediger 3:a6e53ab2c8c0 306 static const uint8_t SLEEP_EN_MASK = BYTE(01000000);
fruediger 3:a6e53ab2c8c0 307 static const uint8_t WAKE_CYCLE_EN_MASK = BYTE(00100000);
fruediger 3:a6e53ab2c8c0 308 static const uint8_t TEMP_EN_MASK = BYTE(00001000);
fruediger 3:a6e53ab2c8c0 309
fruediger 3:a6e53ab2c8c0 310 static const uint8_t CLOCK_SOURCE_MASK = BYTE(00000111);
fruediger 3:a6e53ab2c8c0 311 enum ClockSource
fruediger 3:a6e53ab2c8c0 312 {
fruediger 3:a6e53ab2c8c0 313 CLOCK_SRC_INTERNAL_8MHZ = BYTE(00000000),
fruediger 3:a6e53ab2c8c0 314 CLOCK_SRC_PLL_GYRO_X_REF = BYTE(00000001),
fruediger 3:a6e53ab2c8c0 315 CLOCK_SRC_PLL_GYRO_Y_REF = BYTE(00000010),
fruediger 3:a6e53ab2c8c0 316 CLOCK_SRC_PLL_GYRO_Z_REF = BYTE(00000011),
fruediger 3:a6e53ab2c8c0 317 CLOCK_SRC_EXTERNAL_32KHZ = BYTE(00000100),
fruediger 3:a6e53ab2c8c0 318 CLOCK_SRC_EXTERNAL_19MHZ = BYTE(00000101),
fruediger 3:a6e53ab2c8c0 319 CLOCK_SRC_KEEP_RESET = BYTE(00000111)
fruediger 3:a6e53ab2c8c0 320 };
fruediger 3:a6e53ab2c8c0 321
fruediger 3:a6e53ab2c8c0 322 static const uint8_t WAKE_FREQ_MASK = BYTE(11000000);
fruediger 3:a6e53ab2c8c0 323 enum WakeFrequency
fruediger 3:a6e53ab2c8c0 324 {
fruediger 3:a6e53ab2c8c0 325 WAKE_FREQ_1_25Hz = BYTE(00000000),
fruediger 3:a6e53ab2c8c0 326 WAKE_FREQ_2_5Hz = BYTE(01000000),
fruediger 3:a6e53ab2c8c0 327 WAKE_FREQ_5Hz = BYTE(10000000),
fruediger 3:a6e53ab2c8c0 328 WAKE_FREQ_10HZ = BYTE(11000000)
fruediger 3:a6e53ab2c8c0 329 };
fruediger 3:a6e53ab2c8c0 330
fruediger 3:a6e53ab2c8c0 331 static const uint8_t ACCEL_X_STB_EN_MASK = BYTE(00100000);
fruediger 3:a6e53ab2c8c0 332 static const uint8_t ACCEL_Y_STB_EN_MASK = BYTE(00010000);
fruediger 3:a6e53ab2c8c0 333 static const uint8_t ACCEL_Z_STB_EN_MASK = BYTE(00001000);
fruediger 3:a6e53ab2c8c0 334 static const uint8_t GYRO_X_STB_EN_MASK = BYTE(00000100);
fruediger 3:a6e53ab2c8c0 335 static const uint8_t GYRO_Y_STB_EN_MASK = BYTE(00000010);
fruediger 3:a6e53ab2c8c0 336 static const uint8_t GYRO_Z_STB_EN_MASK = BYTE(00000001);
fruediger 3:a6e53ab2c8c0 337
fruediger 3:a6e53ab2c8c0 338 static const uint8_t DEVICE_ID_MASK = BYTE(01111110);
fruediger 3:a6e53ab2c8c0 339
fruediger 3:a6e53ab2c8c0 340 static const uint8_t MPU6050_ID = BYTE(00110100); // should be 0x34
fruediger 3:a6e53ab2c8c0 341
fruediger 1:96a227d1ca7e 342 /**
fruediger 1:96a227d1ca7e 343 * basic members
fruediger 1:96a227d1ca7e 344 */
fruediger 1:96a227d1ca7e 345
fruediger 0:95916b07e8be 346 MPU6050(PinName sda, PinName scl, BaseAddress address = ADDRESS_0) : i2c(sda, scl), baseAddress(address)
fruediger 3:a6e53ab2c8c0 347 { }
fruediger 0:95916b07e8be 348
fruediger 3:a6e53ab2c8c0 349 BaseAddress getAddress() { return baseAddress; }
fruediger 0:95916b07e8be 350
fruediger 0:95916b07e8be 351 /**
fruediger 0:95916b07e8be 352 * REG_AUX_VDDIO register
fruediger 0:95916b07e8be 353 */
fruediger 0:95916b07e8be 354
fruediger 0:95916b07e8be 355 bool getAuxVDDIOLevel(AuxVDDIOLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 356 bool setAuxVDDIOLevel(AuxVDDIOLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 357
fruediger 0:95916b07e8be 358 /**
fruediger 0:95916b07e8be 359 * REG_SMPLRT_DIV register
fruediger 0:95916b07e8be 360 */
fruediger 0:95916b07e8be 361
fruediger 0:95916b07e8be 362 bool getGyroSampleRateDivider(uint8_t *rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 363 bool setGyroSampleRateDivider(uint8_t rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 364
fruediger 0:95916b07e8be 365 /**
fruediger 0:95916b07e8be 366 * REG_CONFIG register
fruediger 0:95916b07e8be 367 */
fruediger 0:95916b07e8be 368
fruediger 0:95916b07e8be 369 bool getExternalFrameSync(ExtFrameSync *frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 370 bool setExternalFrameSync(ExtFrameSync frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 371
fruediger 0:95916b07e8be 372 bool getDLPFBandwidth(DLPFBandwidth *bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 373 bool setDLPFBandwidth(DLPFBandwidth bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 374
fruediger 0:95916b07e8be 375 /**
fruediger 0:95916b07e8be 376 * REG_GYRO_CONFIG register
fruediger 3:a6e53ab2c8c0 377 */
fruediger 0:95916b07e8be 378
fruediger 0:95916b07e8be 379 bool getGyroXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 380 bool setGyroXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 381
fruediger 0:95916b07e8be 382 bool getGyroYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 383 bool setGyroYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 384
fruediger 0:95916b07e8be 385 bool getGyroZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 386 bool setGyroZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 387
fruediger 0:95916b07e8be 388 bool getGyroRange(GyroRange *gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 389 bool setGyroRange(GyroRange gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 390
fruediger 0:95916b07e8be 391 /**
fruediger 0:95916b07e8be 392 * REG_ACCEL_CONFIG register
fruediger 0:95916b07e8be 393 */
fruediger 0:95916b07e8be 394
fruediger 0:95916b07e8be 395 bool getAccelXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 396 bool setAccelXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 397
fruediger 0:95916b07e8be 398 bool getAccelYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 399 bool setAccelYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 400
fruediger 0:95916b07e8be 401 bool getAccelZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 402 bool setAccelZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 403
fruediger 0:95916b07e8be 404 bool getAccelHPFCutOff(AccelHPFCutOff *frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 405 bool setAccelHPFCutOff(AccelHPFCutOff frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 406
fruediger 0:95916b07e8be 407 bool getAccelRange(AccelRange *accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 408 bool setAccelRange(AccelRange accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 409
fruediger 0:95916b07e8be 410 /**
fruediger 0:95916b07e8be 411 * REG_FF_THR register
fruediger 0:95916b07e8be 412 */
fruediger 0:95916b07e8be 413
fruediger 0:95916b07e8be 414 bool getFreefallDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 415 bool setFreefallDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 416
fruediger 0:95916b07e8be 417 /**
fruediger 0:95916b07e8be 418 * REG_FF_DUR register
fruediger 0:95916b07e8be 419 */
fruediger 0:95916b07e8be 420
fruediger 0:95916b07e8be 421 bool getFreefallDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 422 bool setFreefallDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 423
fruediger 0:95916b07e8be 424 /**
fruediger 0:95916b07e8be 425 * REG_MOT_THR register
fruediger 0:95916b07e8be 426 */
fruediger 0:95916b07e8be 427
fruediger 0:95916b07e8be 428 bool getMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 429 bool setMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 430
fruediger 0:95916b07e8be 431 /**
fruediger 0:95916b07e8be 432 * REG_MOT_DUR register
fruediger 0:95916b07e8be 433 */
fruediger 0:95916b07e8be 434
fruediger 0:95916b07e8be 435 bool getMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 436 bool setMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 437
fruediger 0:95916b07e8be 438 /**
fruediger 0:95916b07e8be 439 * REG_ZRMOT_THR register
fruediger 0:95916b07e8be 440 */
fruediger 0:95916b07e8be 441
fruediger 0:95916b07e8be 442 bool getZeroMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 443 bool setZeroMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 444
fruediger 0:95916b07e8be 445 /**
fruediger 0:95916b07e8be 446 * REG_ZRMOT_DUR register
fruediger 0:95916b07e8be 447 */
fruediger 0:95916b07e8be 448
fruediger 0:95916b07e8be 449 bool getZeroMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 450 bool setZeroMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 451
fruediger 0:95916b07e8be 452 /**
fruediger 0:95916b07e8be 453 * REG_FIFO_EN register
fruediger 0:95916b07e8be 454 */
fruediger 0:95916b07e8be 455
fruediger 0:95916b07e8be 456 bool getTempFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 457 bool setTempFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 458
fruediger 0:95916b07e8be 459 bool getGyroXFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 460 bool setGyroXFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 461
fruediger 0:95916b07e8be 462 bool getGyroYFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 463 bool setGyroYFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 464
fruediger 0:95916b07e8be 465 bool getGyroZFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 466 bool setGyroZFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 467
fruediger 0:95916b07e8be 468 bool getAccelFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 469 bool setAccelFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 470
fruediger 0:95916b07e8be 471 /**
fruediger 1:96a227d1ca7e 472 * REG_INT_PIN_CFG register
fruediger 1:96a227d1ca7e 473 */
fruediger 1:96a227d1ca7e 474
fruediger 1:96a227d1ca7e 475 bool getInterruptLevel(InterruptLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 476 bool setInterruptLevel(InterruptLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 477
fruediger 1:96a227d1ca7e 478 bool getInterruptDrive(InterruptDrive *drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 479 bool setInterruptDrive(InterruptDrive drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 480
fruediger 1:96a227d1ca7e 481 bool getInterruptLatch(InterruptLatch *latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 482 bool setInterruptLatch(InterruptLatch latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 483
fruediger 1:96a227d1ca7e 484 bool getInterruptLatchClear(InterruptClear *latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 485 bool setInterruptLatchClear(InterruptClear latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 486
fruediger 1:96a227d1ca7e 487 bool getInterruptFSyncLevel(InterruptFSyncLevel *fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 488 bool setInterruptFSyncLevel(InterruptFSyncLevel fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 489
fruediger 1:96a227d1ca7e 490 bool getInterruptFSyncEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 491 bool setInterruptFSyncEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 492
fruediger 1:96a227d1ca7e 493 /**
fruediger 1:96a227d1ca7e 494 * REG_INT_ENABLE register
fruediger 1:96a227d1ca7e 495 */
fruediger 1:96a227d1ca7e 496
fruediger 1:96a227d1ca7e 497 bool getInterruptsEnabled(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 498 bool setInterruptsEnabled(Interrupt interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 499
fruediger 1:96a227d1ca7e 500 bool getInterruptFreefallEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 501 bool setInterruptFreefallEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 502
fruediger 1:96a227d1ca7e 503 bool getInterruptMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 504 bool setInterruptMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 505
fruediger 1:96a227d1ca7e 506 bool getInterruptZeroMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 507 bool setInterruptZeroMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 508
fruediger 1:96a227d1ca7e 509 bool getInterruptFIFOOverflowEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 510 bool setInterruptFIFOOverflowEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 511
fruediger 1:96a227d1ca7e 512 bool getInterruptDataReadyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 513 bool setInterruptDataReadyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 514
fruediger 1:96a227d1ca7e 515 /**
fruediger 1:96a227d1ca7e 516 * REG_INT_STATUS register
fruediger 1:96a227d1ca7e 517 */
fruediger 1:96a227d1ca7e 518
fruediger 1:96a227d1ca7e 519 bool getInterruptStatuses(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 520
fruediger 1:96a227d1ca7e 521 bool getInterruptFreefallStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 522
fruediger 1:96a227d1ca7e 523 bool getInterruptMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 524
fruediger 1:96a227d1ca7e 525 bool getInterruptZeroMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 526
fruediger 1:96a227d1ca7e 527 bool getInterruptFIFOOverflowStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 528
fruediger 1:96a227d1ca7e 529 bool getInterruptDataReadyStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 530
fruediger 1:96a227d1ca7e 531 /**
fruediger 1:96a227d1ca7e 532 * REG_ACCEL_XOUT_H
fruediger 1:96a227d1ca7e 533 * REG_ACCEL_XOUT_L
fruediger 1:96a227d1ca7e 534 * REG_ACCEL_YOUT_H
fruediger 1:96a227d1ca7e 535 * REG_ACCEL_YOUT_L
fruediger 1:96a227d1ca7e 536 * REG_ACCEL_ZOUT_H
fruediger 1:96a227d1ca7e 537 * REG_ACCEL_ZOUT_L
fruediger 1:96a227d1ca7e 538 * REG_TEMP_OUT_H
fruediger 1:96a227d1ca7e 539 * REG_TEMP_OUT_L
fruediger 1:96a227d1ca7e 540 * REG_GYRO_XOUT_H
fruediger 1:96a227d1ca7e 541 * REG_GYRO_XOUT_L
fruediger 1:96a227d1ca7e 542 * REG_GYRO_YOUT_H
fruediger 1:96a227d1ca7e 543 * REG_GYRO_YOUT_L
fruediger 1:96a227d1ca7e 544 * REG_GYRO_ZOUT_H
fruediger 1:96a227d1ca7e 545 * REG_GYRO_ZOUT_L registers
fruediger 1:96a227d1ca7e 546 */
fruediger 1:96a227d1ca7e 547
fruediger 1:96a227d1ca7e 548 /** Acceleration */
fruediger 1:96a227d1ca7e 549
fruediger 1:96a227d1ca7e 550 bool getAcceleration(int16_t *ax, int16_t *ay, int16_t *az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 551
fruediger 1:96a227d1ca7e 552 bool getAccelerationX(int16_t* ax, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 553
fruediger 1:96a227d1ca7e 554 bool getAccelerationY(int16_t* ay, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 555
fruediger 1:96a227d1ca7e 556 bool getAccelerationZ(int16_t* az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 557
fruediger 1:96a227d1ca7e 558 /** Temperature */
fruediger 1:96a227d1ca7e 559
fruediger 1:96a227d1ca7e 560 bool getTemperature(int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 561
fruediger 1:96a227d1ca7e 562 /** Rotation speed */
fruediger 1:96a227d1ca7e 563
fruediger 1:96a227d1ca7e 564 bool getRotationSpeed(int16_t *ox, int16_t *oy, int16_t *oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 565
fruediger 1:96a227d1ca7e 566 bool getRotationSpeedX(int16_t* ox, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 567
fruediger 1:96a227d1ca7e 568 bool getRotationSpeedY(int16_t* oy, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 569
fruediger 1:96a227d1ca7e 570 bool getRotationSpeedZ(int16_t* oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 571
fruediger 1:96a227d1ca7e 572 /** All three */
fruediger 1:96a227d1ca7e 573
fruediger 1:96a227d1ca7e 574 bool getMotionAndTemperature(int16_t* ax, int16_t* ay, int16_t* az,
fruediger 1:96a227d1ca7e 575 int16_t* ox, int16_t* oy, int16_t* oz,
fruediger 1:96a227d1ca7e 576 int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 577
fruediger 2:32b13cc64cb0 578 bool getMotionAndTemperature(MPU6050SensorReading *sensorReading, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 579
fruediger 2:32b13cc64cb0 580 /**
fruediger 2:32b13cc64cb0 581 * REG_MOT_DETECT_STATUS register
fruediger 2:32b13cc64cb0 582 */
fruediger 2:32b13cc64cb0 583
fruediger 2:32b13cc64cb0 584 bool getMotionStatus(Motion *motionSet, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 585
fruediger 2:32b13cc64cb0 586 bool getNegativeXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 587
fruediger 2:32b13cc64cb0 588 bool getPositiveXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 589
fruediger 2:32b13cc64cb0 590 bool getNegativeYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 591
fruediger 2:32b13cc64cb0 592 bool getPositiveYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 593
fruediger 2:32b13cc64cb0 594 bool getNegativeZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 595
fruediger 2:32b13cc64cb0 596 bool getPositiveZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 597
fruediger 2:32b13cc64cb0 598 bool getZeroMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 599
fruediger 2:32b13cc64cb0 600 /**
fruediger 2:32b13cc64cb0 601 * REG_SIGNAL_PATH_RESET register
fruediger 2:32b13cc64cb0 602 */
fruediger 2:32b13cc64cb0 603
fruediger 2:32b13cc64cb0 604 bool resetGyroscopeSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 605
fruediger 2:32b13cc64cb0 606 bool resetAccelerometerSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 607
fruediger 2:32b13cc64cb0 608 bool resetTemperatureSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 609
fruediger 1:96a227d1ca7e 610 /**
fruediger 3:a6e53ab2c8c0 611 * REG_MOT_DETECT_CTRL register
fruediger 3:a6e53ab2c8c0 612 */
fruediger 3:a6e53ab2c8c0 613
fruediger 3:a6e53ab2c8c0 614 bool getAccelerometerPowerOnDelay(PowerOnDelay* delay, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 615 bool setAccelerometerPowerOnDelay(PowerOnDelay delay, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 616
fruediger 3:a6e53ab2c8c0 617 bool getFreefallDetectionDecrement(FreefallDetectionDecrement* dec, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 618 bool setFreefallDetectionDecrement(FreefallDetectionDecrement dec, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 619
fruediger 3:a6e53ab2c8c0 620 bool getMotionDetectionDecrement(MotionDetectionDecrement* dec, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 621 bool setMotionDetectionDecrement(MotionDetectionDecrement dec, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 622
fruediger 3:a6e53ab2c8c0 623 /**
fruediger 3:a6e53ab2c8c0 624 * REG_USER_CTRL register
fruediger 3:a6e53ab2c8c0 625 */
fruediger 3:a6e53ab2c8c0 626
fruediger 3:a6e53ab2c8c0 627 bool getFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 628 bool setFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 629
fruediger 3:a6e53ab2c8c0 630 bool resetFIFO(float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 631
fruediger 3:a6e53ab2c8c0 632 bool resetSensors(float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 633
fruediger 3:a6e53ab2c8c0 634 /**
fruediger 3:a6e53ab2c8c0 635 * REG_PWR_MGMT_1 register
fruediger 3:a6e53ab2c8c0 636 */
fruediger 3:a6e53ab2c8c0 637
fruediger 3:a6e53ab2c8c0 638 bool reset(float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 639
fruediger 3:a6e53ab2c8c0 640 bool getSleepEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 641 bool setSleepEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 642
fruediger 3:a6e53ab2c8c0 643 bool getWakeCycleEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 644 bool setWakeCycleEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 645
fruediger 3:a6e53ab2c8c0 646 bool getTemperatureSensorEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 647 bool setTemperatureSensorEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 648
fruediger 3:a6e53ab2c8c0 649 bool getClockSource(ClockSource* clockSource, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 650 bool setClockSource(ClockSource clockSource, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 651
fruediger 3:a6e53ab2c8c0 652 /**
fruediger 3:a6e53ab2c8c0 653 * REG_PWR_MGMT_2 register
fruediger 3:a6e53ab2c8c0 654 */
fruediger 3:a6e53ab2c8c0 655
fruediger 3:a6e53ab2c8c0 656 bool getWakeFrequency(WakeFrequency* wakeFrequency, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 657 bool setWakeFrequency(WakeFrequency wakeFrequency, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 658
fruediger 3:a6e53ab2c8c0 659 bool getGyroXStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 660 bool setGyroXStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 661
fruediger 3:a6e53ab2c8c0 662 bool getGyroYStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 663 bool setGyroYStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 664
fruediger 3:a6e53ab2c8c0 665 bool getGyroZStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 666 bool setGyroZStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 667
fruediger 3:a6e53ab2c8c0 668 bool getAccelXStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 669 bool setAccelXStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 670
fruediger 3:a6e53ab2c8c0 671 bool getAccelYStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 672 bool setAccelYStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 673
fruediger 3:a6e53ab2c8c0 674 bool getAccelZStandbyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 675 bool setAccelZStandbyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 676
fruediger 3:a6e53ab2c8c0 677 /**
fruediger 3:a6e53ab2c8c0 678 * REG_FIFO_COUNTH
fruediger 3:a6e53ab2c8c0 679 * REG_FIFO_COUNTL registers
fruediger 3:a6e53ab2c8c0 680 */
fruediger 3:a6e53ab2c8c0 681
fruediger 3:a6e53ab2c8c0 682 bool getFIFOCount(uint16_t *count, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 683
fruediger 3:a6e53ab2c8c0 684 /**
fruediger 3:a6e53ab2c8c0 685 * REG_FIFO_R_W register
fruediger 3:a6e53ab2c8c0 686 */
fruediger 3:a6e53ab2c8c0 687
fruediger 3:a6e53ab2c8c0 688 bool readFIFO(uint8_t *data, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 689 bool writeFIFO(uint8_t data, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 690
fruediger 3:a6e53ab2c8c0 691 bool readFIFO(uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 692 bool writeFIFO(uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 693
fruediger 3:a6e53ab2c8c0 694 /**
fruediger 3:a6e53ab2c8c0 695 * REG_WHO_AM_I register
fruediger 3:a6e53ab2c8c0 696 */
fruediger 3:a6e53ab2c8c0 697
fruediger 3:a6e53ab2c8c0 698 bool getDeviceId(uint8_t *id, float timeout_secs = defaultTimeout_secs);
fruediger 3:a6e53ab2c8c0 699
fruediger 3:a6e53ab2c8c0 700 /**
fruediger 3:a6e53ab2c8c0 701 * read and write registers
fruediger 0:95916b07e8be 702 */
fruediger 0:95916b07e8be 703
fruediger 0:95916b07e8be 704 bool read(Register reg, uint8_t *data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 705 bool read(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 706
fruediger 0:95916b07e8be 707 bool write(Register reg, uint8_t data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 708 bool write(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 709
fruediger 0:95916b07e8be 710 private:
fruediger 0:95916b07e8be 711 static const float retryDelay_secs = 0.005;
fruediger 0:95916b07e8be 712 static const float defaultTimeout_secs = 0.1; // makes a maximum of 20 tries
fruediger 0:95916b07e8be 713
fruediger 0:95916b07e8be 714 I2C i2c;
fruediger 0:95916b07e8be 715 BaseAddress baseAddress;
fruediger 2:32b13cc64cb0 716
fruediger 2:32b13cc64cb0 717 union
fruediger 2:32b13cc64cb0 718 {
fruediger 2:32b13cc64cb0 719 struct
fruediger 2:32b13cc64cb0 720 {
fruediger 2:32b13cc64cb0 721 uint8_t ax_h, ax_l;
fruediger 2:32b13cc64cb0 722 uint8_t ay_h, ay_l;
fruediger 2:32b13cc64cb0 723 uint8_t az_h, az_l;
fruediger 2:32b13cc64cb0 724
fruediger 2:32b13cc64cb0 725 uint8_t temp_h, temp_l;
fruediger 2:32b13cc64cb0 726
fruediger 2:32b13cc64cb0 727 uint8_t ox_h, ox_l;
fruediger 2:32b13cc64cb0 728 uint8_t oy_h, oy_l;
fruediger 2:32b13cc64cb0 729 uint8_t oz_h, oz_l;
fruediger 2:32b13cc64cb0 730 } reg;
fruediger 2:32b13cc64cb0 731
fruediger 2:32b13cc64cb0 732 MPU6050SensorReading value;
fruediger 2:32b13cc64cb0 733 } converter;
fruediger 0:95916b07e8be 734 };
fruediger 0:95916b07e8be 735
fruediger 0:95916b07e8be 736 #endif