SCA3000 triple axis digital interface accelerometer

Committer:
aberk
Date:
Sun May 29 14:13:20 2011 +0000
Revision:
0:fe041345c169
Child:
1:f5f2e79304fb
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:fe041345c169 1 /**
aberk 0:fe041345c169 2 * @author Aaron Berk
aberk 0:fe041345c169 3 *
aberk 0:fe041345c169 4 * @section LICENSE
aberk 0:fe041345c169 5 *
aberk 0:fe041345c169 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
aberk 0:fe041345c169 7 * of this software and associated documentation files (the "Software"), to deal
aberk 0:fe041345c169 8 * in the Software without restriction, including without limitation the rights
aberk 0:fe041345c169 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aberk 0:fe041345c169 10 * copies of the Software, and to permit persons to whom the Software is
aberk 0:fe041345c169 11 * furnished to do so, subject to the following conditions:
aberk 0:fe041345c169 12 *
aberk 0:fe041345c169 13 * The above copyright notice and this permission notice shall be included in
aberk 0:fe041345c169 14 * all copies or substantial portions of the Software.
aberk 0:fe041345c169 15 *
aberk 0:fe041345c169 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aberk 0:fe041345c169 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aberk 0:fe041345c169 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aberk 0:fe041345c169 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aberk 0:fe041345c169 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aberk 0:fe041345c169 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
aberk 0:fe041345c169 22 * THE SOFTWARE.
aberk 0:fe041345c169 23 *
aberk 0:fe041345c169 24 * @section DESCRIPTION
aberk 0:fe041345c169 25 *
aberk 0:fe041345c169 26 * SCA3000, triple axis, digital interface, accelerometer.
aberk 0:fe041345c169 27 *
aberk 0:fe041345c169 28 * Datasheet:
aberk 0:fe041345c169 29 *
aberk 0:fe041345c169 30 * http://www.sparkfun.com/datasheets/Sensors/Accelerometer/SCA3000-D01.pdf
aberk 0:fe041345c169 31 */
aberk 0:fe041345c169 32
aberk 0:fe041345c169 33 /**
aberk 0:fe041345c169 34 * Includes
aberk 0:fe041345c169 35 */
aberk 0:fe041345c169 36 #include "SCA3000.h"
aberk 0:fe041345c169 37
aberk 0:fe041345c169 38 SCA3000::SCA3000(PinName mosi,
aberk 0:fe041345c169 39 PinName miso,
aberk 0:fe041345c169 40 PinName sck,
aberk 0:fe041345c169 41 PinName cs,
aberk 0:fe041345c169 42 PinName nr) : spi_(mosi, miso, sck), nCS_(cs), nR_(nr) {
aberk 0:fe041345c169 43
aberk 0:fe041345c169 44 //1MHz rate.
aberk 0:fe041345c169 45 spi_.frequency(1000000);
aberk 0:fe041345c169 46 //8-bit frame, POL = 0, PHA = 0.
aberk 0:fe041345c169 47 spi_.format(8,0);
aberk 0:fe041345c169 48 //Chip select is active low [so set it high initially].
aberk 0:fe041345c169 49 nCS_ = 1;
aberk 0:fe041345c169 50 //Pulse reset.
aberk 0:fe041345c169 51 nR_ = 0;
aberk 0:fe041345c169 52 wait(0.1);
aberk 0:fe041345c169 53 nR_ = 1;
aberk 0:fe041345c169 54
aberk 0:fe041345c169 55 int status = 0;
aberk 0:fe041345c169 56 //Check whether the device successfully reset by reading
aberk 0:fe041345c169 57 //the CSME bit of the STATUS register.
aberk 0:fe041345c169 58 //0 => no error
aberk 0:fe041345c169 59 //1 => error
aberk 0:fe041345c169 60 status = oneByteRead(SCA3000_STATUS_REG);
aberk 0:fe041345c169 61 //CSME bit = 1... uh oh...
aberk 0:fe041345c169 62 if (status & 0x2) {
aberk 0:fe041345c169 63
aberk 0:fe041345c169 64 }
aberk 0:fe041345c169 65
aberk 0:fe041345c169 66 }
aberk 0:fe041345c169 67
aberk 0:fe041345c169 68 int SCA3000::getRevId(void) {
aberk 0:fe041345c169 69
aberk 0:fe041345c169 70 return oneByteRead(SCA3000_REVID_REG);
aberk 0:fe041345c169 71
aberk 0:fe041345c169 72 }
aberk 0:fe041345c169 73
aberk 0:fe041345c169 74 float SCA3000::getAcceleration(int axis) {
aberk 0:fe041345c169 75
aberk 0:fe041345c169 76 int acceleration = 0;
aberk 0:fe041345c169 77 int axis_lsb = 0;
aberk 0:fe041345c169 78 int axis_msb = 0;
aberk 0:fe041345c169 79
aberk 0:fe041345c169 80 switch (axis) {
aberk 0:fe041345c169 81
aberk 0:fe041345c169 82 case SCA3000_X_AXIS:
aberk 0:fe041345c169 83
aberk 0:fe041345c169 84 axis_lsb = oneByteRead(SCA3000_X_LSB);
aberk 0:fe041345c169 85 axis_msb = oneByteRead(SCA3000_X_MSB);
aberk 0:fe041345c169 86
aberk 0:fe041345c169 87 break;
aberk 0:fe041345c169 88
aberk 0:fe041345c169 89 case SCA3000_Y_AXIS:
aberk 0:fe041345c169 90
aberk 0:fe041345c169 91 axis_lsb = oneByteRead(SCA3000_Y_LSB);
aberk 0:fe041345c169 92 axis_msb = oneByteRead(SCA3000_Y_MSB);
aberk 0:fe041345c169 93
aberk 0:fe041345c169 94 break;
aberk 0:fe041345c169 95
aberk 0:fe041345c169 96 case SCA3000_Z_AXIS:
aberk 0:fe041345c169 97
aberk 0:fe041345c169 98 axis_lsb = oneByteRead(SCA3000_Z_LSB);
aberk 0:fe041345c169 99 axis_msb = oneByteRead(SCA3000_Z_MSB);
aberk 0:fe041345c169 100
aberk 0:fe041345c169 101 break;
aberk 0:fe041345c169 102
aberk 0:fe041345c169 103 //An invalid axis value has been passed.
aberk 0:fe041345c169 104 default:
aberk 0:fe041345c169 105
aberk 0:fe041345c169 106 break;
aberk 0:fe041345c169 107
aberk 0:fe041345c169 108 }
aberk 0:fe041345c169 109
aberk 0:fe041345c169 110 acceleration = ( axis_msb << 8 | axis_lsb );
aberk 0:fe041345c169 111
aberk 0:fe041345c169 112 return countsToMg(acceleration);
aberk 0:fe041345c169 113
aberk 0:fe041345c169 114 }
aberk 0:fe041345c169 115
aberk 0:fe041345c169 116 float SCA3000::countsToMg(int counts){
aberk 0:fe041345c169 117
aberk 0:fe041345c169 118 float acceleration = 0.0;
aberk 0:fe041345c169 119
aberk 0:fe041345c169 120 //If this looks like nonsense it's because
aberk 0:fe041345c169 121 //the datasheet is completely wrong.
aberk 0:fe041345c169 122 if(counts & 0x8000){
aberk 0:fe041345c169 123 counts = (counts >> 3) & 0x1FFF;
aberk 0:fe041345c169 124 counts = (~counts & 0x1FFF)+ 1;
aberk 0:fe041345c169 125 acceleration = counts * -0.75;
aberk 0:fe041345c169 126 }
aberk 0:fe041345c169 127 else{
aberk 0:fe041345c169 128 counts = (counts >> 3) & 0xFFF;
aberk 0:fe041345c169 129 acceleration = counts * 0.75;
aberk 0:fe041345c169 130 }
aberk 0:fe041345c169 131
aberk 0:fe041345c169 132 return acceleration;
aberk 0:fe041345c169 133
aberk 0:fe041345c169 134 }
aberk 0:fe041345c169 135
aberk 0:fe041345c169 136 int SCA3000::oneByteRead(int address) {
aberk 0:fe041345c169 137
aberk 0:fe041345c169 138 //Register address sits in the first 6 bits of the transmission.
aberk 0:fe041345c169 139 int tx = ((address << 2) | SCA3000_SPI_READ);
aberk 0:fe041345c169 140 int rx = 0;
aberk 0:fe041345c169 141
aberk 0:fe041345c169 142 nCS_ = 0;
aberk 0:fe041345c169 143 //Send address to read from.
aberk 0:fe041345c169 144 spi_.write(tx);
aberk 0:fe041345c169 145 //Read back contents of address.
aberk 0:fe041345c169 146 rx = spi_.write(0x00);
aberk 0:fe041345c169 147 nCS_ = 1;
aberk 0:fe041345c169 148
aberk 0:fe041345c169 149 return rx;
aberk 0:fe041345c169 150
aberk 0:fe041345c169 151 }
aberk 0:fe041345c169 152
aberk 0:fe041345c169 153 void SCA3000::oneByteWrite(int address, char data) {
aberk 0:fe041345c169 154
aberk 0:fe041345c169 155 //Register address sits in the first 6 bits of the transmission.
aberk 0:fe041345c169 156 int tx = ((address << 2) | SCA3000_SPI_WRITE);
aberk 0:fe041345c169 157
aberk 0:fe041345c169 158 nCS_ = 0;
aberk 0:fe041345c169 159 //Send address to write to.
aberk 0:fe041345c169 160 spi_.write(tx);
aberk 0:fe041345c169 161 //Send data to be written.
aberk 0:fe041345c169 162 spi_.write(data);
aberk 0:fe041345c169 163 nCS_ = 1;
aberk 0:fe041345c169 164
aberk 0:fe041345c169 165 }