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.
LIS302.cpp@0:c036efff0b10, 2009-11-13 (annotated)
- Committer:
- simon
- Date:
- Fri Nov 13 11:58:12 2009 +0000
- Revision:
- 0:c036efff0b10
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |