Dependents:   IMU DataLogger AcceptanceTest P4_IMU

Committer:
atommota
Date:
Fri Nov 12 23:40:58 2010 +0000
Revision:
0:03dd788f437f
updated version of ITG3200 library

Who changed what in which revision?

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