A library for the Invensense MPU9150

Dependencies:   I2CHelper

Dependents:   Atlas_Test

Committer:
ethanharstad
Date:
Mon Jun 09 21:17:40 2014 +0000
Revision:
2:581fad93a809
Parent:
1:1b0ada1695a7
Untested implementation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ethanharstad 2:581fad93a809 1 // Check methods that write bit fields
ethanharstad 0:d6616b97605d 2 #include "MPU9150.h"
ethanharstad 0:d6616b97605d 3 #include "mbed.h"
ethanharstad 0:d6616b97605d 4
ethanharstad 1:1b0ada1695a7 5 MPU9150::MPU9150() : i2c_(I2C_SDA, I2C_SCL) {
ethanharstad 1:1b0ada1695a7 6 address_ = MPU9150_ADDRESS_DEFAULT;
ethanharstad 2:581fad93a809 7
ethanharstad 2:581fad93a809 8 accelRange_ = 0;
ethanharstad 2:581fad93a809 9 gyroRange_ = 0;
ethanharstad 0:d6616b97605d 10 }
ethanharstad 0:d6616b97605d 11
ethanharstad 1:1b0ada1695a7 12 MPU9150::MPU9150(const bool AD0) : i2c_(I2C_SDA, I2C_SCL) {
ethanharstad 1:1b0ada1695a7 13 if(AD0) {
ethanharstad 1:1b0ada1695a7 14 address_ = MPU9150_ADDRESS_AD0_HIGH;
ethanharstad 1:1b0ada1695a7 15 } else {
ethanharstad 1:1b0ada1695a7 16 address_ = MPU9150_ADDRESS_AD0_LOW;
ethanharstad 1:1b0ada1695a7 17 }
ethanharstad 2:581fad93a809 18
ethanharstad 2:581fad93a809 19 accelRange_ = 0;
ethanharstad 2:581fad93a809 20 gyroRange_ = 0;
ethanharstad 0:d6616b97605d 21 }
ethanharstad 0:d6616b97605d 22
ethanharstad 1:1b0ada1695a7 23 MPU9150::MPU9150(const PinName sda, const PinName scl, const bool AD0) : i2c_(sda, scl) {
ethanharstad 1:1b0ada1695a7 24 if(AD0) {
ethanharstad 1:1b0ada1695a7 25 address_ = MPU9150_ADDRESS_AD0_HIGH;
ethanharstad 1:1b0ada1695a7 26 } else {
ethanharstad 1:1b0ada1695a7 27 address_ = MPU9150_ADDRESS_AD0_LOW;
ethanharstad 1:1b0ada1695a7 28 }
ethanharstad 2:581fad93a809 29
ethanharstad 2:581fad93a809 30 accelRange_ = 0;
ethanharstad 2:581fad93a809 31 gyroRange_ = 0;
ethanharstad 0:d6616b97605d 32 }
ethanharstad 2:581fad93a809 33
ethanharstad 2:581fad93a809 34 void MPU9150::initialize() {
ethanharstad 2:581fad93a809 35 i2c_.setFrequency(100000); // Set frequency to 400 kHz
ethanharstad 2:581fad93a809 36 setClockSource(MPU9150_PWR_MGMT_CLOCK_GYRO_X);
ethanharstad 2:581fad93a809 37 setGyroFullScaleRange(MPU9150_GYRO_FS_250);
ethanharstad 2:581fad93a809 38 setAccelFullScaleRange(MPU9150_ACCEL_FS_2);
ethanharstad 2:581fad93a809 39 setSleepEnabled(false);
ethanharstad 2:581fad93a809 40 }
ethanharstad 2:581fad93a809 41
ethanharstad 2:581fad93a809 42 bool MPU9150::test() {
ethanharstad 2:581fad93a809 43 return getDeviceID() == 0x34;
ethanharstad 2:581fad93a809 44 }
ethanharstad 2:581fad93a809 45
ethanharstad 2:581fad93a809 46 uint8_t MPU9150::getSampleRateDivider() {
ethanharstad 2:581fad93a809 47 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 48 i2c_.readByte(address_, MPU9150_RA_SMPRT_DIV, &buf);
ethanharstad 2:581fad93a809 49 return buf;
ethanharstad 2:581fad93a809 50 }
ethanharstad 2:581fad93a809 51 void MPU9150::setSampleRateDivider(const uint8_t divider) {
ethanharstad 2:581fad93a809 52 i2c_.writeByte(address_, MPU9150_RA_SMPRT_DIV, divider);
ethanharstad 2:581fad93a809 53 }
ethanharstad 2:581fad93a809 54
ethanharstad 2:581fad93a809 55 uint8_t MPU9150::getExternalFrameSync() {
ethanharstad 2:581fad93a809 56 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 57 i2c_.readBits(address_, MPU9150_RA_CONFIG, 5, 3, &buf);
ethanharstad 2:581fad93a809 58 return buf;
ethanharstad 2:581fad93a809 59 }
ethanharstad 2:581fad93a809 60 void MPU9150::setExternalFrameSync(const uint8_t sync) {
ethanharstad 2:581fad93a809 61 i2c_.writeBits(address_, MPU9150_RA_CONFIG, 5, 3, sync);
ethanharstad 2:581fad93a809 62 }
ethanharstad 2:581fad93a809 63 uint8_t MPU9150::getDLPFBandwidth() {
ethanharstad 2:581fad93a809 64 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 65 i2c_.readBits(address_, MPU9150_RA_CONFIG, 2, 3, &buf);
ethanharstad 2:581fad93a809 66 return buf;
ethanharstad 2:581fad93a809 67 }
ethanharstad 2:581fad93a809 68 void MPU9150::setDLPFBandwidth(const uint8_t bandwidth) {
ethanharstad 2:581fad93a809 69 i2c_.writeBits(address_, MPU9150_RA_CONFIG, 2, 3, bandwidth);
ethanharstad 2:581fad93a809 70 }
ethanharstad 2:581fad93a809 71
ethanharstad 2:581fad93a809 72 uint8_t MPU9150::getGyroFullScaleRange() {
ethanharstad 2:581fad93a809 73 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 74 i2c_.readBits(address_, MPU9150_RA_GYRO_CONFIG, 4, 2, &buf);
ethanharstad 2:581fad93a809 75 return buf;
ethanharstad 2:581fad93a809 76 }
ethanharstad 2:581fad93a809 77 void MPU9150::setGyroFullScaleRange(const uint8_t range) {
ethanharstad 2:581fad93a809 78 i2c_.writeBits(address_, MPU9150_RA_GYRO_CONFIG, 4, 2, range);
ethanharstad 2:581fad93a809 79 }
ethanharstad 2:581fad93a809 80
ethanharstad 2:581fad93a809 81 uint8_t MPU9150::getAccelFullScaleRange() {
ethanharstad 2:581fad93a809 82 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 83 i2c_.readBits(address_, MPU9150_RA_ACCEL_CONFIG, 4, 2, &buf);
ethanharstad 2:581fad93a809 84 return buf;
ethanharstad 2:581fad93a809 85 }
ethanharstad 2:581fad93a809 86 void MPU9150::setAccelFullScaleRange(const uint8_t range) {
ethanharstad 2:581fad93a809 87 i2c_.writeBits(address_, MPU9150_RA_ACCEL_CONFIG, 4, 2, range);
ethanharstad 2:581fad93a809 88 }
ethanharstad 2:581fad93a809 89
ethanharstad 2:581fad93a809 90 int16_t MPU9150::getAccelX() {
ethanharstad 2:581fad93a809 91 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 92 i2c_.readWord(address_, MPU9150_RA_ACCEL_XOUT_H, &buf);
ethanharstad 2:581fad93a809 93 return (int16_t)buf;
ethanharstad 2:581fad93a809 94 }
ethanharstad 2:581fad93a809 95 int16_t MPU9150::getAccelY() {
ethanharstad 2:581fad93a809 96 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 97 i2c_.readWord(address_, MPU9150_RA_ACCEL_YOUT_H, &buf);
ethanharstad 2:581fad93a809 98 return (int16_t)buf;
ethanharstad 2:581fad93a809 99 }
ethanharstad 2:581fad93a809 100 int16_t MPU9150::getAccelZ() {
ethanharstad 2:581fad93a809 101 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 102 i2c_.readWord(address_, MPU9150_RA_ACCEL_ZOUT_H, &buf);
ethanharstad 2:581fad93a809 103 return (int16_t)buf;
ethanharstad 2:581fad93a809 104 }
ethanharstad 2:581fad93a809 105
ethanharstad 2:581fad93a809 106 int16_t MPU9150::getTemp() {
ethanharstad 2:581fad93a809 107 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 108 i2c_.readWord(address_, MPU9150_RA_TEMP_OUT_H, &buf);
ethanharstad 2:581fad93a809 109 return (int16_t)buf;
ethanharstad 2:581fad93a809 110 }
ethanharstad 2:581fad93a809 111
ethanharstad 2:581fad93a809 112 int16_t MPU9150::getGyroX() {
ethanharstad 2:581fad93a809 113 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 114 i2c_.readWord(address_, MPU9150_RA_GYRO_XOUT_H, &buf);
ethanharstad 2:581fad93a809 115 return (int16_t)buf;
ethanharstad 2:581fad93a809 116 }
ethanharstad 2:581fad93a809 117 int16_t MPU9150::getGyroY() {
ethanharstad 2:581fad93a809 118 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 119 i2c_.readWord(address_, MPU9150_RA_GYRO_YOUT_H, &buf);
ethanharstad 2:581fad93a809 120 return (int16_t)buf;
ethanharstad 2:581fad93a809 121 }
ethanharstad 2:581fad93a809 122 int16_t MPU9150::getGyroZ() {
ethanharstad 2:581fad93a809 123 uint16_t buf = 0xFFFF;
ethanharstad 2:581fad93a809 124 i2c_.readWord(address_, MPU9150_RA_GYRO_ZOUT_H, &buf);
ethanharstad 2:581fad93a809 125 return (int16_t)buf;
ethanharstad 2:581fad93a809 126 }
ethanharstad 2:581fad93a809 127
ethanharstad 2:581fad93a809 128 void MPU9150::resetGyroPath() {
ethanharstad 2:581fad93a809 129 i2c_.writeBit(address_, MPU9150_RA_SIGNAL_PATH_RESET, 2, 0x01);
ethanharstad 2:581fad93a809 130 }
ethanharstad 2:581fad93a809 131 void MPU9150::resetAccelPath() {
ethanharstad 2:581fad93a809 132 i2c_.writeBit(address_, MPU9150_RA_SIGNAL_PATH_RESET, 1, 0x01);
ethanharstad 2:581fad93a809 133 }
ethanharstad 2:581fad93a809 134 void MPU9150::resetTempPath() {
ethanharstad 2:581fad93a809 135 i2c_.writeBit(address_, MPU9150_RA_SIGNAL_PATH_RESET, 0, 0x01);
ethanharstad 2:581fad93a809 136 }
ethanharstad 2:581fad93a809 137
ethanharstad 2:581fad93a809 138 bool MPU9150::getFifoEnabled() {
ethanharstad 2:581fad93a809 139 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 140 i2c_.readBit(address_, MPU9150_RA_USER_CTRL, 6, &buf);
ethanharstad 2:581fad93a809 141 return (bool)buf;
ethanharstad 2:581fad93a809 142 }
ethanharstad 2:581fad93a809 143 void MPU9150::setFifoEnabled(const bool fifo) {
ethanharstad 2:581fad93a809 144 i2c_.writeBit(address_, MPU9150_RA_USER_CTRL, 6, fifo);
ethanharstad 2:581fad93a809 145 }
ethanharstad 2:581fad93a809 146 bool MPU9150::getI2CMasterEnabled() {
ethanharstad 2:581fad93a809 147 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 148 i2c_.readBit(address_, MPU9150_RA_USER_CTRL, 5, &buf);
ethanharstad 2:581fad93a809 149 return (bool)buf;
ethanharstad 2:581fad93a809 150 }
ethanharstad 2:581fad93a809 151 void MPU9150::setI2CMasterEnabled(const bool master) {
ethanharstad 2:581fad93a809 152 i2c_.writeBit(address_, MPU9150_RA_USER_CTRL, 5, master);
ethanharstad 2:581fad93a809 153 }
ethanharstad 2:581fad93a809 154 void MPU9150::resetFifo() {
ethanharstad 2:581fad93a809 155 i2c_.writeBit(address_, MPU9150_RA_USER_CTRL, 2, 0x01);
ethanharstad 2:581fad93a809 156 }
ethanharstad 2:581fad93a809 157 void MPU9150::resetI2CMaster() {
ethanharstad 2:581fad93a809 158 i2c_.writeBit(address_, MPU9150_RA_USER_CTRL, 1, 0x01);
ethanharstad 2:581fad93a809 159 }
ethanharstad 2:581fad93a809 160 void MPU9150::resetSensors() {
ethanharstad 2:581fad93a809 161 i2c_.writeBit(address_, MPU9150_RA_USER_CTRL, 0, 0x01);
ethanharstad 2:581fad93a809 162 }
ethanharstad 2:581fad93a809 163
ethanharstad 2:581fad93a809 164 void MPU9150::reset() {
ethanharstad 2:581fad93a809 165 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_1, 7, 0x01);
ethanharstad 2:581fad93a809 166 }
ethanharstad 2:581fad93a809 167 bool MPU9150::getSleepEnabled() {
ethanharstad 2:581fad93a809 168 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 169 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_1, 6, &buf);
ethanharstad 2:581fad93a809 170 return (bool)buf;
ethanharstad 2:581fad93a809 171 }
ethanharstad 2:581fad93a809 172 void MPU9150::setSleepEnabled(const bool sleep) {
ethanharstad 2:581fad93a809 173 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_1, 6, sleep);
ethanharstad 2:581fad93a809 174 }
ethanharstad 2:581fad93a809 175 bool MPU9150::getCycleEnabled() {
ethanharstad 2:581fad93a809 176 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 177 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_1, 5, &buf);
ethanharstad 2:581fad93a809 178 return (bool)buf;
ethanharstad 2:581fad93a809 179 }
ethanharstad 2:581fad93a809 180 void MPU9150::setCycleEnabled(const bool cycle) {
ethanharstad 2:581fad93a809 181 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_1, 5, cycle);
ethanharstad 2:581fad93a809 182 }
ethanharstad 2:581fad93a809 183 bool MPU9150::getTempEnabled() {
ethanharstad 2:581fad93a809 184 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 185 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_1, 3, &buf);
ethanharstad 2:581fad93a809 186 return (bool)buf;
ethanharstad 2:581fad93a809 187 }
ethanharstad 2:581fad93a809 188 void MPU9150::setTempEnabled(const bool temp) {
ethanharstad 2:581fad93a809 189 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_1, 3, temp);
ethanharstad 2:581fad93a809 190 }
ethanharstad 2:581fad93a809 191 uint8_t MPU9150::getClockSource() {
ethanharstad 2:581fad93a809 192 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 193 i2c_.readBits(address_, MPU9150_RA_PWR_MGMT_1, 2, 3, &buf);
ethanharstad 2:581fad93a809 194 return buf;
ethanharstad 2:581fad93a809 195 }
ethanharstad 2:581fad93a809 196 void MPU9150::setClockSource(const uint8_t source) {
ethanharstad 2:581fad93a809 197 i2c_.writeBits(address_, MPU9150_RA_PWR_MGMT_1, 2, 3, source);
ethanharstad 2:581fad93a809 198 }
ethanharstad 2:581fad93a809 199
ethanharstad 2:581fad93a809 200 uint8_t MPU9150::getCycleFrequency() {
ethanharstad 2:581fad93a809 201 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 202 i2c_.readBits(address_, MPU9150_RA_PWR_MGMT_2, 7, 2, &buf);
ethanharstad 2:581fad93a809 203 return buf;
ethanharstad 2:581fad93a809 204 }
ethanharstad 2:581fad93a809 205 void MPU9150::setCycleFrequency(const uint8_t frequency) {
ethanharstad 2:581fad93a809 206 i2c_.writeBits(address_, MPU9150_RA_PWR_MGMT_2, 7, 2, frequency);
ethanharstad 2:581fad93a809 207 }
ethanharstad 2:581fad93a809 208 bool MPU9150::getStandbyAccelXEnabled() {
ethanharstad 2:581fad93a809 209 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 210 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 5, &buf);
ethanharstad 2:581fad93a809 211 return (bool)buf;
ethanharstad 2:581fad93a809 212 }
ethanharstad 2:581fad93a809 213 void MPU9150::setStandbyAccelXEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 214 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 5, enabled);
ethanharstad 2:581fad93a809 215 }
ethanharstad 2:581fad93a809 216 bool MPU9150::getStandbyAccelYEnabled() {
ethanharstad 2:581fad93a809 217 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 218 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 4, &buf);
ethanharstad 2:581fad93a809 219 return (bool)buf;
ethanharstad 2:581fad93a809 220 }
ethanharstad 2:581fad93a809 221 void MPU9150::setStandbyAccelYEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 222 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 4, enabled);
ethanharstad 2:581fad93a809 223 }
ethanharstad 2:581fad93a809 224 bool MPU9150::getStandbyAccelZEnabled() {
ethanharstad 2:581fad93a809 225 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 226 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 3, &buf);
ethanharstad 2:581fad93a809 227 return (bool)buf;
ethanharstad 2:581fad93a809 228 }
ethanharstad 2:581fad93a809 229 void MPU9150::setStandbyAccelZEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 230 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 3, enabled);
ethanharstad 2:581fad93a809 231 }
ethanharstad 2:581fad93a809 232 bool MPU9150::getStandbyGyroXEnabled() {
ethanharstad 2:581fad93a809 233 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 234 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 2, &buf);
ethanharstad 2:581fad93a809 235 return (bool)buf;
ethanharstad 2:581fad93a809 236 }
ethanharstad 2:581fad93a809 237 void MPU9150::setStandbyGyroXEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 238 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 2, enabled);
ethanharstad 2:581fad93a809 239 }
ethanharstad 2:581fad93a809 240 bool MPU9150::getStandbyGyroYEnabled() {
ethanharstad 2:581fad93a809 241 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 242 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 1, &buf);
ethanharstad 2:581fad93a809 243 return (bool)buf;
ethanharstad 2:581fad93a809 244 }
ethanharstad 2:581fad93a809 245 void MPU9150::setStandbyGyroYEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 246 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 1, enabled);
ethanharstad 2:581fad93a809 247 }
ethanharstad 2:581fad93a809 248 bool MPU9150::getStandbyGyroZEnabled() {
ethanharstad 2:581fad93a809 249 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 250 i2c_.readBit(address_, MPU9150_RA_PWR_MGMT_2, 0, &buf);
ethanharstad 2:581fad93a809 251 return (bool)buf;
ethanharstad 2:581fad93a809 252 }
ethanharstad 2:581fad93a809 253 void MPU9150::setStandbyGyroZEnabled(const bool enabled) {
ethanharstad 2:581fad93a809 254 i2c_.writeBit(address_, MPU9150_RA_PWR_MGMT_2, 0, enabled);
ethanharstad 2:581fad93a809 255 }
ethanharstad 2:581fad93a809 256
ethanharstad 2:581fad93a809 257 uint8_t MPU9150::getDeviceID() {
ethanharstad 2:581fad93a809 258 uint8_t buf = 0xFF;
ethanharstad 2:581fad93a809 259 i2c_.readBits(address_, MPU9150_RA_WHO_AM_I, 6, 6, &buf);
ethanharstad 2:581fad93a809 260 return buf;
ethanharstad 2:581fad93a809 261 }