Driver for ITG3200 gyro

Dependents:   Seeed_Grove_Digital_Gyro Seeed_Grove_Digital_Gyro_ben mbed_websocket_client_for_gyro_and_3_Axio mbed_websocket_client_for_gyro

Fork of ITG3200 by Aaron Berk

Committer:
sam_grove
Date:
Fri Aug 15 23:43:39 2014 +0000
Revision:
1:ff0a59c5c2f7
Parent:
0:b098d99dd81e
Update constructor to take address as an argument but use original as the default if one isn't provided for backwards compatibility

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:b098d99dd81e 1 /**
aberk 0:b098d99dd81e 2 * @author Aaron Berk
aberk 0:b098d99dd81e 3 *
aberk 0:b098d99dd81e 4 * @section LICENSE
aberk 0:b098d99dd81e 5 *
aberk 0:b098d99dd81e 6 * Copyright (c) 2010 ARM Limited
aberk 0:b098d99dd81e 7 *
aberk 0:b098d99dd81e 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
aberk 0:b098d99dd81e 9 * of this software and associated documentation files (the "Software"), to deal
aberk 0:b098d99dd81e 10 * in the Software without restriction, including without limitation the rights
aberk 0:b098d99dd81e 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aberk 0:b098d99dd81e 12 * copies of the Software, and to permit persons to whom the Software is
aberk 0:b098d99dd81e 13 * furnished to do so, subject to the following conditions:
aberk 0:b098d99dd81e 14 *
aberk 0:b098d99dd81e 15 * The above copyright notice and this permission notice shall be included in
aberk 0:b098d99dd81e 16 * all copies or substantial portions of the Software.
aberk 0:b098d99dd81e 17 *
aberk 0:b098d99dd81e 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aberk 0:b098d99dd81e 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aberk 0:b098d99dd81e 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aberk 0:b098d99dd81e 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aberk 0:b098d99dd81e 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aberk 0:b098d99dd81e 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
aberk 0:b098d99dd81e 24 * THE SOFTWARE.
aberk 0:b098d99dd81e 25 *
aberk 0:b098d99dd81e 26 * @section DESCRIPTION
aberk 0:b098d99dd81e 27 *
aberk 0:b098d99dd81e 28 * ITG-3200 triple axis, digital interface, gyroscope.
aberk 0:b098d99dd81e 29 *
aberk 0:b098d99dd81e 30 * Datasheet:
aberk 0:b098d99dd81e 31 *
aberk 0:b098d99dd81e 32 * http://invensense.com/mems/gyro/documents/PS-ITG-3200-00-01.4.pdf
aberk 0:b098d99dd81e 33 */
aberk 0:b098d99dd81e 34
aberk 0:b098d99dd81e 35 /**
aberk 0:b098d99dd81e 36 * Includes
aberk 0:b098d99dd81e 37 */
aberk 0:b098d99dd81e 38 #include "ITG3200.h"
aberk 0:b098d99dd81e 39
sam_grove 1:ff0a59c5c2f7 40 ITG3200::ITG3200(PinName sda, PinName scl, uint8_t address) : i2c_(sda, scl) {
aberk 0:b098d99dd81e 41
aberk 0:b098d99dd81e 42 //400kHz, fast mode.
aberk 0:b098d99dd81e 43 i2c_.frequency(400000);
sam_grove 1:ff0a59c5c2f7 44 ITG3200_I2C_ADDRESS = address;
aberk 0:b098d99dd81e 45 //Set FS_SEL to 0x03 for proper operation.
aberk 0:b098d99dd81e 46 //See datasheet for details.
aberk 0:b098d99dd81e 47 char tx[2];
aberk 0:b098d99dd81e 48 tx[0] = DLPF_FS_REG;
aberk 0:b098d99dd81e 49 //FS_SEL bits sit in bits 4 and 3 of DLPF_FS register.
aberk 0:b098d99dd81e 50 tx[1] = 0x03 << 3;
aberk 0:b098d99dd81e 51
aberk 0:b098d99dd81e 52 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 53
aberk 0:b098d99dd81e 54 }
aberk 0:b098d99dd81e 55
aberk 0:b098d99dd81e 56 char ITG3200::getWhoAmI(void){
aberk 0:b098d99dd81e 57
aberk 0:b098d99dd81e 58 //WhoAmI Register address.
aberk 0:b098d99dd81e 59 char tx = WHO_AM_I_REG;
aberk 0:b098d99dd81e 60 char rx;
aberk 0:b098d99dd81e 61
aberk 0:b098d99dd81e 62 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 63
aberk 0:b098d99dd81e 64 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 65
aberk 0:b098d99dd81e 66 return rx;
aberk 0:b098d99dd81e 67
aberk 0:b098d99dd81e 68 }
aberk 0:b098d99dd81e 69
aberk 0:b098d99dd81e 70 void ITG3200::setWhoAmI(char address){
aberk 0:b098d99dd81e 71
aberk 0:b098d99dd81e 72 char tx[2];
aberk 0:b098d99dd81e 73 tx[0] = WHO_AM_I_REG;
aberk 0:b098d99dd81e 74 tx[1] = address;
aberk 0:b098d99dd81e 75
aberk 0:b098d99dd81e 76 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 77
aberk 0:b098d99dd81e 78 }
aberk 0:b098d99dd81e 79
aberk 0:b098d99dd81e 80 char ITG3200::getSampleRateDivider(void){
aberk 0:b098d99dd81e 81
aberk 0:b098d99dd81e 82 char tx = SMPLRT_DIV_REG;
aberk 0:b098d99dd81e 83 char rx;
aberk 0:b098d99dd81e 84
aberk 0:b098d99dd81e 85 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 86
aberk 0:b098d99dd81e 87 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 88
aberk 0:b098d99dd81e 89 return rx;
aberk 0:b098d99dd81e 90
aberk 0:b098d99dd81e 91 }
aberk 0:b098d99dd81e 92
aberk 0:b098d99dd81e 93 void ITG3200::setSampleRateDivider(char divider){
aberk 0:b098d99dd81e 94
aberk 0:b098d99dd81e 95 char tx[2];
aberk 0:b098d99dd81e 96 tx[0] = SMPLRT_DIV_REG;
aberk 0:b098d99dd81e 97 tx[1] = divider;
aberk 0:b098d99dd81e 98
aberk 0:b098d99dd81e 99 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 100
aberk 0:b098d99dd81e 101 }
aberk 0:b098d99dd81e 102
aberk 0:b098d99dd81e 103 int ITG3200::getInternalSampleRate(void){
aberk 0:b098d99dd81e 104
aberk 0:b098d99dd81e 105 char tx = DLPF_FS_REG;
aberk 0:b098d99dd81e 106 char rx;
aberk 0:b098d99dd81e 107
aberk 0:b098d99dd81e 108 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 109
aberk 0:b098d99dd81e 110 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 111
aberk 0:b098d99dd81e 112 //DLPF_CFG == 0 -> sample rate = 8kHz.
aberk 0:b098d99dd81e 113 if(rx == 0){
aberk 0:b098d99dd81e 114 return 8;
aberk 0:b098d99dd81e 115 }
aberk 0:b098d99dd81e 116 //DLPF_CFG = 1..7 -> sample rate = 1kHz.
aberk 0:b098d99dd81e 117 else if(rx >= 1 && rx <= 7){
aberk 0:b098d99dd81e 118 return 1;
aberk 0:b098d99dd81e 119 }
aberk 0:b098d99dd81e 120 //DLPF_CFG = anything else -> something's wrong!
aberk 0:b098d99dd81e 121 else{
aberk 0:b098d99dd81e 122 return -1;
aberk 0:b098d99dd81e 123 }
aberk 0:b098d99dd81e 124
aberk 0:b098d99dd81e 125 }
aberk 0:b098d99dd81e 126
aberk 0:b098d99dd81e 127 void ITG3200::setLpBandwidth(char bandwidth){
aberk 0:b098d99dd81e 128
aberk 0:b098d99dd81e 129 char tx[2];
aberk 0:b098d99dd81e 130 tx[0] = DLPF_FS_REG;
aberk 0:b098d99dd81e 131 //Bits 4,3 are required to be 0x03 for proper operation.
aberk 0:b098d99dd81e 132 tx[1] = bandwidth | (0x03 << 3);
aberk 0:b098d99dd81e 133
aberk 0:b098d99dd81e 134 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 135
aberk 0:b098d99dd81e 136 }
aberk 0:b098d99dd81e 137
aberk 0:b098d99dd81e 138 char ITG3200::getInterruptConfiguration(void){
aberk 0:b098d99dd81e 139
aberk 0:b098d99dd81e 140 char tx = INT_CFG_REG;
aberk 0:b098d99dd81e 141 char rx;
aberk 0:b098d99dd81e 142
aberk 0:b098d99dd81e 143 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 144
aberk 0:b098d99dd81e 145 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 146
aberk 0:b098d99dd81e 147 return rx;
aberk 0:b098d99dd81e 148
aberk 0:b098d99dd81e 149 }
aberk 0:b098d99dd81e 150
aberk 0:b098d99dd81e 151 void ITG3200::setInterruptConfiguration(char config){
aberk 0:b098d99dd81e 152
aberk 0:b098d99dd81e 153 char tx[2];
aberk 0:b098d99dd81e 154 tx[0] = INT_CFG_REG;
aberk 0:b098d99dd81e 155 tx[1] = config;
aberk 0:b098d99dd81e 156
aberk 0:b098d99dd81e 157 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 158
aberk 0:b098d99dd81e 159 }
aberk 0:b098d99dd81e 160
aberk 0:b098d99dd81e 161 bool ITG3200::isPllReady(void){
aberk 0:b098d99dd81e 162
aberk 0:b098d99dd81e 163 char tx = INT_STATUS;
aberk 0:b098d99dd81e 164 char rx;
aberk 0:b098d99dd81e 165
aberk 0:b098d99dd81e 166 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 167
aberk 0:b098d99dd81e 168 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 169
aberk 0:b098d99dd81e 170 //ITG_RDY bit is bit 4 of INT_STATUS register.
aberk 0:b098d99dd81e 171 if(rx & 0x04){
aberk 0:b098d99dd81e 172 return true;
aberk 0:b098d99dd81e 173 }
aberk 0:b098d99dd81e 174 else{
aberk 0:b098d99dd81e 175 return false;
aberk 0:b098d99dd81e 176 }
aberk 0:b098d99dd81e 177
aberk 0:b098d99dd81e 178 }
aberk 0:b098d99dd81e 179
aberk 0:b098d99dd81e 180 bool ITG3200::isRawDataReady(void){
aberk 0:b098d99dd81e 181
aberk 0:b098d99dd81e 182 char tx = INT_STATUS;
aberk 0:b098d99dd81e 183 char rx;
aberk 0:b098d99dd81e 184
aberk 0:b098d99dd81e 185 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 186
aberk 0:b098d99dd81e 187 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 188
aberk 0:b098d99dd81e 189 //RAW_DATA_RDY bit is bit 1 of INT_STATUS register.
aberk 0:b098d99dd81e 190 if(rx & 0x01){
aberk 0:b098d99dd81e 191 return true;
aberk 0:b098d99dd81e 192 }
aberk 0:b098d99dd81e 193 else{
aberk 0:b098d99dd81e 194 return false;
aberk 0:b098d99dd81e 195 }
aberk 0:b098d99dd81e 196
aberk 0:b098d99dd81e 197 }
aberk 0:b098d99dd81e 198
aberk 0:b098d99dd81e 199 float ITG3200::getTemperature(void){
aberk 0:b098d99dd81e 200
aberk 0:b098d99dd81e 201 char tx = TEMP_OUT_H_REG;
aberk 0:b098d99dd81e 202 char rx[2];
aberk 0:b098d99dd81e 203
aberk 0:b098d99dd81e 204 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 205
aberk 0:b098d99dd81e 206 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 207
aberk 0:b098d99dd81e 208 int16_t temperature = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 209 //Offset = -35 degrees, 13200 counts. 280 counts/degrees C.
aberk 0:b098d99dd81e 210 return 35.0 + ((temperature + 13200)/280.0);
aberk 0:b098d99dd81e 211
aberk 0:b098d99dd81e 212 }
aberk 0:b098d99dd81e 213
aberk 0:b098d99dd81e 214 int ITG3200::getGyroX(void){
aberk 0:b098d99dd81e 215
aberk 0:b098d99dd81e 216 char tx = GYRO_XOUT_H_REG;
aberk 0:b098d99dd81e 217 char rx[2];
aberk 0:b098d99dd81e 218
aberk 0:b098d99dd81e 219 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 220
aberk 0:b098d99dd81e 221 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 222
aberk 0:b098d99dd81e 223 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 224
aberk 0:b098d99dd81e 225 return output;
aberk 0:b098d99dd81e 226
aberk 0:b098d99dd81e 227 }
aberk 0:b098d99dd81e 228
aberk 0:b098d99dd81e 229 int ITG3200::getGyroY(void){
aberk 0:b098d99dd81e 230
aberk 0:b098d99dd81e 231 char tx = GYRO_YOUT_H_REG;
aberk 0:b098d99dd81e 232 char rx[2];
aberk 0:b098d99dd81e 233
aberk 0:b098d99dd81e 234 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 235
aberk 0:b098d99dd81e 236 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 237
aberk 0:b098d99dd81e 238 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 239
aberk 0:b098d99dd81e 240 return output;
aberk 0:b098d99dd81e 241
aberk 0:b098d99dd81e 242 }
aberk 0:b098d99dd81e 243
aberk 0:b098d99dd81e 244 int ITG3200::getGyroZ(void){
aberk 0:b098d99dd81e 245
aberk 0:b098d99dd81e 246 char tx = GYRO_ZOUT_H_REG;
aberk 0:b098d99dd81e 247 char rx[2];
aberk 0:b098d99dd81e 248
aberk 0:b098d99dd81e 249 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 250
aberk 0:b098d99dd81e 251 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 252
aberk 0:b098d99dd81e 253 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 254
aberk 0:b098d99dd81e 255 return output;
aberk 0:b098d99dd81e 256
aberk 0:b098d99dd81e 257 }
aberk 0:b098d99dd81e 258
aberk 0:b098d99dd81e 259 char ITG3200::getPowerManagement(void){
aberk 0:b098d99dd81e 260
aberk 0:b098d99dd81e 261 char tx = PWR_MGM_REG;
aberk 0:b098d99dd81e 262 char rx;
aberk 0:b098d99dd81e 263
aberk 0:b098d99dd81e 264 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 265
aberk 0:b098d99dd81e 266 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 267
aberk 0:b098d99dd81e 268 return rx;
aberk 0:b098d99dd81e 269
aberk 0:b098d99dd81e 270 }
aberk 0:b098d99dd81e 271
aberk 0:b098d99dd81e 272 void ITG3200::setPowerManagement(char config){
aberk 0:b098d99dd81e 273
aberk 0:b098d99dd81e 274 char tx[2];
aberk 0:b098d99dd81e 275 tx[0] = PWR_MGM_REG;
aberk 0:b098d99dd81e 276 tx[1] = config;
aberk 0:b098d99dd81e 277
aberk 0:b098d99dd81e 278 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 279
aberk 0:b098d99dd81e 280 }