i2c driver for ITG3200 gyroscope sensor

Dependents:   m3Dpi

Fork of ITG3200 by Aaron Berk

Committer:
sillevl
Date:
Sat Dec 19 10:41:01 2015 +0000
Revision:
3:2dd53a8427e9
Parent:
1:f27e66e954dd
add constructor that accepts I2C object

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
sillevl 3:2dd53a8427e9 40 ITG3200::ITG3200(I2C &i2c) : i2c_(i2c) {
sillevl 3:2dd53a8427e9 41 initialize();
sillevl 3:2dd53a8427e9 42 }
sillevl 3:2dd53a8427e9 43
aberk 0:b098d99dd81e 44 ITG3200::ITG3200(PinName sda, PinName scl) : i2c_(sda, scl) {
aberk 0:b098d99dd81e 45 //400kHz, fast mode.
sillevl 1:f27e66e954dd 46 //i2c_.frequency(400000);
aberk 0:b098d99dd81e 47
sillevl 3:2dd53a8427e9 48 initialize();
sillevl 3:2dd53a8427e9 49 }
sillevl 3:2dd53a8427e9 50
sillevl 3:2dd53a8427e9 51 void ITG3200::initialize(){
aberk 0:b098d99dd81e 52 //Set FS_SEL to 0x03 for proper operation.
aberk 0:b098d99dd81e 53 //See datasheet for details.
aberk 0:b098d99dd81e 54 char tx[2];
aberk 0:b098d99dd81e 55 tx[0] = DLPF_FS_REG;
aberk 0:b098d99dd81e 56 //FS_SEL bits sit in bits 4 and 3 of DLPF_FS register.
aberk 0:b098d99dd81e 57 tx[1] = 0x03 << 3;
aberk 0:b098d99dd81e 58
sillevl 3:2dd53a8427e9 59 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 60 }
aberk 0:b098d99dd81e 61
aberk 0:b098d99dd81e 62 char ITG3200::getWhoAmI(void){
aberk 0:b098d99dd81e 63
aberk 0:b098d99dd81e 64 //WhoAmI Register address.
aberk 0:b098d99dd81e 65 char tx = WHO_AM_I_REG;
aberk 0:b098d99dd81e 66 char rx;
aberk 0:b098d99dd81e 67
aberk 0:b098d99dd81e 68 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 69
aberk 0:b098d99dd81e 70 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 71
aberk 0:b098d99dd81e 72 return rx;
aberk 0:b098d99dd81e 73
aberk 0:b098d99dd81e 74 }
aberk 0:b098d99dd81e 75
aberk 0:b098d99dd81e 76 void ITG3200::setWhoAmI(char address){
aberk 0:b098d99dd81e 77
aberk 0:b098d99dd81e 78 char tx[2];
aberk 0:b098d99dd81e 79 tx[0] = WHO_AM_I_REG;
aberk 0:b098d99dd81e 80 tx[1] = address;
aberk 0:b098d99dd81e 81
aberk 0:b098d99dd81e 82 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 83
aberk 0:b098d99dd81e 84 }
aberk 0:b098d99dd81e 85
aberk 0:b098d99dd81e 86 char ITG3200::getSampleRateDivider(void){
aberk 0:b098d99dd81e 87
aberk 0:b098d99dd81e 88 char tx = SMPLRT_DIV_REG;
aberk 0:b098d99dd81e 89 char rx;
aberk 0:b098d99dd81e 90
aberk 0:b098d99dd81e 91 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 92
aberk 0:b098d99dd81e 93 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 94
aberk 0:b098d99dd81e 95 return rx;
aberk 0:b098d99dd81e 96
aberk 0:b098d99dd81e 97 }
aberk 0:b098d99dd81e 98
aberk 0:b098d99dd81e 99 void ITG3200::setSampleRateDivider(char divider){
aberk 0:b098d99dd81e 100
aberk 0:b098d99dd81e 101 char tx[2];
aberk 0:b098d99dd81e 102 tx[0] = SMPLRT_DIV_REG;
aberk 0:b098d99dd81e 103 tx[1] = divider;
aberk 0:b098d99dd81e 104
aberk 0:b098d99dd81e 105 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 106
aberk 0:b098d99dd81e 107 }
aberk 0:b098d99dd81e 108
aberk 0:b098d99dd81e 109 int ITG3200::getInternalSampleRate(void){
aberk 0:b098d99dd81e 110
aberk 0:b098d99dd81e 111 char tx = DLPF_FS_REG;
aberk 0:b098d99dd81e 112 char rx;
aberk 0:b098d99dd81e 113
aberk 0:b098d99dd81e 114 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 115
aberk 0:b098d99dd81e 116 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 117
aberk 0:b098d99dd81e 118 //DLPF_CFG == 0 -> sample rate = 8kHz.
aberk 0:b098d99dd81e 119 if(rx == 0){
aberk 0:b098d99dd81e 120 return 8;
aberk 0:b098d99dd81e 121 }
aberk 0:b098d99dd81e 122 //DLPF_CFG = 1..7 -> sample rate = 1kHz.
aberk 0:b098d99dd81e 123 else if(rx >= 1 && rx <= 7){
aberk 0:b098d99dd81e 124 return 1;
aberk 0:b098d99dd81e 125 }
aberk 0:b098d99dd81e 126 //DLPF_CFG = anything else -> something's wrong!
aberk 0:b098d99dd81e 127 else{
aberk 0:b098d99dd81e 128 return -1;
aberk 0:b098d99dd81e 129 }
aberk 0:b098d99dd81e 130
aberk 0:b098d99dd81e 131 }
aberk 0:b098d99dd81e 132
aberk 0:b098d99dd81e 133 void ITG3200::setLpBandwidth(char bandwidth){
aberk 0:b098d99dd81e 134
aberk 0:b098d99dd81e 135 char tx[2];
aberk 0:b098d99dd81e 136 tx[0] = DLPF_FS_REG;
aberk 0:b098d99dd81e 137 //Bits 4,3 are required to be 0x03 for proper operation.
aberk 0:b098d99dd81e 138 tx[1] = bandwidth | (0x03 << 3);
aberk 0:b098d99dd81e 139
aberk 0:b098d99dd81e 140 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 141
aberk 0:b098d99dd81e 142 }
aberk 0:b098d99dd81e 143
aberk 0:b098d99dd81e 144 char ITG3200::getInterruptConfiguration(void){
aberk 0:b098d99dd81e 145
aberk 0:b098d99dd81e 146 char tx = INT_CFG_REG;
aberk 0:b098d99dd81e 147 char rx;
aberk 0:b098d99dd81e 148
aberk 0:b098d99dd81e 149 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 150
aberk 0:b098d99dd81e 151 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 152
aberk 0:b098d99dd81e 153 return rx;
aberk 0:b098d99dd81e 154
aberk 0:b098d99dd81e 155 }
aberk 0:b098d99dd81e 156
aberk 0:b098d99dd81e 157 void ITG3200::setInterruptConfiguration(char config){
aberk 0:b098d99dd81e 158
aberk 0:b098d99dd81e 159 char tx[2];
aberk 0:b098d99dd81e 160 tx[0] = INT_CFG_REG;
aberk 0:b098d99dd81e 161 tx[1] = config;
aberk 0:b098d99dd81e 162
aberk 0:b098d99dd81e 163 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 164
aberk 0:b098d99dd81e 165 }
aberk 0:b098d99dd81e 166
aberk 0:b098d99dd81e 167 bool ITG3200::isPllReady(void){
aberk 0:b098d99dd81e 168
aberk 0:b098d99dd81e 169 char tx = INT_STATUS;
aberk 0:b098d99dd81e 170 char rx;
aberk 0:b098d99dd81e 171
aberk 0:b098d99dd81e 172 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 173
aberk 0:b098d99dd81e 174 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 175
aberk 0:b098d99dd81e 176 //ITG_RDY bit is bit 4 of INT_STATUS register.
aberk 0:b098d99dd81e 177 if(rx & 0x04){
aberk 0:b098d99dd81e 178 return true;
aberk 0:b098d99dd81e 179 }
aberk 0:b098d99dd81e 180 else{
aberk 0:b098d99dd81e 181 return false;
aberk 0:b098d99dd81e 182 }
aberk 0:b098d99dd81e 183
aberk 0:b098d99dd81e 184 }
aberk 0:b098d99dd81e 185
aberk 0:b098d99dd81e 186 bool ITG3200::isRawDataReady(void){
aberk 0:b098d99dd81e 187
aberk 0:b098d99dd81e 188 char tx = INT_STATUS;
aberk 0:b098d99dd81e 189 char rx;
aberk 0:b098d99dd81e 190
aberk 0:b098d99dd81e 191 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 192
aberk 0:b098d99dd81e 193 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 194
aberk 0:b098d99dd81e 195 //RAW_DATA_RDY bit is bit 1 of INT_STATUS register.
aberk 0:b098d99dd81e 196 if(rx & 0x01){
aberk 0:b098d99dd81e 197 return true;
aberk 0:b098d99dd81e 198 }
aberk 0:b098d99dd81e 199 else{
aberk 0:b098d99dd81e 200 return false;
aberk 0:b098d99dd81e 201 }
aberk 0:b098d99dd81e 202
aberk 0:b098d99dd81e 203 }
aberk 0:b098d99dd81e 204
aberk 0:b098d99dd81e 205 float ITG3200::getTemperature(void){
aberk 0:b098d99dd81e 206
aberk 0:b098d99dd81e 207 char tx = TEMP_OUT_H_REG;
aberk 0:b098d99dd81e 208 char rx[2];
aberk 0:b098d99dd81e 209
aberk 0:b098d99dd81e 210 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 211
aberk 0:b098d99dd81e 212 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 213
aberk 0:b098d99dd81e 214 int16_t temperature = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 215 //Offset = -35 degrees, 13200 counts. 280 counts/degrees C.
aberk 0:b098d99dd81e 216 return 35.0 + ((temperature + 13200)/280.0);
aberk 0:b098d99dd81e 217
aberk 0:b098d99dd81e 218 }
aberk 0:b098d99dd81e 219
aberk 0:b098d99dd81e 220 int ITG3200::getGyroX(void){
aberk 0:b098d99dd81e 221
aberk 0:b098d99dd81e 222 char tx = GYRO_XOUT_H_REG;
aberk 0:b098d99dd81e 223 char rx[2];
aberk 0:b098d99dd81e 224
aberk 0:b098d99dd81e 225 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 226
aberk 0:b098d99dd81e 227 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 228
aberk 0:b098d99dd81e 229 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 230
aberk 0:b098d99dd81e 231 return output;
aberk 0:b098d99dd81e 232
aberk 0:b098d99dd81e 233 }
aberk 0:b098d99dd81e 234
aberk 0:b098d99dd81e 235 int ITG3200::getGyroY(void){
aberk 0:b098d99dd81e 236
aberk 0:b098d99dd81e 237 char tx = GYRO_YOUT_H_REG;
aberk 0:b098d99dd81e 238 char rx[2];
aberk 0:b098d99dd81e 239
aberk 0:b098d99dd81e 240 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 241
aberk 0:b098d99dd81e 242 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 243
aberk 0:b098d99dd81e 244 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 245
aberk 0:b098d99dd81e 246 return output;
aberk 0:b098d99dd81e 247
aberk 0:b098d99dd81e 248 }
aberk 0:b098d99dd81e 249
aberk 0:b098d99dd81e 250 int ITG3200::getGyroZ(void){
aberk 0:b098d99dd81e 251
aberk 0:b098d99dd81e 252 char tx = GYRO_ZOUT_H_REG;
aberk 0:b098d99dd81e 253 char rx[2];
aberk 0:b098d99dd81e 254
aberk 0:b098d99dd81e 255 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 256
aberk 0:b098d99dd81e 257 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
aberk 0:b098d99dd81e 258
aberk 0:b098d99dd81e 259 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
aberk 0:b098d99dd81e 260
aberk 0:b098d99dd81e 261 return output;
aberk 0:b098d99dd81e 262
aberk 0:b098d99dd81e 263 }
aberk 0:b098d99dd81e 264
aberk 0:b098d99dd81e 265 char ITG3200::getPowerManagement(void){
aberk 0:b098d99dd81e 266
aberk 0:b098d99dd81e 267 char tx = PWR_MGM_REG;
aberk 0:b098d99dd81e 268 char rx;
aberk 0:b098d99dd81e 269
aberk 0:b098d99dd81e 270 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
aberk 0:b098d99dd81e 271
aberk 0:b098d99dd81e 272 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
aberk 0:b098d99dd81e 273
aberk 0:b098d99dd81e 274 return rx;
aberk 0:b098d99dd81e 275
aberk 0:b098d99dd81e 276 }
aberk 0:b098d99dd81e 277
aberk 0:b098d99dd81e 278 void ITG3200::setPowerManagement(char config){
aberk 0:b098d99dd81e 279
aberk 0:b098d99dd81e 280 char tx[2];
aberk 0:b098d99dd81e 281 tx[0] = PWR_MGM_REG;
aberk 0:b098d99dd81e 282 tx[1] = config;
aberk 0:b098d99dd81e 283
aberk 0:b098d99dd81e 284 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
aberk 0:b098d99dd81e 285
aberk 0:b098d99dd81e 286 }