Simon Ford / Mbed 2 deprecated LIS302Dev

Dependencies:   mbed

Committer:
simon
Date:
Fri Nov 13 11:58:12 2009 +0000
Revision:
0:c036efff0b10

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:c036efff0b10 1 /* mbed LIS302 Accelerometer
simon 0:c036efff0b10 2 * Copyright (c) 2008-2009 cstyles, wreynolds, sford
simon 0:c036efff0b10 3 * Released under the MIT License: http://mbed.org/license/mit
simon 0:c036efff0b10 4 */
simon 0:c036efff0b10 5
simon 0:c036efff0b10 6 #include "LIS302.h"
simon 0:c036efff0b10 7 #include "mbed.h"
simon 0:c036efff0b10 8
simon 0:c036efff0b10 9 #define LIS302_WHOAMI 0x0F
simon 0:c036efff0b10 10 #define LIS302_CTRL_REG1 0x20
simon 0:c036efff0b10 11 #define LIS302_CTRL_REG2 0x21
simon 0:c036efff0b10 12 #define LIS302_CTRL_REG3 0x22
simon 0:c036efff0b10 13 #define LIS302_HP_FILTER_RST 0x23
simon 0:c036efff0b10 14 #define LIS302_STATUS_REG 0x27
simon 0:c036efff0b10 15 #define LIS302_OUTX 0x29
simon 0:c036efff0b10 16 #define LIS302_OUTY 0x2B
simon 0:c036efff0b10 17 #define LIS302_OUTZ 0x2D
simon 0:c036efff0b10 18 #define LIS302_FF_WU_CFG1 0x30
simon 0:c036efff0b10 19 #define LIS302_FF_WU_SRC_1 0x31
simon 0:c036efff0b10 20 #define LIS302_FF_WU_THS_1 0x32
simon 0:c036efff0b10 21 #define LIS302_FF_WU_DURATION_1 0x33
simon 0:c036efff0b10 22 #define LIS302_FF_WU_CFG_2 0x34
simon 0:c036efff0b10 23 #define LIS302_FF_WU_SRC_2 0x35
simon 0:c036efff0b10 24 #define LIS302_FF_WU_THS_2 0x36
simon 0:c036efff0b10 25 #define LIS302_FF_WU_DURATION_2 0x37
simon 0:c036efff0b10 26 #define LIS302_CLICK_CFG 0x38
simon 0:c036efff0b10 27 #define LIS302_CLICK_SRC 0x39
simon 0:c036efff0b10 28 #define LIS302_CLICK_THSY_X 0x3B
simon 0:c036efff0b10 29 #define LIS302_CLICK_THSZ 0x3C
simon 0:c036efff0b10 30 #define LIS302_READ 0x80
simon 0:c036efff0b10 31 #define LIS302_WRITE 0x00
simon 0:c036efff0b10 32
simon 0:c036efff0b10 33 #define LIS302_STATUS_X_AVAILABLE 0x1
simon 0:c036efff0b10 34 #define LIS302_STATUS_Y_AVAILABLE 0x2
simon 0:c036efff0b10 35 #define LIS302_STATUS_Z_AVAILABLE 0x4
simon 0:c036efff0b10 36
simon 0:c036efff0b10 37 #define FACTOR_2g 55.6
simon 0:c036efff0b10 38 #define FACTOR_8g 13.9
simon 0:c036efff0b10 39
simon 0:c036efff0b10 40 LIS302::LIS302(PinName mosi, PinName miso, PinName clk, PinName ncs)
simon 0:c036efff0b10 41 : _spi(mosi, miso, clk), _ncs(ncs) {
simon 0:c036efff0b10 42
simon 0:c036efff0b10 43 // Make sure CS is high
simon 0:c036efff0b10 44 _ncs = 1;
simon 0:c036efff0b10 45
simon 0:c036efff0b10 46 // Set up the spi interface
simon 0:c036efff0b10 47 _spi.format(8, 3);
simon 0:c036efff0b10 48 _spi.frequency(1000000);
simon 0:c036efff0b10 49
simon 0:c036efff0b10 50 // Write to CTRL_REG1
simon 0:c036efff0b10 51 _ncs = 0;
simon 0:c036efff0b10 52 _spi.write(LIS302_WRITE | LIS302_CTRL_REG1);
simon 0:c036efff0b10 53 _spi.write (0x47);
simon 0:c036efff0b10 54 _ncs = 1;
simon 0:c036efff0b10 55
simon 0:c036efff0b10 56 // Write to CTRL_REG2
simon 0:c036efff0b10 57 _ncs = 0;
simon 0:c036efff0b10 58 _spi.write(LIS302_WRITE | LIS302_CTRL_REG2);
simon 0:c036efff0b10 59 _spi.write (0x0); // This is default anyway
simon 0:c036efff0b10 60 _ncs = 1;
simon 0:c036efff0b10 61
simon 0:c036efff0b10 62 // Write to CTRL_REG3
simon 0:c036efff0b10 63 _ncs = 0;
simon 0:c036efff0b10 64 _spi.write(LIS302_WRITE | LIS302_CTRL_REG3);
simon 0:c036efff0b10 65 _spi.write (0x0); // This is default anyway
simon 0:c036efff0b10 66 _ncs = 1;
simon 0:c036efff0b10 67
simon 0:c036efff0b10 68 range(0);
simon 0:c036efff0b10 69 calibrate();
simon 0:c036efff0b10 70 }
simon 0:c036efff0b10 71
simon 0:c036efff0b10 72 float LIS302::x() {
simon 0:c036efff0b10 73 // wait for a new sample
simon 0:c036efff0b10 74 while(!(status() & LIS302_STATUS_X_AVAILABLE));
simon 0:c036efff0b10 75
simon 0:c036efff0b10 76 _ncs = 0;
simon 0:c036efff0b10 77 _spi.write(LIS302_READ | LIS302_OUTX);
simon 0:c036efff0b10 78 signed char raw = _spi.write(0x00);
simon 0:c036efff0b10 79 _ncs = 1;
simon 0:c036efff0b10 80
simon 0:c036efff0b10 81 float gradient = (2.0/(_maxx-_minx));
simon 0:c036efff0b10 82 return (gradient*(float)(raw)/_factor)+((-gradient*_maxx)+1);
simon 0:c036efff0b10 83 }
simon 0:c036efff0b10 84
simon 0:c036efff0b10 85 float LIS302::y() {
simon 0:c036efff0b10 86 // wait for a new sample
simon 0:c036efff0b10 87 while(!(status() & LIS302_STATUS_Y_AVAILABLE));
simon 0:c036efff0b10 88
simon 0:c036efff0b10 89 _ncs = 0;
simon 0:c036efff0b10 90 _spi.write(LIS302_READ | LIS302_OUTY);
simon 0:c036efff0b10 91 signed char raw = _spi.write(0x00);
simon 0:c036efff0b10 92 _ncs = 1;
simon 0:c036efff0b10 93
simon 0:c036efff0b10 94 float gradient = (2.0/(_maxy-_miny));
simon 0:c036efff0b10 95 return (gradient*(float)(raw)/_factor)+((-gradient*_maxy)+1);
simon 0:c036efff0b10 96 }
simon 0:c036efff0b10 97
simon 0:c036efff0b10 98 float LIS302::z() {
simon 0:c036efff0b10 99 // wait for a new sample
simon 0:c036efff0b10 100 while(!(status() & LIS302_STATUS_Z_AVAILABLE));
simon 0:c036efff0b10 101
simon 0:c036efff0b10 102 _ncs = 0;
simon 0:c036efff0b10 103 _spi.write(LIS302_READ | LIS302_OUTZ);
simon 0:c036efff0b10 104 signed char raw = _spi.write(0x00);
simon 0:c036efff0b10 105 _ncs = 1;
simon 0:c036efff0b10 106
simon 0:c036efff0b10 107 float gradient = (2.0/(_maxz-_minz));
simon 0:c036efff0b10 108 return (gradient*(float)(raw)/_factor)+((-gradient*_maxz)+1);
simon 0:c036efff0b10 109 }
simon 0:c036efff0b10 110
simon 0:c036efff0b10 111 void LIS302::range(int g) {
simon 0:c036efff0b10 112
simon 0:c036efff0b10 113 // fetch the current CRTL_REG1
simon 0:c036efff0b10 114 _ncs = 0;
simon 0:c036efff0b10 115 _spi.write(LIS302_READ | LIS302_CTRL_REG1);
simon 0:c036efff0b10 116 int value = _spi.write(0x00);
simon 0:c036efff0b10 117 _ncs = 1;
simon 0:c036efff0b10 118
simon 0:c036efff0b10 119 // set the range bit, and the calculation factor
simon 0:c036efff0b10 120 if(g) {
simon 0:c036efff0b10 121 value |= 0x20; // 8g
simon 0:c036efff0b10 122 _factor = FACTOR_8g;
simon 0:c036efff0b10 123 } else {
simon 0:c036efff0b10 124 value &= ~0x20; // 2g
simon 0:c036efff0b10 125 _factor = FACTOR_2g;
simon 0:c036efff0b10 126 }
simon 0:c036efff0b10 127
simon 0:c036efff0b10 128 _ncs = 0;
simon 0:c036efff0b10 129 _spi.write(LIS302_WRITE | LIS302_CTRL_REG1);
simon 0:c036efff0b10 130 _spi.write(value);
simon 0:c036efff0b10 131 _ncs = 1;
simon 0:c036efff0b10 132 }
simon 0:c036efff0b10 133
simon 0:c036efff0b10 134 void LIS302::calibrate(float maxx, float minx, float maxy, float miny, float maxz, float minz) {
simon 0:c036efff0b10 135 _maxx = maxx;
simon 0:c036efff0b10 136 _minx = minx;
simon 0:c036efff0b10 137 _maxy = maxy;
simon 0:c036efff0b10 138 _miny = miny;
simon 0:c036efff0b10 139 _maxz = maxz;
simon 0:c036efff0b10 140 _minz = minz;
simon 0:c036efff0b10 141 }
simon 0:c036efff0b10 142
simon 0:c036efff0b10 143 int LIS302::whoami() {
simon 0:c036efff0b10 144 _ncs = 0;
simon 0:c036efff0b10 145 _spi.write(LIS302_READ | LIS302_WHOAMI);
simon 0:c036efff0b10 146 int value = _spi.write(0x00);
simon 0:c036efff0b10 147 _ncs = 1;
simon 0:c036efff0b10 148 return value;
simon 0:c036efff0b10 149 }
simon 0:c036efff0b10 150
simon 0:c036efff0b10 151 int LIS302::status() {
simon 0:c036efff0b10 152 _ncs = 0;
simon 0:c036efff0b10 153 _spi.write(0xA7);
simon 0:c036efff0b10 154 int value = _spi.write(LIS302_READ | LIS302_STATUS_REG);
simon 0:c036efff0b10 155 _ncs = 1;
simon 0:c036efff0b10 156 return value;
simon 0:c036efff0b10 157 }