Library for read the sensor LSM303D by I2C and configure the sensor for measure with frecuency 100Hz and range +-2g

Dependents:   1-K64F_with_5_acel

Fork of LSM303D by brian claus

Committer:
vinajarr
Date:
Thu Jan 18 07:52:30 2018 +0000
Revision:
2:fcd607760ee8
Parent:
1:27d47f5de82c
implement interrupt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bclaus 0:5b930e09bd6e 1 /** LSM303D Interface Library
bclaus 0:5b930e09bd6e 2 *
bclaus 0:5b930e09bd6e 3 * base on code by Michael Shimniok http://bot-thoughts.com
bclaus 0:5b930e09bd6e 4 *
bclaus 0:5b930e09bd6e 5 * and on test program by @tosihisa and
bclaus 0:5b930e09bd6e 6 *
bclaus 0:5b930e09bd6e 7 * and on Pololu sample library for LSM303D breakout by ryantm:
bclaus 0:5b930e09bd6e 8 *
bclaus 0:5b930e09bd6e 9 * ported by Brian Claus
bclaus 0:5b930e09bd6e 10 *
bclaus 0:5b930e09bd6e 11 * Copyright (c) 2011 Pololu Corporation. For more information, see
bclaus 0:5b930e09bd6e 12 *
bclaus 0:5b930e09bd6e 13 * http://www.pololu.com/
bclaus 0:5b930e09bd6e 14 * http://forum.pololu.com/
bclaus 0:5b930e09bd6e 15 *
bclaus 0:5b930e09bd6e 16 * Permission is hereby granted, free of charge, to any person
bclaus 0:5b930e09bd6e 17 * obtaining a copy of this software and associated documentation
bclaus 0:5b930e09bd6e 18 * files (the "Software"), to deal in the Software without
bclaus 0:5b930e09bd6e 19 * restriction, including without limitation the rights to use,
bclaus 0:5b930e09bd6e 20 * copy, modify, merge, publish, distribute, sublicense, and/or sell
bclaus 0:5b930e09bd6e 21 * copies of the Software, and to permit persons to whom the
bclaus 0:5b930e09bd6e 22 * Software is furnished to do so, subject to the following
bclaus 0:5b930e09bd6e 23 * conditions:
bclaus 0:5b930e09bd6e 24 *
bclaus 0:5b930e09bd6e 25 * The above copyright notice and this permission notice shall be
bclaus 0:5b930e09bd6e 26 * included in all copies or substantial portions of the Software.
bclaus 0:5b930e09bd6e 27 *
bclaus 0:5b930e09bd6e 28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
bclaus 0:5b930e09bd6e 29 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
bclaus 0:5b930e09bd6e 30 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
bclaus 0:5b930e09bd6e 31 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
bclaus 0:5b930e09bd6e 32 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
bclaus 0:5b930e09bd6e 33 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
bclaus 0:5b930e09bd6e 34 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
bclaus 0:5b930e09bd6e 35 * OTHER DEALINGS IN THE SOFTWARE.
bclaus 0:5b930e09bd6e 36 */
bclaus 0:5b930e09bd6e 37 #include "mbed.h"
bclaus 0:5b930e09bd6e 38 #include "LSM303D.h"
bclaus 0:5b930e09bd6e 39
bclaus 0:5b930e09bd6e 40
bclaus 0:5b930e09bd6e 41
bclaus 0:5b930e09bd6e 42 enum REG_ADDRS {
vinajarr 2:fcd607760ee8 43
bclaus 0:5b930e09bd6e 44 /* --- Mag --- */
bclaus 0:5b930e09bd6e 45 OUT_X_M = 0x08,
bclaus 0:5b930e09bd6e 46 OUT_Y_M = 0x0A,
bclaus 0:5b930e09bd6e 47 OUT_Z_M = 0x0C,
vinajarr 2:fcd607760ee8 48 INT_CTRL_M = 0x12,
bclaus 0:5b930e09bd6e 49 /* --- Acc --- */
bclaus 0:5b930e09bd6e 50 OUT_X_A = 0x28,
bclaus 0:5b930e09bd6e 51 OUT_Y_A = 0x2A,
bclaus 0:5b930e09bd6e 52 OUT_Z_A = 0x2C,
bclaus 0:5b930e09bd6e 53 //
vinajarr 1:27d47f5de82c 54 CTRL0 = 0x1F,
vinajarr 1:27d47f5de82c 55 CTRL1 = 0x20,
vinajarr 1:27d47f5de82c 56 CTRL2 = 0x21,
vinajarr 1:27d47f5de82c 57 CTRL3 = 0x22,
vinajarr 1:27d47f5de82c 58 CTRL4 = 0x23,
vinajarr 1:27d47f5de82c 59 CTRL5 = 0x24,
vinajarr 1:27d47f5de82c 60 CTRL6 = 0x25,
vinajarr 1:27d47f5de82c 61 CTRL7 = 0x26
bclaus 0:5b930e09bd6e 62 };
bclaus 0:5b930e09bd6e 63
bclaus 0:5b930e09bd6e 64 bool LSM303D::write_reg(int addr_i2c,int addr_reg, char v)
bclaus 0:5b930e09bd6e 65 {
bclaus 0:5b930e09bd6e 66 char data[2] = {addr_reg, v};
vinajarr 2:fcd607760ee8 67 return LSM303D::_LSM303->write(addr_i2c, data, 2) == 0;
bclaus 0:5b930e09bd6e 68 }
bclaus 0:5b930e09bd6e 69
bclaus 0:5b930e09bd6e 70 bool LSM303D::read_reg(int addr_i2c,int addr_reg, char *v)
bclaus 0:5b930e09bd6e 71 {
bclaus 0:5b930e09bd6e 72 char data = addr_reg;
bclaus 0:5b930e09bd6e 73 bool result = false;
bclaus 0:5b930e09bd6e 74
vinajarr 2:fcd607760ee8 75 //__disable_irq();
vinajarr 2:fcd607760ee8 76 if ((_LSM303->write(addr_i2c, &data, 1) == 0) && (_LSM303->read(addr_i2c, &data, 1) == 0)){
bclaus 0:5b930e09bd6e 77 *v = data;
bclaus 0:5b930e09bd6e 78 result = true;
bclaus 0:5b930e09bd6e 79 }
vinajarr 2:fcd607760ee8 80 //__enable_irq();
bclaus 0:5b930e09bd6e 81 return result;
bclaus 0:5b930e09bd6e 82 }
bclaus 0:5b930e09bd6e 83
vinajarr 2:fcd607760ee8 84 LSM303D::LSM303D(I2C * puntero):
vinajarr 2:fcd607760ee8 85 _LSM303(puntero)
bclaus 0:5b930e09bd6e 86 {
bclaus 0:5b930e09bd6e 87 char reg_v;
vinajarr 2:fcd607760ee8 88
vinajarr 2:fcd607760ee8 89 reg_v = 0x0; /* 400 Hz X/Y/Z axis enable. */
vinajarr 2:fcd607760ee8 90 write_reg(addr_acc_mag,INT_CTRL_M,reg_v);
bclaus 0:5b930e09bd6e 91
bclaus 0:5b930e09bd6e 92 //acc
vinajarr 2:fcd607760ee8 93 reg_v = 0x87; /* 400 Hz X/Y/Z axis enable. */
bclaus 0:5b930e09bd6e 94 write_reg(addr_acc_mag,CTRL1,reg_v);
vinajarr 2:fcd607760ee8 95 reg_v = 0x04; /* Interrupt Data Redy */
vinajarr 2:fcd607760ee8 96 write_reg(addr_acc_mag,CTRL3,reg_v);
vinajarr 1:27d47f5de82c 97
vinajarr 2:fcd607760ee8 98 reg_v = 0x00; //+-2g range
vinajarr 1:27d47f5de82c 99 write_reg(addr_acc_mag,CTRL2,reg_v);
vinajarr 1:27d47f5de82c 100
bclaus 0:5b930e09bd6e 101 /* -- mag --- */
vinajarr 2:fcd607760ee8 102 reg_v = 0x80; //M_RES = 11 (high resolution mode); M_ODR = 100 (50 Hz ODR)
bclaus 0:5b930e09bd6e 103 write_reg(addr_acc_mag,CTRL5,reg_v);
bclaus 0:5b930e09bd6e 104
vinajarr 2:fcd607760ee8 105 reg_v = 0x04; //T_only Power Down Magnetometer
vinajarr 1:27d47f5de82c 106 write_reg(addr_acc_mag,CTRL7,reg_v);
vinajarr 2:fcd607760ee8 107
bclaus 0:5b930e09bd6e 108 }
bclaus 0:5b930e09bd6e 109
bclaus 0:5b930e09bd6e 110
vinajarr 2:fcd607760ee8 111 bool LSM303D::read(double *ax, double *ay, double *az, double *mx, double *my, double *mz) {
bclaus 0:5b930e09bd6e 112 char acc[6], mag[6];
bclaus 0:5b930e09bd6e 113
bclaus 0:5b930e09bd6e 114 if (recv(addr_acc_mag, OUT_X_A, acc, 6) && recv(addr_acc_mag, OUT_X_M, mag, 6)) {
vinajarr 2:fcd607760ee8 115 *ax = double(short(acc[1] << 8 | acc[0]))*0.000061; //32768/4=8192
vinajarr 2:fcd607760ee8 116 *ay = double(short(acc[3] << 8 | acc[2]))*0.000061;
vinajarr 2:fcd607760ee8 117 *az = double(short(acc[5] << 8 | acc[4]))*0.000061;
bclaus 0:5b930e09bd6e 118 //full scale magnetic readings are from -2048 to 2047
bclaus 0:5b930e09bd6e 119 //gain is x,y =1100; z = 980 LSB/gauss
vinajarr 2:fcd607760ee8 120 *mx = double(short(mag[0] << 8 | mag[1]))/1100;
vinajarr 2:fcd607760ee8 121 *mz = double(short(mag[2] << 8 | mag[3]))/980;
vinajarr 2:fcd607760ee8 122 *my = double(short(mag[4] << 8 | mag[5]))/1100;
bclaus 0:5b930e09bd6e 123
bclaus 0:5b930e09bd6e 124 return true;
bclaus 0:5b930e09bd6e 125 }
bclaus 0:5b930e09bd6e 126
bclaus 0:5b930e09bd6e 127 return false;
bclaus 0:5b930e09bd6e 128 }
bclaus 0:5b930e09bd6e 129
vinajarr 1:27d47f5de82c 130 bool LSM303D::readA(double *ax, double *ay, double *az) {
vinajarr 1:27d47f5de82c 131 char acc[6];
vinajarr 1:27d47f5de82c 132
vinajarr 1:27d47f5de82c 133 if (recv(addr_acc_mag, OUT_X_A, acc, 6)) {
vinajarr 1:27d47f5de82c 134 *ax = double(short(acc[1] << 8 | acc[0]))*0.000061; //32768/4=8192
vinajarr 1:27d47f5de82c 135 *ay = double(short(acc[3] << 8 | acc[2]))*0.000061;
vinajarr 2:fcd607760ee8 136 *az = double(short(acc[5] << 8 | acc[4]))*0.000061;
bclaus 0:5b930e09bd6e 137
vinajarr 1:27d47f5de82c 138 return true;
vinajarr 1:27d47f5de82c 139 }
vinajarr 1:27d47f5de82c 140
vinajarr 1:27d47f5de82c 141 return false;
vinajarr 1:27d47f5de82c 142 }
bclaus 0:5b930e09bd6e 143 bool LSM303D::recv(char sad, char sub, char *buf, int length) {
bclaus 0:5b930e09bd6e 144 if (length > 1) sub |= 0x80;
bclaus 0:5b930e09bd6e 145
vinajarr 2:fcd607760ee8 146 return _LSM303->write(sad, &sub, 1, true) == 0 && _LSM303->read(sad, buf, length) == 0;
bclaus 0:5b930e09bd6e 147 }