Felix Rüdiger / MPU6050_lib

Dependents:   BLE_Nano_MPU6050Service

Committer:
fruediger
Date:
Mon Jul 13 15:23:35 2015 +0000
Revision:
2:32b13cc64cb0
Parent:
1:96a227d1ca7e
Child:
3:a6e53ab2c8c0
more complete implementation (and even more stuff should follow...)

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 1:96a227d1ca7e 274 /**
fruediger 1:96a227d1ca7e 275 * basic members
fruediger 1:96a227d1ca7e 276 */
fruediger 1:96a227d1ca7e 277
fruediger 0:95916b07e8be 278 MPU6050(PinName sda, PinName scl, BaseAddress address = ADDRESS_0) : i2c(sda, scl), baseAddress(address)
fruediger 2:32b13cc64cb0 279 { i2c.frequency(500); }
fruediger 0:95916b07e8be 280
fruediger 0:95916b07e8be 281 BaseAddress getAddress() { return baseAddress; }
fruediger 0:95916b07e8be 282
fruediger 0:95916b07e8be 283 /**
fruediger 0:95916b07e8be 284 * REG_AUX_VDDIO register
fruediger 0:95916b07e8be 285 */
fruediger 0:95916b07e8be 286
fruediger 0:95916b07e8be 287 bool getAuxVDDIOLevel(AuxVDDIOLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 288 bool setAuxVDDIOLevel(AuxVDDIOLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 289
fruediger 0:95916b07e8be 290 /**
fruediger 0:95916b07e8be 291 * REG_SMPLRT_DIV register
fruediger 0:95916b07e8be 292 */
fruediger 0:95916b07e8be 293
fruediger 0:95916b07e8be 294 bool getGyroSampleRateDivider(uint8_t *rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 295 bool setGyroSampleRateDivider(uint8_t rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 296
fruediger 0:95916b07e8be 297 /**
fruediger 0:95916b07e8be 298 * REG_CONFIG register
fruediger 0:95916b07e8be 299 */
fruediger 0:95916b07e8be 300
fruediger 0:95916b07e8be 301 bool getExternalFrameSync(ExtFrameSync *frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 302 bool setExternalFrameSync(ExtFrameSync frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 303
fruediger 0:95916b07e8be 304 bool getDLPFBandwidth(DLPFBandwidth *bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 305 bool setDLPFBandwidth(DLPFBandwidth bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 306
fruediger 0:95916b07e8be 307 /**
fruediger 0:95916b07e8be 308 * REG_GYRO_CONFIG register
fruediger 0:95916b07e8be 309 */
fruediger 0:95916b07e8be 310
fruediger 0:95916b07e8be 311 bool getGyroXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 312 bool setGyroXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 313
fruediger 0:95916b07e8be 314 bool getGyroYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 315 bool setGyroYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 316
fruediger 0:95916b07e8be 317 bool getGyroZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 318 bool setGyroZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 319
fruediger 0:95916b07e8be 320 bool getGyroRange(GyroRange *gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 321 bool setGyroRange(GyroRange gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 322
fruediger 0:95916b07e8be 323 /**
fruediger 0:95916b07e8be 324 * REG_ACCEL_CONFIG register
fruediger 0:95916b07e8be 325 */
fruediger 0:95916b07e8be 326
fruediger 0:95916b07e8be 327 bool getAccelXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 328 bool setAccelXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 329
fruediger 0:95916b07e8be 330 bool getAccelYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 331 bool setAccelYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 332
fruediger 0:95916b07e8be 333 bool getAccelZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 334 bool setAccelZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 335
fruediger 0:95916b07e8be 336 bool getAccelHPFCutOff(AccelHPFCutOff *frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 337 bool setAccelHPFCutOff(AccelHPFCutOff frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 338
fruediger 0:95916b07e8be 339 bool getAccelRange(AccelRange *accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 340 bool setAccelRange(AccelRange accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 341
fruediger 0:95916b07e8be 342 /**
fruediger 0:95916b07e8be 343 * REG_FF_THR register
fruediger 0:95916b07e8be 344 */
fruediger 0:95916b07e8be 345
fruediger 0:95916b07e8be 346 bool getFreefallDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 347 bool setFreefallDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 348
fruediger 0:95916b07e8be 349 /**
fruediger 0:95916b07e8be 350 * REG_FF_DUR register
fruediger 0:95916b07e8be 351 */
fruediger 0:95916b07e8be 352
fruediger 0:95916b07e8be 353 bool getFreefallDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 354 bool setFreefallDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 355
fruediger 0:95916b07e8be 356 /**
fruediger 0:95916b07e8be 357 * REG_MOT_THR register
fruediger 0:95916b07e8be 358 */
fruediger 0:95916b07e8be 359
fruediger 0:95916b07e8be 360 bool getMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 361 bool setMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 362
fruediger 0:95916b07e8be 363 /**
fruediger 0:95916b07e8be 364 * REG_MOT_DUR register
fruediger 0:95916b07e8be 365 */
fruediger 0:95916b07e8be 366
fruediger 0:95916b07e8be 367 bool getMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 368 bool setMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 369
fruediger 0:95916b07e8be 370 /**
fruediger 0:95916b07e8be 371 * REG_ZRMOT_THR register
fruediger 0:95916b07e8be 372 */
fruediger 0:95916b07e8be 373
fruediger 0:95916b07e8be 374 bool getZeroMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 375 bool setZeroMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 376
fruediger 0:95916b07e8be 377 /**
fruediger 0:95916b07e8be 378 * REG_ZRMOT_DUR register
fruediger 0:95916b07e8be 379 */
fruediger 0:95916b07e8be 380
fruediger 0:95916b07e8be 381 bool getZeroMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 382 bool setZeroMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 383
fruediger 0:95916b07e8be 384 /**
fruediger 0:95916b07e8be 385 * REG_FIFO_EN register
fruediger 0:95916b07e8be 386 */
fruediger 0:95916b07e8be 387
fruediger 0:95916b07e8be 388 bool getTempFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 389 bool setTempFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 390
fruediger 0:95916b07e8be 391 bool getGyroXFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 392 bool setGyroXFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 393
fruediger 0:95916b07e8be 394 bool getGyroYFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 395 bool setGyroYFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 396
fruediger 0:95916b07e8be 397 bool getGyroZFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 398 bool setGyroZFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 399
fruediger 0:95916b07e8be 400 bool getAccelFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 401 bool setAccelFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 402
fruediger 0:95916b07e8be 403 /**
fruediger 1:96a227d1ca7e 404 * REG_INT_PIN_CFG register
fruediger 1:96a227d1ca7e 405 */
fruediger 1:96a227d1ca7e 406
fruediger 1:96a227d1ca7e 407 bool getInterruptLevel(InterruptLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 408 bool setInterruptLevel(InterruptLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 409
fruediger 1:96a227d1ca7e 410 bool getInterruptDrive(InterruptDrive *drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 411 bool setInterruptDrive(InterruptDrive drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 412
fruediger 1:96a227d1ca7e 413 bool getInterruptLatch(InterruptLatch *latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 414 bool setInterruptLatch(InterruptLatch latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 415
fruediger 1:96a227d1ca7e 416 bool getInterruptLatchClear(InterruptClear *latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 417 bool setInterruptLatchClear(InterruptClear latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 418
fruediger 1:96a227d1ca7e 419 bool getInterruptFSyncLevel(InterruptFSyncLevel *fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 420 bool setInterruptFSyncLevel(InterruptFSyncLevel fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 421
fruediger 1:96a227d1ca7e 422 bool getInterruptFSyncEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 423 bool setInterruptFSyncEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 424
fruediger 1:96a227d1ca7e 425 /**
fruediger 1:96a227d1ca7e 426 * REG_INT_ENABLE register
fruediger 1:96a227d1ca7e 427 */
fruediger 1:96a227d1ca7e 428
fruediger 1:96a227d1ca7e 429 bool getInterruptsEnabled(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 430 bool setInterruptsEnabled(Interrupt interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 431
fruediger 1:96a227d1ca7e 432 bool getInterruptFreefallEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 433 bool setInterruptFreefallEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 434
fruediger 1:96a227d1ca7e 435 bool getInterruptMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 436 bool setInterruptMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 437
fruediger 1:96a227d1ca7e 438 bool getInterruptZeroMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 439 bool setInterruptZeroMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 440
fruediger 1:96a227d1ca7e 441 bool getInterruptFIFOOverflowEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 442 bool setInterruptFIFOOverflowEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 443
fruediger 1:96a227d1ca7e 444 bool getInterruptDataReadyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 445 bool setInterruptDataReadyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 446
fruediger 1:96a227d1ca7e 447 /**
fruediger 1:96a227d1ca7e 448 * REG_INT_STATUS register
fruediger 1:96a227d1ca7e 449 */
fruediger 1:96a227d1ca7e 450
fruediger 1:96a227d1ca7e 451 bool getInterruptStatuses(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 452
fruediger 1:96a227d1ca7e 453 bool getInterruptFreefallStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 454
fruediger 1:96a227d1ca7e 455 bool getInterruptMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 456
fruediger 1:96a227d1ca7e 457 bool getInterruptZeroMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 458
fruediger 1:96a227d1ca7e 459 bool getInterruptFIFOOverflowStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 460
fruediger 1:96a227d1ca7e 461 bool getInterruptDataReadyStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 462
fruediger 1:96a227d1ca7e 463 /**
fruediger 1:96a227d1ca7e 464 * REG_ACCEL_XOUT_H
fruediger 1:96a227d1ca7e 465 * REG_ACCEL_XOUT_L
fruediger 1:96a227d1ca7e 466 * REG_ACCEL_YOUT_H
fruediger 1:96a227d1ca7e 467 * REG_ACCEL_YOUT_L
fruediger 1:96a227d1ca7e 468 * REG_ACCEL_ZOUT_H
fruediger 1:96a227d1ca7e 469 * REG_ACCEL_ZOUT_L
fruediger 1:96a227d1ca7e 470 * REG_TEMP_OUT_H
fruediger 1:96a227d1ca7e 471 * REG_TEMP_OUT_L
fruediger 1:96a227d1ca7e 472 * REG_GYRO_XOUT_H
fruediger 1:96a227d1ca7e 473 * REG_GYRO_XOUT_L
fruediger 1:96a227d1ca7e 474 * REG_GYRO_YOUT_H
fruediger 1:96a227d1ca7e 475 * REG_GYRO_YOUT_L
fruediger 1:96a227d1ca7e 476 * REG_GYRO_ZOUT_H
fruediger 1:96a227d1ca7e 477 * REG_GYRO_ZOUT_L registers
fruediger 1:96a227d1ca7e 478 */
fruediger 1:96a227d1ca7e 479
fruediger 1:96a227d1ca7e 480 /** Acceleration */
fruediger 1:96a227d1ca7e 481
fruediger 1:96a227d1ca7e 482 bool getAcceleration(int16_t *ax, int16_t *ay, int16_t *az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 483
fruediger 1:96a227d1ca7e 484 bool getAccelerationX(int16_t* ax, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 485
fruediger 1:96a227d1ca7e 486 bool getAccelerationY(int16_t* ay, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 487
fruediger 1:96a227d1ca7e 488 bool getAccelerationZ(int16_t* az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 489
fruediger 1:96a227d1ca7e 490 /** Temperature */
fruediger 1:96a227d1ca7e 491
fruediger 1:96a227d1ca7e 492 bool getTemperature(int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 493
fruediger 1:96a227d1ca7e 494 /** Rotation speed */
fruediger 1:96a227d1ca7e 495
fruediger 1:96a227d1ca7e 496 bool getRotationSpeed(int16_t *ox, int16_t *oy, int16_t *oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 497
fruediger 1:96a227d1ca7e 498 bool getRotationSpeedX(int16_t* ox, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 499
fruediger 1:96a227d1ca7e 500 bool getRotationSpeedY(int16_t* oy, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 501
fruediger 1:96a227d1ca7e 502 bool getRotationSpeedZ(int16_t* oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 503
fruediger 1:96a227d1ca7e 504 /** All three */
fruediger 1:96a227d1ca7e 505
fruediger 1:96a227d1ca7e 506 bool getMotionAndTemperature(int16_t* ax, int16_t* ay, int16_t* az,
fruediger 1:96a227d1ca7e 507 int16_t* ox, int16_t* oy, int16_t* oz,
fruediger 1:96a227d1ca7e 508 int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 509
fruediger 2:32b13cc64cb0 510 bool getMotionAndTemperature(MPU6050SensorReading *sensorReading, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 511
fruediger 2:32b13cc64cb0 512 /**
fruediger 2:32b13cc64cb0 513 * REG_MOT_DETECT_STATUS register
fruediger 2:32b13cc64cb0 514 */
fruediger 2:32b13cc64cb0 515
fruediger 2:32b13cc64cb0 516 bool getMotionStatus(Motion *motionSet, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 517
fruediger 2:32b13cc64cb0 518 bool getNegativeXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 519
fruediger 2:32b13cc64cb0 520 bool getPositiveXMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 521
fruediger 2:32b13cc64cb0 522 bool getNegativeYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 523
fruediger 2:32b13cc64cb0 524 bool getPositiveYMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 525
fruediger 2:32b13cc64cb0 526 bool getNegativeZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 527
fruediger 2:32b13cc64cb0 528 bool getPositiveZMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 529
fruediger 2:32b13cc64cb0 530 bool getZeroMotionDetected(bool *detected, float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 531
fruediger 2:32b13cc64cb0 532 /**
fruediger 2:32b13cc64cb0 533 * REG_SIGNAL_PATH_RESET register
fruediger 2:32b13cc64cb0 534 */
fruediger 2:32b13cc64cb0 535
fruediger 2:32b13cc64cb0 536 bool resetGyroscopeSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 537
fruediger 2:32b13cc64cb0 538 bool resetAccelerometerSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 2:32b13cc64cb0 539
fruediger 2:32b13cc64cb0 540 bool resetTemperatureSignalPath(float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 541
fruediger 1:96a227d1ca7e 542 /**
fruediger 0:95916b07e8be 543 * Read and write registers
fruediger 0:95916b07e8be 544 */
fruediger 0:95916b07e8be 545
fruediger 0:95916b07e8be 546 bool read(Register reg, uint8_t *data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 547 bool read(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 548
fruediger 0:95916b07e8be 549 bool write(Register reg, uint8_t data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 550 bool write(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 551
fruediger 0:95916b07e8be 552 private:
fruediger 0:95916b07e8be 553 static const float retryDelay_secs = 0.005;
fruediger 0:95916b07e8be 554 static const float defaultTimeout_secs = 0.1; // makes a maximum of 20 tries
fruediger 0:95916b07e8be 555
fruediger 0:95916b07e8be 556 I2C i2c;
fruediger 0:95916b07e8be 557 BaseAddress baseAddress;
fruediger 2:32b13cc64cb0 558
fruediger 2:32b13cc64cb0 559 union
fruediger 2:32b13cc64cb0 560 {
fruediger 2:32b13cc64cb0 561 struct
fruediger 2:32b13cc64cb0 562 {
fruediger 2:32b13cc64cb0 563 uint8_t ax_h, ax_l;
fruediger 2:32b13cc64cb0 564 uint8_t ay_h, ay_l;
fruediger 2:32b13cc64cb0 565 uint8_t az_h, az_l;
fruediger 2:32b13cc64cb0 566
fruediger 2:32b13cc64cb0 567 uint8_t temp_h, temp_l;
fruediger 2:32b13cc64cb0 568
fruediger 2:32b13cc64cb0 569 uint8_t ox_h, ox_l;
fruediger 2:32b13cc64cb0 570 uint8_t oy_h, oy_l;
fruediger 2:32b13cc64cb0 571 uint8_t oz_h, oz_l;
fruediger 2:32b13cc64cb0 572 } reg;
fruediger 2:32b13cc64cb0 573
fruediger 2:32b13cc64cb0 574 MPU6050SensorReading value;
fruediger 2:32b13cc64cb0 575 } converter;
fruediger 0:95916b07e8be 576 };
fruediger 0:95916b07e8be 577
fruediger 0:95916b07e8be 578 #endif