Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SCA3000.cpp
00001 /** 00002 * @author Aaron Berk 00003 * 00004 * @section LICENSE 00005 * 00006 * Permission is hereby granted, free of charge, to any person obtaining a copy 00007 * of this software and associated documentation files (the "Software"), to deal 00008 * in the Software without restriction, including without limitation the rights 00009 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00010 * copies of the Software, and to permit persons to whom the Software is 00011 * furnished to do so, subject to the following conditions: 00012 * 00013 * The above copyright notice and this permission notice shall be included in 00014 * all copies or substantial portions of the Software. 00015 * 00016 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00020 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00022 * THE SOFTWARE. 00023 * 00024 * @section DESCRIPTION 00025 * 00026 * SCA3000, triple axis, digital interface, accelerometer. 00027 * 00028 * Datasheet: 00029 * 00030 * http://www.sparkfun.com/datasheets/Sensors/Accelerometer/SCA3000-D01.pdf 00031 */ 00032 00033 /** 00034 * Includes 00035 */ 00036 #include "SCA3000.h" 00037 00038 SCA3000::SCA3000(PinName mosi, 00039 PinName miso, 00040 PinName sck, 00041 PinName cs, 00042 PinName nr) : spi_(mosi, miso, sck), nCS_(cs), nR_(nr) { 00043 00044 //1MHz rate. 00045 spi_.frequency(1000000); 00046 //8-bit frame, POL = 0, PHA = 0. 00047 spi_.format(8,0); 00048 //Chip select is active low [so set it high initially]. 00049 nCS_ = 1; 00050 //Pulse reset. 00051 nR_ = 0; 00052 wait(0.1); 00053 nR_ = 1; 00054 00055 int status = 0; 00056 //Check whether the device successfully reset by reading 00057 //the CSME bit of the STATUS register. 00058 //0 => no error 00059 //1 => error 00060 status = oneByteRead(SCA3000_STATUS_REG); 00061 //CSME bit = 1... uh oh... 00062 if (status & 0x2) { 00063 00064 } 00065 00066 } 00067 00068 int SCA3000::getRevId(void) { 00069 00070 return oneByteRead(SCA3000_REVID_REG); 00071 00072 } 00073 00074 float SCA3000::getAcceleration(int axis) { 00075 00076 return getCounts(axis) * 0.75; 00077 00078 } 00079 00080 int SCA3000::getCounts(int axis){ 00081 00082 int acceleration = 0; 00083 int axis_lsb = 0; 00084 int axis_msb = 0; 00085 00086 switch (axis) { 00087 00088 case SCA3000_X_AXIS: 00089 00090 axis_lsb = oneByteRead(SCA3000_X_LSB); 00091 axis_msb = oneByteRead(SCA3000_X_MSB); 00092 00093 break; 00094 00095 case SCA3000_Y_AXIS: 00096 00097 axis_lsb = oneByteRead(SCA3000_Y_LSB); 00098 axis_msb = oneByteRead(SCA3000_Y_MSB); 00099 00100 break; 00101 00102 case SCA3000_Z_AXIS: 00103 00104 axis_lsb = oneByteRead(SCA3000_Z_LSB); 00105 axis_msb = oneByteRead(SCA3000_Z_MSB); 00106 00107 break; 00108 00109 //An invalid axis value has been passed. 00110 default: 00111 00112 break; 00113 00114 } 00115 00116 int counts = ( axis_msb << 8 | axis_lsb ); 00117 00118 //If this looks like nonsense it's because 00119 //the datasheet is completely wrong. 00120 if(counts & 0x8000){ 00121 counts = (counts >> 3) & 0x1FFF; 00122 counts = (~counts & 0x1FFF) + 1; 00123 acceleration = counts * -1; 00124 } 00125 else{ 00126 counts = (counts >> 3) & 0xFFF; 00127 acceleration = counts; 00128 } 00129 00130 return acceleration; 00131 00132 } 00133 00134 int SCA3000::oneByteRead(int address) { 00135 00136 //Register address sits in the first 6 bits of the transmission. 00137 int tx = ((address << 2) | SCA3000_SPI_READ); 00138 int rx = 0; 00139 00140 nCS_ = 0; 00141 //Send address to read from. 00142 spi_.write(tx); 00143 //Read back contents of address. 00144 rx = spi_.write(0x00); 00145 nCS_ = 1; 00146 00147 return rx; 00148 00149 } 00150 00151 void SCA3000::oneByteWrite(int address, char data) { 00152 00153 //Register address sits in the first 6 bits of the transmission. 00154 int tx = ((address << 2) | SCA3000_SPI_WRITE); 00155 00156 nCS_ = 0; 00157 //Send address to write to. 00158 spi_.write(tx); 00159 //Send data to be written. 00160 spi_.write(data); 00161 nCS_ = 1; 00162 00163 }
Generated on Tue Jul 12 2022 23:35:55 by
1.7.2
SCA3000 Digital Accelerometer