An i2c version of mbed LIS302 Accelerometer Library by sford, cstyles, wreynolds. The return data is raw yet. It seems from -0x55 to 0x55 though I think it returns -0x7F to 0x7F. Humm... Why?

Committer:
kazushi2008
Date:
Sun Oct 10 06:17:08 2010 +0000
Revision:
0:4ef465f255d0
the first version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kazushi2008 0:4ef465f255d0 1 /* mbed LIS302 Accelerometer Library
kazushi2008 0:4ef465f255d0 2 * Copyright (c) 2008-2010, sford, cstyles, wreynolds
kazushi2008 0:4ef465f255d0 3 * modified for i2c version by Kazushi Mukaiyama 2010
kazushi2008 0:4ef465f255d0 4 *
kazushi2008 0:4ef465f255d0 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
kazushi2008 0:4ef465f255d0 6 * of this software and associated documentation files (the "Software"), to deal
kazushi2008 0:4ef465f255d0 7 * in the Software without restriction, including without limitation the rights
kazushi2008 0:4ef465f255d0 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
kazushi2008 0:4ef465f255d0 9 * copies of the Software, and to permit persons to whom the Software is
kazushi2008 0:4ef465f255d0 10 * furnished to do so, subject to the following conditions:
kazushi2008 0:4ef465f255d0 11 *
kazushi2008 0:4ef465f255d0 12 * The above copyright notice and this permission notice shall be included in
kazushi2008 0:4ef465f255d0 13 * all copies or substantial portions of the Software.
kazushi2008 0:4ef465f255d0 14 *
kazushi2008 0:4ef465f255d0 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
kazushi2008 0:4ef465f255d0 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
kazushi2008 0:4ef465f255d0 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
kazushi2008 0:4ef465f255d0 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
kazushi2008 0:4ef465f255d0 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kazushi2008 0:4ef465f255d0 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
kazushi2008 0:4ef465f255d0 21 * THE SOFTWARE.
kazushi2008 0:4ef465f255d0 22 */
kazushi2008 0:4ef465f255d0 23
kazushi2008 0:4ef465f255d0 24 #include "LIS302i2c.h"
kazushi2008 0:4ef465f255d0 25 #include "mbed.h"
kazushi2008 0:4ef465f255d0 26
kazushi2008 0:4ef465f255d0 27 #define LIS302_WHOAMI 0x0F
kazushi2008 0:4ef465f255d0 28 #define LIS302_CTRL_REG1 0x20
kazushi2008 0:4ef465f255d0 29 #define LIS302_CTRL_REG2 0x21
kazushi2008 0:4ef465f255d0 30 #define LIS302_CTRL_REG3 0x22
kazushi2008 0:4ef465f255d0 31 #define LIS302_HP_FILTER_RST 0x23
kazushi2008 0:4ef465f255d0 32 #define LIS302_STATUS_REG 0x27
kazushi2008 0:4ef465f255d0 33 #define LIS302_OUTX 0x29
kazushi2008 0:4ef465f255d0 34 #define LIS302_OUTY 0x2B
kazushi2008 0:4ef465f255d0 35 #define LIS302_OUTZ 0x2D
kazushi2008 0:4ef465f255d0 36 #define LIS302_ALL_AXIS 0x28
kazushi2008 0:4ef465f255d0 37 #define LIS302_FF_WU_CFG1 0x30
kazushi2008 0:4ef465f255d0 38 #define LIS302_FF_WU_SRC_1 0x31
kazushi2008 0:4ef465f255d0 39 #define LIS302_FF_WU_THS_1 0x32
kazushi2008 0:4ef465f255d0 40 #define LIS302_FF_WU_DURATION_1 0x33
kazushi2008 0:4ef465f255d0 41 #define LIS302_FF_WU_CFG_2 0x34
kazushi2008 0:4ef465f255d0 42 #define LIS302_FF_WU_SRC_2 0x35
kazushi2008 0:4ef465f255d0 43 #define LIS302_FF_WU_THS_2 0x36
kazushi2008 0:4ef465f255d0 44 #define LIS302_FF_WU_DURATION_2 0x37
kazushi2008 0:4ef465f255d0 45 #define LIS302_CLICK_CFG 0x38
kazushi2008 0:4ef465f255d0 46 #define LIS302_CLICK_SRC 0x39
kazushi2008 0:4ef465f255d0 47 #define LIS302_CLICK_THSY_X 0x3B
kazushi2008 0:4ef465f255d0 48 #define LIS302_CLICK_THSZ 0x3C
kazushi2008 0:4ef465f255d0 49 #define LIS302_READ 0x80
kazushi2008 0:4ef465f255d0 50 #define LIS302_WRITE 0x00
kazushi2008 0:4ef465f255d0 51
kazushi2008 0:4ef465f255d0 52 #define LIS302_STATUS_X_AVAILABLE 0x1
kazushi2008 0:4ef465f255d0 53 #define LIS302_STATUS_Y_AVAILABLE 0x2
kazushi2008 0:4ef465f255d0 54 #define LIS302_STATUS_Z_AVAILABLE 0x4
kazushi2008 0:4ef465f255d0 55
kazushi2008 0:4ef465f255d0 56 #define FACTOR_2g 55.6
kazushi2008 0:4ef465f255d0 57 #define FACTOR_8g 13.9
kazushi2008 0:4ef465f255d0 58
kazushi2008 0:4ef465f255d0 59 LIS302i2c::LIS302i2c(int addr, PinName sda, PinName scl)
kazushi2008 0:4ef465f255d0 60 : _i2c(sda, scl) {
kazushi2008 0:4ef465f255d0 61
kazushi2008 0:4ef465f255d0 62 _addr = addr<<1;
kazushi2008 0:4ef465f255d0 63
kazushi2008 0:4ef465f255d0 64 // Set up the i2c interface
kazushi2008 0:4ef465f255d0 65 //_i2c.frequency(1000000);
kazushi2008 0:4ef465f255d0 66
kazushi2008 0:4ef465f255d0 67 // Write to CTRL_REG1
kazushi2008 0:4ef465f255d0 68 _cmd[0] = (LIS302_WRITE | LIS302_CTRL_REG1);
kazushi2008 0:4ef465f255d0 69 _cmd[1] = 0x47;
kazushi2008 0:4ef465f255d0 70 _i2c.write(_addr, _cmd, 2);
kazushi2008 0:4ef465f255d0 71
kazushi2008 0:4ef465f255d0 72 // Write to CTRL_REG2
kazushi2008 0:4ef465f255d0 73 _cmd[0] = (LIS302_WRITE | LIS302_CTRL_REG2);
kazushi2008 0:4ef465f255d0 74 _cmd[1] = 0x40;
kazushi2008 0:4ef465f255d0 75 _i2c.write(_addr, _cmd, 2);
kazushi2008 0:4ef465f255d0 76
kazushi2008 0:4ef465f255d0 77 // Write to CTRL_REG3
kazushi2008 0:4ef465f255d0 78 _cmd[0] = (LIS302_WRITE | LIS302_CTRL_REG3);
kazushi2008 0:4ef465f255d0 79 _cmd[1] = 0x00; // This is default anyway
kazushi2008 0:4ef465f255d0 80 _i2c.write(_addr, _cmd, 2);
kazushi2008 0:4ef465f255d0 81
kazushi2008 0:4ef465f255d0 82 //range(0);
kazushi2008 0:4ef465f255d0 83 //calibrate();
kazushi2008 0:4ef465f255d0 84 }
kazushi2008 0:4ef465f255d0 85
kazushi2008 0:4ef465f255d0 86 void LIS302i2c::update()
kazushi2008 0:4ef465f255d0 87 {
kazushi2008 0:4ef465f255d0 88 while(!(status() & LIS302_STATUS_X_AVAILABLE));
kazushi2008 0:4ef465f255d0 89
kazushi2008 0:4ef465f255d0 90 _cmd[0] = (LIS302_READ | LIS302_ALL_AXIS);
kazushi2008 0:4ef465f255d0 91 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 92 _i2c.read(_addr, _cmd, 6);
kazushi2008 0:4ef465f255d0 93
kazushi2008 0:4ef465f255d0 94 x = (signed char)_cmd[1]/127.0;
kazushi2008 0:4ef465f255d0 95 y = (signed char)_cmd[3]/127.0;
kazushi2008 0:4ef465f255d0 96 z = (signed char)_cmd[5]/127.0;
kazushi2008 0:4ef465f255d0 97 }
kazushi2008 0:4ef465f255d0 98
kazushi2008 0:4ef465f255d0 99 float LIS302i2c::getX() {
kazushi2008 0:4ef465f255d0 100 // wait for a new sample
kazushi2008 0:4ef465f255d0 101 while(!(status() & LIS302_STATUS_X_AVAILABLE));
kazushi2008 0:4ef465f255d0 102
kazushi2008 0:4ef465f255d0 103 _cmd[0] = (LIS302_READ | LIS302_OUTX);
kazushi2008 0:4ef465f255d0 104 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 105 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 106 signed char raw = _cmd[0];
kazushi2008 0:4ef465f255d0 107
kazushi2008 0:4ef465f255d0 108 return raw/127.0;
kazushi2008 0:4ef465f255d0 109 //float gradient = (2.0/(_maxx-_minx));
kazushi2008 0:4ef465f255d0 110 //return (gradient*(float)(raw)/_factor)+((-gradient*_maxx)+1);
kazushi2008 0:4ef465f255d0 111 }
kazushi2008 0:4ef465f255d0 112
kazushi2008 0:4ef465f255d0 113 float LIS302i2c::getY() {
kazushi2008 0:4ef465f255d0 114 // wait for a new sample
kazushi2008 0:4ef465f255d0 115 while(!(status() & LIS302_STATUS_Y_AVAILABLE));
kazushi2008 0:4ef465f255d0 116
kazushi2008 0:4ef465f255d0 117 _cmd[0] = (LIS302_READ | LIS302_OUTY);
kazushi2008 0:4ef465f255d0 118 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 119 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 120 signed char raw = _cmd[0];
kazushi2008 0:4ef465f255d0 121
kazushi2008 0:4ef465f255d0 122 return raw/127.0;
kazushi2008 0:4ef465f255d0 123 //float gradient = (2.0/(_maxy-_miny));
kazushi2008 0:4ef465f255d0 124 //return (gradient*(float)(raw)/_factor)+((-gradient*_maxy)+1);
kazushi2008 0:4ef465f255d0 125 }
kazushi2008 0:4ef465f255d0 126
kazushi2008 0:4ef465f255d0 127 float LIS302i2c::getZ() {
kazushi2008 0:4ef465f255d0 128 // wait for a new sample
kazushi2008 0:4ef465f255d0 129 while(!(status() & LIS302_STATUS_Z_AVAILABLE));
kazushi2008 0:4ef465f255d0 130
kazushi2008 0:4ef465f255d0 131 _cmd[0] = (LIS302_READ | LIS302_OUTZ);
kazushi2008 0:4ef465f255d0 132 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 133 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 134 signed char raw = _cmd[0];
kazushi2008 0:4ef465f255d0 135
kazushi2008 0:4ef465f255d0 136 return raw/127.0;
kazushi2008 0:4ef465f255d0 137 //float gradient = (2.0/(_maxz-_minz));
kazushi2008 0:4ef465f255d0 138 //return (gradient*(float)(raw)/_factor)+((-gradient*_maxz)+1);
kazushi2008 0:4ef465f255d0 139 }
kazushi2008 0:4ef465f255d0 140
kazushi2008 0:4ef465f255d0 141 void LIS302i2c::range(int g) {
kazushi2008 0:4ef465f255d0 142
kazushi2008 0:4ef465f255d0 143 // fetch the current CRTL_REG1
kazushi2008 0:4ef465f255d0 144 _cmd[0] = (LIS302_READ | LIS302_CTRL_REG1);
kazushi2008 0:4ef465f255d0 145 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 146 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 147 char value = _cmd[0];
kazushi2008 0:4ef465f255d0 148
kazushi2008 0:4ef465f255d0 149 // set the range bit, and the calculation factor
kazushi2008 0:4ef465f255d0 150 if(g) {
kazushi2008 0:4ef465f255d0 151 value |= 0x20; // 8g
kazushi2008 0:4ef465f255d0 152 _factor = FACTOR_8g;
kazushi2008 0:4ef465f255d0 153 } else {
kazushi2008 0:4ef465f255d0 154 value &= ~0x20; // 2g
kazushi2008 0:4ef465f255d0 155 _factor = FACTOR_2g;
kazushi2008 0:4ef465f255d0 156 }
kazushi2008 0:4ef465f255d0 157
kazushi2008 0:4ef465f255d0 158 _cmd[0] = (LIS302_WRITE | LIS302_CTRL_REG1);
kazushi2008 0:4ef465f255d0 159 _cmd[1] = value;
kazushi2008 0:4ef465f255d0 160 _i2c.write(_addr, _cmd, 2);
kazushi2008 0:4ef465f255d0 161 }
kazushi2008 0:4ef465f255d0 162
kazushi2008 0:4ef465f255d0 163 void LIS302i2c::calibrate(float maxx, float minx, float maxy, float miny, float maxz, float minz) {
kazushi2008 0:4ef465f255d0 164 _maxx = maxx;
kazushi2008 0:4ef465f255d0 165 _minx = minx;
kazushi2008 0:4ef465f255d0 166 _maxy = maxy;
kazushi2008 0:4ef465f255d0 167 _miny = miny;
kazushi2008 0:4ef465f255d0 168 _maxz = maxz;
kazushi2008 0:4ef465f255d0 169 _minz = minz;
kazushi2008 0:4ef465f255d0 170 }
kazushi2008 0:4ef465f255d0 171
kazushi2008 0:4ef465f255d0 172 char LIS302i2c::whoami() {
kazushi2008 0:4ef465f255d0 173 _cmd[0] = (LIS302_READ | LIS302_WHOAMI);
kazushi2008 0:4ef465f255d0 174 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 175 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 176 char value = _cmd[0];
kazushi2008 0:4ef465f255d0 177 return value;
kazushi2008 0:4ef465f255d0 178 }
kazushi2008 0:4ef465f255d0 179
kazushi2008 0:4ef465f255d0 180 char LIS302i2c::status() {
kazushi2008 0:4ef465f255d0 181 _cmd[0] = 0xA7;
kazushi2008 0:4ef465f255d0 182 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 183 _cmd[0] = (LIS302_READ | LIS302_STATUS_REG);
kazushi2008 0:4ef465f255d0 184 _i2c.write(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 185 _i2c.read(_addr, _cmd, 1);
kazushi2008 0:4ef465f255d0 186 char value = _cmd[0];
kazushi2008 0:4ef465f255d0 187 return value;
kazushi2008 0:4ef465f255d0 188 }