Library to communicate with a ST LIS331DLH

Revision:
2:d4b810a888b5
Parent:
1:02c1f5bb1c90
Child:
3:147d95b7a525
--- a/LIS331.cpp	Sat Nov 13 00:01:57 2010 +0000
+++ b/LIS331.cpp	Wed Nov 17 18:29:47 2010 +0000
@@ -1,152 +1,161 @@
-/**
- * @section LICENSE
- *
- *
- * @section DESCRIPTION
- *
- * LIS331 triple axis, digital interface, accelerometer.
- * Based off Aaron Berk's ITG3200 Gyro Library 
- *
- * Datasheet:
- *
- * http://www.st.com/stonline/products/literature/ds/13951.pdf
- */
-
-/**
- * Includes
- */
- 
-#include "LIS331.h"
-
-LIS331::LIS331(PinName sda, PinName scl) : i2c_(sda, scl) {
-
-    //400kHz, fast mode.
-    i2c_.frequency(400000);
-    
-    
-    //Power Up Device, Set Output data rate, Enable All 3 Axis
-    //See datasheet for details.
-    char tx[2];
-    tx[0] = CTRL_REG_1;
-    //CTRL_REG_1 [00111111] / [0x3F] to power up, set output rate to 1000Hz, and enable all 3 axis.
-    tx[1] = 0x3F;
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
-    
-}
-
-char LIS331::getWhoAmI(void){
-
-    //WhoAmI Register address.
-    char tx = WHO_AM_I_REG;
-    char rx;
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
-    
-    return rx;
-
-}
-
-
-
-
-void LIS331::setPowerMode(char power_mode){
-// Currently sets all 3 axis to enabled. Will be set to preserve existing status in future
-    char tx[2];
-    tx[0] = CTRL_REG_1;
-    tx[1] = power_mode;
-
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
-
-}
-
-char LIS331::getPowerMode(void){
-
-    char tx = CTRL_REG_1;
-    char rx;
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
-
-    
-    return rx;
-
-}
-
-
-
-char LIS331::getInterruptConfiguration(void){
-
-    char tx = CTRL_REG_3;
-    char rx;
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
-    
-    return rx;
-
-}
-
-
-
-char LIS331::getAccelStatus(void){
-
-    char tx = STATUS_REG;
-    char rx;
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
-    
-    return rx;
-}
-
-
-
-int LIS331::getAccelX(void){
-
-    char tx = ACCEL_XOUT_H_REG;
-    char rx[2];
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
-    
-    int16_t output = ((int) rx[1] << 8) | ((int) rx[0]);
-
-    return output;
-
-}
-
-int LIS331::getAccelY(void){
-
-    char tx = ACCEL_YOUT_H_REG;
-    char rx[2];
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
-    
-    int16_t output = ((int) rx[1] << 8) | ((int) rx[0]);
-
-    return output;
-
-}
-
-int LIS331::getAccelZ(void){
-
-    char tx = ACCEL_ZOUT_H_REG;
-    char rx[2];
-    
-    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
-    
-    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
-    
-    int16_t output = ((int) rx[1] << 8) | ((int) rx[0]);
-
-    return output;
+/**
+ * @section LICENSE
+ *
+ *
+ * @section DESCRIPTION
+ *
+ * LIS331 triple axis, digital interface, accelerometer.
+ * Based off Aaron Berk's ITG3200 Gyro Library 
+ *
+ * Datasheet:
+ *
+ * http://www.st.com/stonline/products/literature/ds/13951.pdf
+ */
+
+/**
+ * Includes
+ */
+ 
+#include "LIS331.h"
+
+LIS331::LIS331(PinName sda, PinName scl) : i2c_(sda, scl) {
+
+    //400kHz, fast mode.
+    i2c_.frequency(400000);
+    
+    
+    //Power Up Device, Set Output data rate, Enable All 3 Axis
+    //See datasheet for details.
+    char tx[2];
+    //char tx2[2];
+    //char rx[1];
+    tx[0] = CTRL_REG_1;
+    //CTRL_REG_1 [00111111] / [0x3F] to power up, set output rate to 1000Hz, and enable all 3 axis.
+    tx[1] = 0x3F;
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+    
+    // Set Big endian bit
+    //tx2[0] = CTRL_REG_4;
+    //i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx2, 1);   // Request control reg 4
+    //i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 1);        //Read control reg 4
+    //tx2[1] = rx[0] | 1<<7;                                         // Set bit 7
+    //i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx2, 2);
+    
+}
+
+char LIS331::getWhoAmI(void){
+
+    //WhoAmI Register address.
+    char tx = WHO_AM_I_REG;
+    char rx;
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+
+}
+
+
+
+
+void LIS331::setPowerMode(char power_mode){
+// Currently sets all 3 axis to enabled. Will be set to preserve existing status in future
+    char tx[2];
+    tx[0] = CTRL_REG_1;
+    tx[1] = power_mode;
+
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+
+}
+
+char LIS331::getPowerMode(void){
+
+    char tx = CTRL_REG_1;
+    char rx;
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+
+    
+    return rx;
+
+}
+
+
+
+char LIS331::getInterruptConfiguration(void){
+
+    char tx = CTRL_REG_3;
+    char rx;
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+
+}
+
+
+
+char LIS331::getAccelStatus(void){
+
+    char tx = STATUS_REG;
+    char rx;
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+}
+
+
+
+int LIS331::getAccelX(void){
+
+    char tx = ACCEL_XOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output;
+
+}
+
+int LIS331::getAccelY(void){
+
+    char tx = ACCEL_YOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output;
+
+}
+
+int LIS331::getAccelZ(void){
+
+    char tx = ACCEL_ZOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output;
 }
\ No newline at end of file