Forked from Aaron Berk's ITG3200 driver class library, customized for my specific application using 9DoF-Stick by Sparkfun.

Dependents:   HARP

Fork of ITG3200 by Aaron Berk

ITG-3200 is triple axis, digital interface, gyro sensor.

This library is forked from Aaron Berk's work.

This library is for specific application using 9DoF-Stick.

Datasheet:

http://invensense.com/mems/gyro/documents/PS-ITG-3200-00-01.4.pdf

This library has a feature to correct thermal drift of the device. For details, see Thermal Drift.

ITG-3200は3軸のデジタルインターフェースを備えたジャイロセンサです。

このライブラリは 9DoF-Stick を使用した特定の企画のために保守しています。

mbed IDEが日本語をサポートするまでは英語でコメントを書いていきますが、サポートした後もきっと英語で書いていくでしょう。

このライブラリはデバイスの熱ドリフトを補正する機能を持っています。詳しくは Thermal Drift

Revision:
2:f44a902ba081
Parent:
1:9bef044f45ad
Child:
3:eea9733ca427
--- a/ITG3200.cpp	Tue Sep 11 16:56:23 2012 +0000
+++ b/ITG3200.cpp	Wed Sep 12 11:36:48 2012 +0000
@@ -201,12 +201,18 @@
     char tx = TEMP_OUT_H_REG;
     char rx[2];
     
-    i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    i2c_.write(I2C_ADDRESS, &tx, 1);
+    
+    i2c_.read(I2C_ADDRESS, rx, 2);
     
-    i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
-    
-    return int16_t((uint16_t(rx[0]) << 8) | uint16_t(rx[1]));
-    
+    // Readings are expressed in 16bit 2's complement, so we must first
+    // concatenate two bytes to make a word and sign extend it to obtain
+    // correct negative values.
+    // ARMCC compiles char as unsigned, which means no sign extension is
+    // performed during bitwise operations to chars. But we should make sure
+    // that lower byte won't extend its sign past upper byte for other
+    // compilers if we want to keep it portable.
+    return int16_t(((unsigned)rx[0] << 8) | (unsigned)rx[1]);
 }
 
 float ITG3200::getTemperature(){
@@ -270,7 +276,7 @@
     i2c_.read(I2C_ADDRESS, rx, 6);
     
     for(int i = 0; i < 3; i++)
-        readings[i] = int16_t((int) rx[i * 2 + 0] << 8) | ((int) rx[i * 2 + 1]);
+        readings[i] = int16_t((unsigned) rx[i * 2 + 0] << 8) | ((unsigned) rx[i * 2 + 1]);
 }
 
 char ITG3200::getPowerManagement(void){