Control accelerometer FXLS8471Q

Fork of FXLS8471Q by Jim Carver

Committer:
vinajarr
Date:
Thu Jan 18 07:53:41 2018 +0000
Revision:
4:b6e0c4ad3aee
Parent:
2:6aae25fe9ab4
implement interrupt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 1:c80be04510fe 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
JimCarver 1:c80be04510fe 2 *
JimCarver 1:c80be04510fe 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
JimCarver 1:c80be04510fe 4 * and associated documentation files (the "Software"), to deal in the Software without
JimCarver 1:c80be04510fe 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
JimCarver 1:c80be04510fe 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
JimCarver 1:c80be04510fe 7 * Software is furnished to do so, subject to the following conditions:
JimCarver 1:c80be04510fe 8 *
JimCarver 1:c80be04510fe 9 * The above copyright notice and this permission notice shall be included in all copies or
JimCarver 1:c80be04510fe 10 * substantial portions of the Software.
JimCarver 1:c80be04510fe 11 *
JimCarver 1:c80be04510fe 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
JimCarver 1:c80be04510fe 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
JimCarver 1:c80be04510fe 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
JimCarver 1:c80be04510fe 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
JimCarver 1:c80be04510fe 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
JimCarver 1:c80be04510fe 17 */
JimCarver 1:c80be04510fe 18
JimCarver 1:c80be04510fe 19
screamer 2:6aae25fe9ab4 20 #include "FXLS8471Q.h"
screamer 2:6aae25fe9ab4 21 #define UINT14_MAX 16383
screamer 2:6aae25fe9ab4 22
screamer 2:6aae25fe9ab4 23 FXLS8471Q::FXLS8471Q(PinName mosi, PinName miso, PinName sck, PinName cs) : _spi(mosi, miso, sck), _spi_cs(cs)
screamer 2:6aae25fe9ab4 24 {
JimCarver 0:f89f2dc4b003 25 _spi_cs = 1;
JimCarver 0:f89f2dc4b003 26 wait(0.1);
JimCarver 0:f89f2dc4b003 27 begin();
JimCarver 0:f89f2dc4b003 28 }
JimCarver 0:f89f2dc4b003 29
JimCarver 0:f89f2dc4b003 30 void FXLS8471Q::RegWrite( int reg, int *d, int len)
JimCarver 0:f89f2dc4b003 31 {
JimCarver 0:f89f2dc4b003 32 int ob[2];
JimCarver 0:f89f2dc4b003 33 int c = 0;
JimCarver 0:f89f2dc4b003 34 ob[1] = 0;
JimCarver 0:f89f2dc4b003 35 ob[0] = reg + 128;
JimCarver 0:f89f2dc4b003 36 _spi_cs = 0;
JimCarver 0:f89f2dc4b003 37 _spi.write(ob[0]);
JimCarver 0:f89f2dc4b003 38 _spi.write(ob[1]);
JimCarver 0:f89f2dc4b003 39 while(c < len) _spi.write(d[c++]);
JimCarver 0:f89f2dc4b003 40 _spi_cs = 1;
JimCarver 0:f89f2dc4b003 41 }
screamer 2:6aae25fe9ab4 42
JimCarver 0:f89f2dc4b003 43 void FXLS8471Q::RegRead( int reg, int *d, int len)
JimCarver 0:f89f2dc4b003 44 {
JimCarver 0:f89f2dc4b003 45 int ob[2];
JimCarver 0:f89f2dc4b003 46 int c = 0;
JimCarver 0:f89f2dc4b003 47 ob[0] = reg;
JimCarver 0:f89f2dc4b003 48 ob[1] = 0;
JimCarver 0:f89f2dc4b003 49 _spi_cs = 0;
JimCarver 0:f89f2dc4b003 50 _spi.write(ob[0]);
JimCarver 0:f89f2dc4b003 51 _spi.write(ob[1]);
JimCarver 0:f89f2dc4b003 52 while(c < len) d[c++] = _spi.write(0xff);
JimCarver 0:f89f2dc4b003 53 _spi_cs = 1;
JimCarver 0:f89f2dc4b003 54 }
JimCarver 0:f89f2dc4b003 55
JimCarver 1:c80be04510fe 56 char FXLS8471Q::getWhoAmI(void)
JimCarver 1:c80be04510fe 57 {
JimCarver 1:c80be04510fe 58 int d;
JimCarver 1:c80be04510fe 59 RegRead( FXLS8471Q_WHOAMI, &d, 1);
JimCarver 1:c80be04510fe 60 return((char) d);
JimCarver 1:c80be04510fe 61 }
JimCarver 1:c80be04510fe 62
JimCarver 1:c80be04510fe 63
JimCarver 0:f89f2dc4b003 64 void FXLS8471Q::begin(void)
JimCarver 0:f89f2dc4b003 65 {
JimCarver 0:f89f2dc4b003 66 int databyte;
JimCarver 0:f89f2dc4b003 67
JimCarver 0:f89f2dc4b003 68 // write 0000 0000 = 0x00 to accelerometer control register 1 to place FXLS8471Q into
JimCarver 0:f89f2dc4b003 69 // standby
JimCarver 0:f89f2dc4b003 70 // [7-1] = 0000 000
JimCarver 0:f89f2dc4b003 71 // [0]: active=0
JimCarver 0:f89f2dc4b003 72 databyte = 0x00;
JimCarver 0:f89f2dc4b003 73 RegWrite(FXLS8471Q_CTRL_REG1, &databyte, 1);
vinajarr 4:b6e0c4ad3aee 74
vinajarr 4:b6e0c4ad3aee 75 // write 0001 0010 = 0x12 to accelerometer control register 2 to place FXLS8471Q into
vinajarr 4:b6e0c4ad3aee 76 // [4:3]: smods=10 //high resolution
vinajarr 4:b6e0c4ad3aee 77 // [2]: auto-Sleep=0 // auto sleep off
vinajarr 4:b6e0c4ad3aee 78 // [1:0]: mods=10 //high resolution
vinajarr 4:b6e0c4ad3aee 79
vinajarr 4:b6e0c4ad3aee 80 databyte=0x12;
vinajarr 4:b6e0c4ad3aee 81 RegWrite(FXLS8471Q_CTRL_REG2, &databyte, 1);
vinajarr 4:b6e0c4ad3aee 82
vinajarr 4:b6e0c4ad3aee 83 //FXLS8471Q_CTRL_REG3 pines de interrupcion activos a nivel bajo y modo push-pull (no hace falta resistencia pull up)
vinajarr 4:b6e0c4ad3aee 84
vinajarr 4:b6e0c4ad3aee 85 databyte=0x01;
vinajarr 4:b6e0c4ad3aee 86 RegWrite(FXLS8471Q_CTRL_REG4, &databyte, 1); //activar interrupcion data-redy
vinajarr 4:b6e0c4ad3aee 87
vinajarr 4:b6e0c4ad3aee 88 databyte=0x01;
vinajarr 4:b6e0c4ad3aee 89 RegWrite(FXLS8471Q_CTRL_REG5, &databyte, 1); //routed to INT1 interrupcion data-redy
vinajarr 4:b6e0c4ad3aee 90
vinajarr 4:b6e0c4ad3aee 91 databyte=0x01;
vinajarr 4:b6e0c4ad3aee 92 RegWrite(FXLS8471Q_CTRL_REG5, &databyte, 1); //routed to INT1 interrupcion data-redy
vinajarr 4:b6e0c4ad3aee 93
vinajarr 4:b6e0c4ad3aee 94 // write 0001 0000= 0x01 to XYZ_DATA_CFG register /high pass filter enable
JimCarver 0:f89f2dc4b003 95 // [7]: reserved
JimCarver 0:f89f2dc4b003 96 // [6]: reserved
JimCarver 0:f89f2dc4b003 97 // [5]: reserved
vinajarr 4:b6e0c4ad3aee 98 // [4]: hpf_out=1
JimCarver 0:f89f2dc4b003 99 // [3]: reserved
JimCarver 0:f89f2dc4b003 100 // [2]: reserved
JimCarver 0:f89f2dc4b003 101 // [1-0]: fs=00 for accelerometer range of +/-2g with 0.244mg/LSB
vinajarr 4:b6e0c4ad3aee 102 databyte = 0x10;
JimCarver 0:f89f2dc4b003 103 RegWrite(FXLS8471Q_XYZ_DATA_CFG, &databyte, 1);
vinajarr 4:b6e0c4ad3aee 104
vinajarr 4:b6e0c4ad3aee 105 atabyte = 0x03; // high pass filter 2 Hz
vinajarr 4:b6e0c4ad3aee 106 RegWrite(FXLS8471Q_HP_FILTER_CUTOFF, &databyte, 1);
JimCarver 0:f89f2dc4b003 107
vinajarr 4:b6e0c4ad3aee 108 // write 0000 1101b = 0x15 to accelerometer control register 1
JimCarver 0:f89f2dc4b003 109 // [7-6]: aslp_rate=00
vinajarr 4:b6e0c4ad3aee 110 // [5-3]: dr=001 for 200Hz data rate
JimCarver 0:f89f2dc4b003 111 // [2]: lnoise=1 for low noise mode
JimCarver 0:f89f2dc4b003 112 // [1]: f_read=0 for normal 16 bit reads
JimCarver 0:f89f2dc4b003 113 // [0]: active=1 to take the part out of standby and enable sampling
JimCarver 0:f89f2dc4b003 114 databyte = 0x15;
screamer 2:6aae25fe9ab4 115 RegWrite(FXLS8471Q_CTRL_REG1, &databyte, 1);
JimCarver 0:f89f2dc4b003 116 }
JimCarver 0:f89f2dc4b003 117
JimCarver 0:f89f2dc4b003 118 void FXLS8471Q::ReadXYZ(float * fdata)
JimCarver 0:f89f2dc4b003 119 {
screamer 2:6aae25fe9ab4 120 int raw[7];
screamer 2:6aae25fe9ab4 121 int16_t ix, iy, iz;
screamer 2:6aae25fe9ab4 122 RegRead(FXLS8471Q_STATUS, raw, 7);
JimCarver 0:f89f2dc4b003 123
screamer 2:6aae25fe9ab4 124 ix = ((raw[1] * 256) + raw[2]);// / 4;
screamer 2:6aae25fe9ab4 125 iy = ((raw[3] * 256) + raw[4]);// / 4;
screamer 2:6aae25fe9ab4 126 iz = ((raw[5] * 256) + raw[6]);// / 4;
screamer 2:6aae25fe9ab4 127 fdata[0] = ((float) ix) / 16384.0;
screamer 2:6aae25fe9ab4 128 fdata[1] = ((float) iy) / 16384.0;
screamer 2:6aae25fe9ab4 129 fdata[2] = ((float) iz) / 16384.0;
JimCarver 0:f89f2dc4b003 130 }
JimCarver 1:c80be04510fe 131
JimCarver 1:c80be04510fe 132 void FXLS8471Q::ReadXYZraw(int16_t * d)
JimCarver 1:c80be04510fe 133 {
screamer 2:6aae25fe9ab4 134 int res[6];
screamer 2:6aae25fe9ab4 135 int16_t acc;
JimCarver 1:c80be04510fe 136 RegRead(FXLS8471Q_OUT_X_MSB, res, 6);
JimCarver 1:c80be04510fe 137
JimCarver 1:c80be04510fe 138 acc = (res[0] << 6) | (res[1] >> 2);
JimCarver 1:c80be04510fe 139 if (acc > UINT14_MAX/2)
JimCarver 1:c80be04510fe 140 acc -= UINT14_MAX;
JimCarver 1:c80be04510fe 141 d[0] = acc;
JimCarver 1:c80be04510fe 142 acc = (res[2] << 6) | (res[3] >> 2);
JimCarver 1:c80be04510fe 143 if (acc > UINT14_MAX/2)
JimCarver 1:c80be04510fe 144 acc -= UINT14_MAX;
JimCarver 1:c80be04510fe 145 d[1] = acc;
JimCarver 1:c80be04510fe 146 acc = (res[4] << 6) | (res[5] >> 2);
JimCarver 1:c80be04510fe 147 if (acc > UINT14_MAX/2)
JimCarver 1:c80be04510fe 148 acc -= UINT14_MAX;
JimCarver 1:c80be04510fe 149 d[2] = acc;
JimCarver 1:c80be04510fe 150 }
screamer 2:6aae25fe9ab4 151