SCA3000 triple axis digital interface accelerometer

Files at this revision

API Documentation at this revision

Comitter:
aberk
Date:
Sun May 29 14:13:20 2011 +0000
Child:
1:f5f2e79304fb
Commit message:
Version 1.0

Changed in this revision

SCA3000.cpp Show annotated file Show diff for this revision Revisions of this file
SCA3000.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SCA3000.cpp	Sun May 29 14:13:20 2011 +0000
@@ -0,0 +1,165 @@
+/**
+ * @author Aaron Berk
+ *
+ * @section LICENSE
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @section DESCRIPTION
+ *
+ * SCA3000, triple axis, digital interface, accelerometer.
+ *
+ * Datasheet:
+ *
+ * http://www.sparkfun.com/datasheets/Sensors/Accelerometer/SCA3000-D01.pdf
+ */
+
+/**
+ * Includes
+ */
+#include "SCA3000.h"
+
+SCA3000::SCA3000(PinName mosi,
+                 PinName miso,
+                 PinName sck,
+                 PinName cs,
+                 PinName nr) : spi_(mosi, miso, sck), nCS_(cs), nR_(nr) {
+
+    //1MHz rate.
+    spi_.frequency(1000000);
+    //8-bit frame, POL = 0, PHA = 0.
+    spi_.format(8,0);
+    //Chip select is active low [so set it high initially].
+    nCS_ = 1;
+    //Pulse reset.
+    nR_ = 0;
+    wait(0.1);
+    nR_ = 1;
+
+    int status = 0;
+    //Check whether the device successfully reset by reading
+    //the CSME bit of the STATUS register.
+    //0 => no error
+    //1 => error
+    status = oneByteRead(SCA3000_STATUS_REG);
+    //CSME bit = 1... uh oh...
+    if (status & 0x2) {
+    
+    }
+
+}
+
+int SCA3000::getRevId(void) {
+
+    return oneByteRead(SCA3000_REVID_REG);
+
+}
+
+float SCA3000::getAcceleration(int axis) {
+
+    int acceleration = 0;
+    int axis_lsb     = 0;
+    int axis_msb     = 0;
+
+    switch (axis) {
+
+        case SCA3000_X_AXIS:
+
+            axis_lsb = oneByteRead(SCA3000_X_LSB);
+            axis_msb = oneByteRead(SCA3000_X_MSB);
+            
+            break;
+
+        case SCA3000_Y_AXIS:
+
+            axis_lsb = oneByteRead(SCA3000_Y_LSB);
+            axis_msb = oneByteRead(SCA3000_Y_MSB);
+            
+            break;
+
+        case SCA3000_Z_AXIS:
+
+            axis_lsb = oneByteRead(SCA3000_Z_LSB);
+            axis_msb = oneByteRead(SCA3000_Z_MSB);
+            
+            break;
+
+            //An invalid axis value has been passed.
+        default:
+        
+            break;
+
+    }
+
+    acceleration = ( axis_msb << 8 | axis_lsb );
+
+    return countsToMg(acceleration);
+
+}
+
+float SCA3000::countsToMg(int counts){
+
+    float acceleration = 0.0;
+
+    //If this looks like nonsense it's because
+    //the datasheet is completely wrong.
+    if(counts & 0x8000){
+        counts = (counts >> 3) & 0x1FFF;
+        counts = (~counts & 0x1FFF)+ 1;
+        acceleration = counts * -0.75;
+    }
+    else{
+        counts = (counts >> 3) & 0xFFF;
+        acceleration = counts * 0.75;
+    }
+    
+    return acceleration;
+
+}
+
+int SCA3000::oneByteRead(int address) {
+
+    //Register address sits in the first 6 bits of the transmission.
+    int tx = ((address << 2) | SCA3000_SPI_READ);
+    int rx = 0;
+
+    nCS_ = 0;
+    //Send address to read from.
+    spi_.write(tx);
+    //Read back contents of address.
+    rx = spi_.write(0x00);
+    nCS_ = 1;
+
+    return rx;
+
+}
+
+void SCA3000::oneByteWrite(int address, char data) {
+
+    //Register address sits in the first 6 bits of the transmission.
+    int tx = ((address << 2) | SCA3000_SPI_WRITE);
+
+    nCS_ = 0;
+    //Send address to write to.
+    spi_.write(tx);
+    //Send data to be written.
+    spi_.write(data);
+    nCS_ = 1;
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SCA3000.h	Sun May 29 14:13:20 2011 +0000
@@ -0,0 +1,131 @@
+/**
+ * @author Aaron Berk
+ *
+ * @section LICENSE
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @section DESCRIPTION
+ *
+ * SCA3000, triple axis, digital interface, accelerometer.
+ *
+ * Datasheet:
+ *
+ * http://www.sparkfun.com/datasheets/Sensors/Accelerometer/SCA3000-D01.pdf
+ */
+
+#ifndef MBED_SCA3000_H
+#define MBED_SCA3000_H
+
+/**
+ * Includes
+ */
+#include "mbed.h"
+
+/**
+ * Defines
+ */
+//Registers.
+#define SCA3000_REVID_REG  0x00
+#define SCA3000_STATUS_REG 0x02
+#define SCA3000_X_LSB      0x04
+#define SCA3000_X_MSB      0x05
+#define SCA3000_Y_LSB      0x06
+#define SCA3000_Y_MSB      0x07
+#define SCA3000_Z_LSB      0x08
+#define SCA3000_Z_MSB      0x09
+ 
+#define SCA3000_SPI_READ   0x00
+#define SCA3000_SPI_WRITE  0x02
+
+#define SCA3000_X_AXIS     0x00
+#define SCA3000_Y_AXIS     0x01
+#define SCA3000_Z_AXIS     0x02
+
+/**
+ * SCA3000, triple axis, digital interface, accelerometer.
+ */
+class SCA3000 {
+
+public:
+
+    /**
+     * Constructor.
+     *
+     * @param mosi mbed pin to use for MOSI line of SPI interface.
+     * @param miso mbed pin to use for MISO line of SPI interface.
+     * @param sck mbed pin to use for SCK line of SPI interface.
+     * @param cs mbed pin to use for not chip select line of SPI interface.
+     * @param nr mbed pin to use for the not reset line.
+     */
+    SCA3000(PinName mosi, PinName miso, PinName sck, PinName cs, PinName nr);
+    
+    /**
+     * Read the revision ID register on the device.
+     *
+     * @return The revision ID number.
+     */
+    int getRevId(void);
+    
+    /**
+     * Get the register contents acceleration value for the
+     * given axis.
+     *
+     * @param axis The axis to get acceleration values for.
+     *
+     * @return The acceleration on the specified axis in mg.
+     */
+    float getAcceleration(int axis);
+
+private:
+
+    SPI        spi_;
+    DigitalOut nCS_;
+    DigitalOut nR_;
+    
+    /**
+     * Converts the contents of acceleration registers (MSB << 8 | LSB)
+     * to mg.
+     * 
+     * @param counts The contents of acceleration registers.
+     *
+     * @return The acceleration in mg.
+     */
+    float countsToMg(int counts);
+    
+    /**
+     * Read one byte from a register on the device.
+     *
+     * @param address Address of the register to read.
+     *
+     * @return The contents of the register address.
+     */
+    int oneByteRead(int address);
+    
+    /**
+     * Write one byte to a register on the device.
+     *
+     * @param address Address of the register to write to.
+     * @param data The data to write into the register.
+     */
+    void oneByteWrite(int address, char data);
+
+};
+
+#endif /* MBED_SCA3000_H */