Simon Ford / Mbed 2 deprecated LIS302Dev

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LIS302.cpp Source File

LIS302.cpp

00001 /* mbed LIS302 Accelerometer
00002  * Copyright (c) 2008-2009 cstyles, wreynolds, sford
00003  * Released under the MIT License: http://mbed.org/license/mit
00004  */
00005 
00006 #include "LIS302.h"
00007 #include "mbed.h"
00008 
00009 #define LIS302_WHOAMI               0x0F
00010 #define LIS302_CTRL_REG1            0x20
00011 #define LIS302_CTRL_REG2            0x21
00012 #define LIS302_CTRL_REG3            0x22
00013 #define LIS302_HP_FILTER_RST        0x23
00014 #define LIS302_STATUS_REG           0x27
00015 #define LIS302_OUTX                 0x29
00016 #define LIS302_OUTY                 0x2B
00017 #define LIS302_OUTZ                 0x2D
00018 #define LIS302_FF_WU_CFG1           0x30
00019 #define LIS302_FF_WU_SRC_1          0x31
00020 #define LIS302_FF_WU_THS_1          0x32
00021 #define LIS302_FF_WU_DURATION_1     0x33
00022 #define LIS302_FF_WU_CFG_2          0x34
00023 #define LIS302_FF_WU_SRC_2          0x35
00024 #define LIS302_FF_WU_THS_2          0x36
00025 #define LIS302_FF_WU_DURATION_2     0x37
00026 #define LIS302_CLICK_CFG            0x38
00027 #define LIS302_CLICK_SRC            0x39
00028 #define LIS302_CLICK_THSY_X         0x3B
00029 #define LIS302_CLICK_THSZ           0x3C
00030 #define LIS302_READ                 0x80
00031 #define LIS302_WRITE                0x00
00032 
00033 #define LIS302_STATUS_X_AVAILABLE 0x1
00034 #define LIS302_STATUS_Y_AVAILABLE 0x2
00035 #define LIS302_STATUS_Z_AVAILABLE 0x4
00036 
00037 #define FACTOR_2g 55.6
00038 #define FACTOR_8g 13.9
00039 
00040 LIS302::LIS302(PinName mosi, PinName miso, PinName clk, PinName ncs)
00041     : _spi(mosi, miso, clk), _ncs(ncs) {
00042 
00043     // Make sure CS is high
00044     _ncs = 1;
00045 
00046     // Set up the spi interface
00047     _spi.format(8, 3);
00048     _spi.frequency(1000000);
00049 
00050     // Write to CTRL_REG1
00051     _ncs = 0;
00052     _spi.write(LIS302_WRITE | LIS302_CTRL_REG1);
00053     _spi.write (0x47);
00054     _ncs = 1;
00055 
00056     // Write to CTRL_REG2
00057     _ncs = 0;
00058     _spi.write(LIS302_WRITE | LIS302_CTRL_REG2);
00059     _spi.write (0x0);  // This is default anyway
00060     _ncs = 1;
00061 
00062     // Write to CTRL_REG3
00063     _ncs = 0;
00064     _spi.write(LIS302_WRITE | LIS302_CTRL_REG3);
00065     _spi.write (0x0);  // This is default anyway
00066     _ncs = 1;
00067 
00068     range(0);
00069     calibrate();
00070 }
00071 
00072 float LIS302::x() {
00073     // wait for a new sample
00074     while(!(status() & LIS302_STATUS_X_AVAILABLE));
00075 
00076     _ncs = 0;
00077     _spi.write(LIS302_READ | LIS302_OUTX);
00078     signed char raw = _spi.write(0x00);
00079     _ncs = 1;
00080 
00081     float gradient = (2.0/(_maxx-_minx));
00082     return (gradient*(float)(raw)/_factor)+((-gradient*_maxx)+1);
00083 }
00084 
00085 float LIS302::y() {
00086     // wait for a new sample
00087     while(!(status() & LIS302_STATUS_Y_AVAILABLE));
00088 
00089     _ncs = 0;
00090     _spi.write(LIS302_READ | LIS302_OUTY);
00091     signed char raw = _spi.write(0x00);
00092     _ncs = 1;
00093 
00094     float gradient = (2.0/(_maxy-_miny));
00095     return (gradient*(float)(raw)/_factor)+((-gradient*_maxy)+1);
00096 }
00097 
00098 float LIS302::z() {
00099     // wait for a new sample
00100     while(!(status() & LIS302_STATUS_Z_AVAILABLE));
00101 
00102     _ncs = 0;
00103     _spi.write(LIS302_READ | LIS302_OUTZ);
00104     signed char raw = _spi.write(0x00);
00105     _ncs = 1;
00106 
00107     float gradient = (2.0/(_maxz-_minz));
00108     return (gradient*(float)(raw)/_factor)+((-gradient*_maxz)+1);
00109 }
00110 
00111 void LIS302::range(int g) {
00112 
00113     // fetch the current CRTL_REG1
00114     _ncs = 0;
00115     _spi.write(LIS302_READ | LIS302_CTRL_REG1);
00116     int value = _spi.write(0x00);
00117     _ncs = 1;
00118 
00119     // set the range bit, and the calculation factor
00120     if(g) {
00121         value |= 0x20; // 8g
00122         _factor = FACTOR_8g;
00123     } else {
00124         value &= ~0x20; // 2g
00125         _factor = FACTOR_2g;
00126     }
00127 
00128     _ncs = 0;
00129     _spi.write(LIS302_WRITE | LIS302_CTRL_REG1);
00130     _spi.write(value);
00131     _ncs = 1;
00132 }
00133 
00134 void LIS302::calibrate(float maxx, float minx, float maxy, float miny, float maxz, float minz) {
00135     _maxx = maxx;
00136     _minx = minx;
00137     _maxy = maxy;
00138     _miny = miny;
00139     _maxz = maxz;
00140     _minz = minz;
00141 }
00142 
00143 int LIS302::whoami() {
00144     _ncs = 0;
00145     _spi.write(LIS302_READ | LIS302_WHOAMI);
00146     int value = _spi.write(0x00);
00147     _ncs = 1;
00148     return value;
00149 }
00150 
00151 int LIS302::status() {
00152     _ncs = 0;
00153     _spi.write(0xA7);
00154     int value = _spi.write(LIS302_READ | LIS302_STATUS_REG);
00155     _ncs = 1;
00156     return value;
00157 }