Ahmad Alkaff / Mbed 2 deprecated CS3237

Dependencies:   mbed

Committer:
neilishere
Date:
Thu Oct 31 12:17:50 2019 +0000
Revision:
8:9a1d472648dc
Parent:
6:7f750ae168b6
Child:
9:b2cd18ee0056
Update frequency of accelerometer from 50Hz to 100Hz and maintain frequency of ECG at 128sps

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmadAlkaff 0:7b5d37ca532f 1 /*******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
AhmadAlkaff 0:7b5d37ca532f 3 *
AhmadAlkaff 0:7b5d37ca532f 4 * Permission is hereby granted, free of charge, to any person obtaining a
AhmadAlkaff 0:7b5d37ca532f 5 * copy of this software and associated documentation files (the "Software"),
AhmadAlkaff 0:7b5d37ca532f 6 * to deal in the Software without restriction, including without limitation
AhmadAlkaff 0:7b5d37ca532f 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
AhmadAlkaff 0:7b5d37ca532f 8 * and/or sell copies of the Software, and to permit persons to whom the
AhmadAlkaff 0:7b5d37ca532f 9 * Software is furnished to do so, subject to the following conditions:
AhmadAlkaff 0:7b5d37ca532f 10 *
AhmadAlkaff 0:7b5d37ca532f 11 * The above copyright notice and this permission notice shall be included
AhmadAlkaff 0:7b5d37ca532f 12 * in all copies or substantial portions of the Software.
AhmadAlkaff 0:7b5d37ca532f 13 *
AhmadAlkaff 0:7b5d37ca532f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
AhmadAlkaff 0:7b5d37ca532f 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
AhmadAlkaff 0:7b5d37ca532f 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
AhmadAlkaff 0:7b5d37ca532f 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
AhmadAlkaff 0:7b5d37ca532f 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
AhmadAlkaff 0:7b5d37ca532f 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
AhmadAlkaff 0:7b5d37ca532f 20 * OTHER DEALINGS IN THE SOFTWARE.
AhmadAlkaff 0:7b5d37ca532f 21 *
AhmadAlkaff 0:7b5d37ca532f 22 * Except as contained in this notice, the name of Maxim Integrated
AhmadAlkaff 0:7b5d37ca532f 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
AhmadAlkaff 0:7b5d37ca532f 24 * Products, Inc. Branding Policy.
AhmadAlkaff 0:7b5d37ca532f 25 *
AhmadAlkaff 0:7b5d37ca532f 26 * The mere transfer of this software does not imply any licenses
AhmadAlkaff 0:7b5d37ca532f 27 * of trade secrets, proprietary technology, copyrights, patents,
AhmadAlkaff 0:7b5d37ca532f 28 * trademarks, maskwork rights, or any other form of intellectual
AhmadAlkaff 0:7b5d37ca532f 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
AhmadAlkaff 0:7b5d37ca532f 30 * ownership rights.
AhmadAlkaff 0:7b5d37ca532f 31 *******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 32 */
AhmadAlkaff 0:7b5d37ca532f 33
AhmadAlkaff 0:7b5d37ca532f 34 #include "LIS2DH.h"
AhmadAlkaff 0:7b5d37ca532f 35 //#include "Streaming.h"
AhmadAlkaff 0:7b5d37ca532f 36 //#include "Peripherals.h"
AhmadAlkaff 0:7b5d37ca532f 37
AhmadAlkaff 0:7b5d37ca532f 38 void lis2dh_int_handler(void);
AhmadAlkaff 0:7b5d37ca532f 39 /**
AhmadAlkaff 0:7b5d37ca532f 40 * @brief buffer array to hold fifo contents for packetizing
AhmadAlkaff 0:7b5d37ca532f 41 */
AhmadAlkaff 0:7b5d37ca532f 42 uint32_t lis2dh_buffer[LIS2DH_MAX_DATA_SIZE];
AhmadAlkaff 0:7b5d37ca532f 43
AhmadAlkaff 0:7b5d37ca532f 44 int16_t motion_cached[3];
AhmadAlkaff 0:7b5d37ca532f 45 LIS2DH *LIS2DH::instance = NULL;
AhmadAlkaff 0:7b5d37ca532f 46
AhmadAlkaff 0:7b5d37ca532f 47 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 48 LIS2DH::LIS2DH(PinName sda, PinName scl, int slaveAddress) :
AhmadAlkaff 0:7b5d37ca532f 49 slaveAddress(slaveAddress) {
AhmadAlkaff 0:7b5d37ca532f 50 i2c = new I2C(sda, scl);
AhmadAlkaff 0:7b5d37ca532f 51 i2c->frequency(400000);
AhmadAlkaff 0:7b5d37ca532f 52 isOwner = true;
AhmadAlkaff 0:7b5d37ca532f 53 instance = this;
AhmadAlkaff 0:7b5d37ca532f 54 }
AhmadAlkaff 0:7b5d37ca532f 55
AhmadAlkaff 0:7b5d37ca532f 56 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 57 LIS2DH::LIS2DH(I2C *i2c, int slaveAddress) :
AhmadAlkaff 0:7b5d37ca532f 58 slaveAddress(slaveAddress) {
AhmadAlkaff 0:7b5d37ca532f 59 this->i2c = i2c;
AhmadAlkaff 0:7b5d37ca532f 60 i2c->frequency(400000);
AhmadAlkaff 0:7b5d37ca532f 61 isOwner = false;
AhmadAlkaff 0:7b5d37ca532f 62 instance = this;
AhmadAlkaff 0:7b5d37ca532f 63 }
AhmadAlkaff 0:7b5d37ca532f 64
AhmadAlkaff 0:7b5d37ca532f 65 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 66 LIS2DH::~LIS2DH(void) {
AhmadAlkaff 0:7b5d37ca532f 67 if (isOwner == true) {
AhmadAlkaff 0:7b5d37ca532f 68 delete i2c;
AhmadAlkaff 0:7b5d37ca532f 69 }
AhmadAlkaff 0:7b5d37ca532f 70 }
AhmadAlkaff 0:7b5d37ca532f 71
AhmadAlkaff 0:7b5d37ca532f 72 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 73 int LIS2DH::writeReg(LIS2DH_REG_map_t reg, char value) {
AhmadAlkaff 0:7b5d37ca532f 74 int result;
AhmadAlkaff 0:7b5d37ca532f 75 char cmdData[2] = {(char)reg, value};
AhmadAlkaff 0:7b5d37ca532f 76 result = i2c->write(slaveAddress, cmdData, 2);
AhmadAlkaff 0:7b5d37ca532f 77 if (result != 0) {
AhmadAlkaff 0:7b5d37ca532f 78 return -1;
AhmadAlkaff 0:7b5d37ca532f 79 }
AhmadAlkaff 0:7b5d37ca532f 80 return 0;
AhmadAlkaff 0:7b5d37ca532f 81 }
AhmadAlkaff 0:7b5d37ca532f 82
AhmadAlkaff 0:7b5d37ca532f 83 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 84 int LIS2DH::readReg(LIS2DH_REG_map_t reg, char *value) {
AhmadAlkaff 0:7b5d37ca532f 85 int result;
AhmadAlkaff 0:7b5d37ca532f 86 char cmdData[1] = {(char)reg};
AhmadAlkaff 0:7b5d37ca532f 87
AhmadAlkaff 0:7b5d37ca532f 88 result = i2c->write(slaveAddress, cmdData, 1);
AhmadAlkaff 0:7b5d37ca532f 89 if (result != 0) {
AhmadAlkaff 0:7b5d37ca532f 90 return -1;
AhmadAlkaff 0:7b5d37ca532f 91 }
AhmadAlkaff 0:7b5d37ca532f 92 result = i2c->read(slaveAddress, value, 1);
AhmadAlkaff 0:7b5d37ca532f 93 if (result != 0) {
AhmadAlkaff 0:7b5d37ca532f 94 return -1;
AhmadAlkaff 0:7b5d37ca532f 95 }
AhmadAlkaff 0:7b5d37ca532f 96 return 0;
AhmadAlkaff 0:7b5d37ca532f 97 }
AhmadAlkaff 0:7b5d37ca532f 98
AhmadAlkaff 0:7b5d37ca532f 99 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 100 static void I2c_Reset(uint8_t index, int speed) {
AhmadAlkaff 0:7b5d37ca532f 101 mxc_i2cm_regs_t *regs = MXC_I2CM_GET_I2CM(index);
AhmadAlkaff 0:7b5d37ca532f 102 /* reset module */
AhmadAlkaff 0:7b5d37ca532f 103 regs->ctrl = MXC_F_I2CM_CTRL_MSTR_RESET_EN;
AhmadAlkaff 0:7b5d37ca532f 104 regs->ctrl = 0;
AhmadAlkaff 0:7b5d37ca532f 105 /* enable tx_fifo and rx_fifo */
AhmadAlkaff 0:7b5d37ca532f 106 regs->ctrl |= (MXC_F_I2CM_CTRL_TX_FIFO_EN | MXC_F_I2CM_CTRL_RX_FIFO_EN);
AhmadAlkaff 0:7b5d37ca532f 107 }
AhmadAlkaff 0:7b5d37ca532f 108
AhmadAlkaff 0:7b5d37ca532f 109 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 110 /// Interrupt handler, this empties the hardware fifo and packetizes it for
AhmadAlkaff 0:7b5d37ca532f 111 /// streaming
AhmadAlkaff 0:7b5d37ca532f 112 void LIS2DH::int_handler(void) {
AhmadAlkaff 0:7b5d37ca532f 113 char fifo_src;
AhmadAlkaff 0:7b5d37ca532f 114 int16_t valueX;
AhmadAlkaff 0:7b5d37ca532f 115 int16_t valueY;
AhmadAlkaff 0:7b5d37ca532f 116 int16_t valueZ;
AhmadAlkaff 0:7b5d37ca532f 117 int num;
AhmadAlkaff 0:7b5d37ca532f 118 int index;
AhmadAlkaff 0:7b5d37ca532f 119
AhmadAlkaff 0:7b5d37ca532f 120 I2c_Reset(2, 1);
AhmadAlkaff 0:7b5d37ca532f 121 num = 0;
AhmadAlkaff 0:7b5d37ca532f 122 index = 0;
AhmadAlkaff 0:7b5d37ca532f 123 fifo_src = 0;
AhmadAlkaff 0:7b5d37ca532f 124 while ((fifo_src & 0x20) != 0x20) {
AhmadAlkaff 0:7b5d37ca532f 125 get_motion_fifo(&valueX, &valueY, &valueZ);
AhmadAlkaff 0:7b5d37ca532f 126 lis2dh_buffer[index++] = valueX;
AhmadAlkaff 0:7b5d37ca532f 127 lis2dh_buffer[index++] = valueY;
AhmadAlkaff 0:7b5d37ca532f 128 lis2dh_buffer[index++] = valueZ;
AhmadAlkaff 0:7b5d37ca532f 129 readReg(LIS2DH_FIFO_SRC_REG, &fifo_src);
AhmadAlkaff 0:7b5d37ca532f 130 num++;
AhmadAlkaff 0:7b5d37ca532f 131 if (num >= 32) {
AhmadAlkaff 0:7b5d37ca532f 132 break;
AhmadAlkaff 0:7b5d37ca532f 133 }
AhmadAlkaff 0:7b5d37ca532f 134 }
AhmadAlkaff 0:7b5d37ca532f 135 motion_cached[0] = valueX;
AhmadAlkaff 0:7b5d37ca532f 136 motion_cached[1] = valueY;
AhmadAlkaff 0:7b5d37ca532f 137 motion_cached[2] = valueZ;
AhmadAlkaff 0:7b5d37ca532f 138
AhmadAlkaff 0:7b5d37ca532f 139 //StreamPacketUint32(PACKET_LIS2DH, lis2dh_buffer, index);
AhmadAlkaff 0:7b5d37ca532f 140 }
AhmadAlkaff 0:7b5d37ca532f 141
AhmadAlkaff 0:7b5d37ca532f 142 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 143 void LIS2DH::init(void) {
AhmadAlkaff 0:7b5d37ca532f 144 stop();
AhmadAlkaff 0:7b5d37ca532f 145 configure_interrupt();
AhmadAlkaff 0:7b5d37ca532f 146 }
AhmadAlkaff 0:7b5d37ca532f 147
AhmadAlkaff 0:7b5d37ca532f 148 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 149 void LIS2DH::configure_interrupt(void) {
AhmadAlkaff 0:7b5d37ca532f 150
AhmadAlkaff 0:7b5d37ca532f 151 lis2dh_ctrl_reg6_t ctrl_reg6;
AhmadAlkaff 0:7b5d37ca532f 152 ///< interrupt enabled on INT1, interrupt active low
AhmadAlkaff 0:7b5d37ca532f 153 ctrl_reg6.all = 0;
AhmadAlkaff 0:7b5d37ca532f 154 ctrl_reg6.bit.I2_INT1 = 1; ///< interrupt 1 function enabled on int1 pin
AhmadAlkaff 0:7b5d37ca532f 155 ctrl_reg6.bit.H_LACTIVE = 1; ///< interrupt active low
AhmadAlkaff 0:7b5d37ca532f 156 writeReg(LIS2DH_CTRL_REG6, ctrl_reg6.all);
AhmadAlkaff 0:7b5d37ca532f 157 }
AhmadAlkaff 0:7b5d37ca532f 158
AhmadAlkaff 0:7b5d37ca532f 159 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 160 int LIS2DH::initStart(int dataRate, int fifoThreshold) {
AhmadAlkaff 0:7b5d37ca532f 161
AhmadAlkaff 0:7b5d37ca532f 162 lis2dh_ctrl_reg5_t ctrl_reg5;
AhmadAlkaff 0:7b5d37ca532f 163 lis2dh_fifo_ctrl_reg_t fifo_ctrl_reg;
AhmadAlkaff 0:7b5d37ca532f 164 lis2dh_ctrl_reg1_t ctrl_reg1;
AhmadAlkaff 0:7b5d37ca532f 165 lis2dh_ctrl_reg3_t ctrl_reg3;
AhmadAlkaff 0:7b5d37ca532f 166
AhmadAlkaff 0:7b5d37ca532f 167 __disable_irq();
AhmadAlkaff 0:7b5d37ca532f 168
AhmadAlkaff 0:7b5d37ca532f 169 configure_interrupt();
AhmadAlkaff 0:7b5d37ca532f 170 ///
AhmadAlkaff 0:7b5d37ca532f 171 /// enable FIFO
AhmadAlkaff 0:7b5d37ca532f 172 ///
AhmadAlkaff 0:7b5d37ca532f 173 ctrl_reg5.all = 0x0;
AhmadAlkaff 0:7b5d37ca532f 174 ctrl_reg5.bit.FIFO_EN = 0x1;
AhmadAlkaff 0:7b5d37ca532f 175 if (writeReg(LIS2DH_CTRL_REG5, ctrl_reg5.all) == -1) {
AhmadAlkaff 0:7b5d37ca532f 176 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 177 return -1;
AhmadAlkaff 0:7b5d37ca532f 178 }
AhmadAlkaff 0:7b5d37ca532f 179
AhmadAlkaff 0:7b5d37ca532f 180 ///
AhmadAlkaff 0:7b5d37ca532f 181 /// set FIFO to stream mode, trigger select INT1
AhmadAlkaff 0:7b5d37ca532f 182 ///
AhmadAlkaff 0:7b5d37ca532f 183 fifo_ctrl_reg.all = 0x0;
AhmadAlkaff 0:7b5d37ca532f 184 fifo_ctrl_reg.bit.FTH = fifoThreshold;
AhmadAlkaff 0:7b5d37ca532f 185 fifo_ctrl_reg.bit.FM = LIS2DH_FIFOMODE_STREAM;
AhmadAlkaff 0:7b5d37ca532f 186 fifo_ctrl_reg.bit.TR = 0x0;
AhmadAlkaff 0:7b5d37ca532f 187 if (writeReg(LIS2DH_FIFO_CTRL_REG, fifo_ctrl_reg.all) == -1) {
AhmadAlkaff 0:7b5d37ca532f 188 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 189 return -1;
AhmadAlkaff 0:7b5d37ca532f 190 }
AhmadAlkaff 0:7b5d37ca532f 191
AhmadAlkaff 0:7b5d37ca532f 192 ///
AhmadAlkaff 0:7b5d37ca532f 193 /// set HR (high resolution)
AhmadAlkaff 0:7b5d37ca532f 194 ///
AhmadAlkaff 6:7f750ae168b6 195 //if (writeReg(LIS2DH_CTRL_REG4, 0x8) == -1) {
AhmadAlkaff 6:7f750ae168b6 196 //__enable_irq();
AhmadAlkaff 6:7f750ae168b6 197 //return -1;
AhmadAlkaff 6:7f750ae168b6 198 //}
AhmadAlkaff 0:7b5d37ca532f 199
AhmadAlkaff 0:7b5d37ca532f 200 ///
AhmadAlkaff 0:7b5d37ca532f 201 /// set the data rate, enable all axis
AhmadAlkaff 0:7b5d37ca532f 202 ///
socrj 3:a7396ed925e6 203 /*
AhmadAlkaff 0:7b5d37ca532f 204 dataRate = dataRate & 0xF;
AhmadAlkaff 0:7b5d37ca532f 205 if (dataRate > 0x9) {
AhmadAlkaff 0:7b5d37ca532f 206 dataRate = 0x9;
AhmadAlkaff 0:7b5d37ca532f 207 }
socrj 3:a7396ed925e6 208 */
AhmadAlkaff 0:7b5d37ca532f 209
neilishere 8:9a1d472648dc 210 //ctrl_reg1.bit.ODR = dataRate; ///< set the data rate
neilishere 8:9a1d472648dc 211 ctrl_reg.bit.ODR0 = 0x1
neilishere 8:9a1d472648dc 212 ctrl_reg.bit.ODR1 = 0x0
neilishere 8:9a1d472648dc 213 ctrl_reg.bit.ODR2 = 0x1
neilishere 8:9a1d472648dc 214 ctrl_reg.bit.ODR3 = 0x0 //Low power mode at 100Hz ODR0-ODR3
AhmadAlkaff 6:7f750ae168b6 215 ctrl_reg1.bit.LPen = 0x1; ///< enable low power
AhmadAlkaff 0:7b5d37ca532f 216 ctrl_reg1.bit.Zen = 0x1; ///< enable z
AhmadAlkaff 0:7b5d37ca532f 217 ctrl_reg1.bit.Yen = 0x1; ///< enable y
AhmadAlkaff 0:7b5d37ca532f 218 ctrl_reg1.bit.Xen = 0x1; ///< enable x
AhmadAlkaff 0:7b5d37ca532f 219 if (writeReg(LIS2DH_CTRL_REG1, ctrl_reg1.all) == -1) {
AhmadAlkaff 0:7b5d37ca532f 220 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 221 return -1;
AhmadAlkaff 0:7b5d37ca532f 222 }
AhmadAlkaff 0:7b5d37ca532f 223
AhmadAlkaff 0:7b5d37ca532f 224 ///
AhmadAlkaff 0:7b5d37ca532f 225 /// enable watermark interrupt
AhmadAlkaff 0:7b5d37ca532f 226 ///
AhmadAlkaff 0:7b5d37ca532f 227 ctrl_reg3.all = 0x00;
AhmadAlkaff 0:7b5d37ca532f 228 ctrl_reg3.bit.I1_WTM = 0x1;
AhmadAlkaff 0:7b5d37ca532f 229 if (writeReg(LIS2DH_CTRL_REG3, ctrl_reg3.all) == -1) {
AhmadAlkaff 0:7b5d37ca532f 230 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 231 return -1;
AhmadAlkaff 0:7b5d37ca532f 232 }
AhmadAlkaff 0:7b5d37ca532f 233 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 234
AhmadAlkaff 0:7b5d37ca532f 235 return 0;
AhmadAlkaff 0:7b5d37ca532f 236 }
AhmadAlkaff 0:7b5d37ca532f 237
AhmadAlkaff 0:7b5d37ca532f 238 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 239 int LIS2DH::detect(char *detected) {
AhmadAlkaff 0:7b5d37ca532f 240 char val;
AhmadAlkaff 0:7b5d37ca532f 241 *detected = 0;
AhmadAlkaff 0:7b5d37ca532f 242 if (readReg(LIS2DH_WHO_AM_I, &val) == -1) {
AhmadAlkaff 0:7b5d37ca532f 243 return -1;
AhmadAlkaff 0:7b5d37ca532f 244 }
AhmadAlkaff 0:7b5d37ca532f 245
AhmadAlkaff 0:7b5d37ca532f 246 if (val == LIS2DH_ID) {
AhmadAlkaff 0:7b5d37ca532f 247 *detected = 1;
AhmadAlkaff 0:7b5d37ca532f 248 }
AhmadAlkaff 0:7b5d37ca532f 249
AhmadAlkaff 0:7b5d37ca532f 250 return 0;
AhmadAlkaff 0:7b5d37ca532f 251 }
AhmadAlkaff 0:7b5d37ca532f 252
AhmadAlkaff 0:7b5d37ca532f 253 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 254 int LIS2DH::get_motion_cached(int16_t *valueX, int16_t *valueY,
AhmadAlkaff 0:7b5d37ca532f 255 int16_t *valueZ) {
AhmadAlkaff 0:7b5d37ca532f 256 *valueX = motion_cached[0];
AhmadAlkaff 0:7b5d37ca532f 257 *valueY = motion_cached[1];
AhmadAlkaff 0:7b5d37ca532f 258 *valueZ = motion_cached[2];
AhmadAlkaff 0:7b5d37ca532f 259 return 0;
AhmadAlkaff 0:7b5d37ca532f 260 }
AhmadAlkaff 0:7b5d37ca532f 261
AhmadAlkaff 0:7b5d37ca532f 262 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 263 int LIS2DH::get_motion_fifo(int16_t *valueX, int16_t *valueY, int16_t *valueZ) {
AhmadAlkaff 0:7b5d37ca532f 264 char reg = LIS2DH_OUT_X_L | 0x80;
AhmadAlkaff 0:7b5d37ca532f 265 char values[6];
AhmadAlkaff 0:7b5d37ca532f 266 int i;
AhmadAlkaff 0:7b5d37ca532f 267
AhmadAlkaff 0:7b5d37ca532f 268 reg = LIS2DH_OUT_X_L;
AhmadAlkaff 0:7b5d37ca532f 269 for (i = 0; i < 6; i++) {
AhmadAlkaff 0:7b5d37ca532f 270 if (readReg((LIS2DH_REG_map_t)reg, &values[i]) != 0) {
AhmadAlkaff 0:7b5d37ca532f 271 return -1;
AhmadAlkaff 0:7b5d37ca532f 272 }
AhmadAlkaff 0:7b5d37ca532f 273 reg++;
AhmadAlkaff 0:7b5d37ca532f 274 }
AhmadAlkaff 0:7b5d37ca532f 275
AhmadAlkaff 0:7b5d37ca532f 276 *valueX = ((short)values[1] << 8) + values[0];
AhmadAlkaff 0:7b5d37ca532f 277 *valueY = ((short)values[3] << 8) + values[2];
AhmadAlkaff 0:7b5d37ca532f 278 *valueZ = ((short)values[5] << 8) + values[4];
AhmadAlkaff 0:7b5d37ca532f 279 motion_cached[0] = *valueX;
AhmadAlkaff 0:7b5d37ca532f 280 motion_cached[1] = *valueY;
AhmadAlkaff 0:7b5d37ca532f 281 motion_cached[2] = *valueZ;
AhmadAlkaff 0:7b5d37ca532f 282 return 0;
AhmadAlkaff 0:7b5d37ca532f 283 }
AhmadAlkaff 0:7b5d37ca532f 284
AhmadAlkaff 0:7b5d37ca532f 285 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 286 char LIS2DH::readId(void) {
AhmadAlkaff 0:7b5d37ca532f 287 char val;
AhmadAlkaff 0:7b5d37ca532f 288 readReg(LIS2DH_WHO_AM_I, &val);
AhmadAlkaff 0:7b5d37ca532f 289 return val;
AhmadAlkaff 0:7b5d37ca532f 290 }
AhmadAlkaff 0:7b5d37ca532f 291
AhmadAlkaff 0:7b5d37ca532f 292 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 293 void LIS2DH::stop(void) {
AhmadAlkaff 0:7b5d37ca532f 294 __disable_irq();
AhmadAlkaff 0:7b5d37ca532f 295 writeReg(LIS2DH_CTRL_REG3, 0x00); // Disable watermark interrupt
AhmadAlkaff 0:7b5d37ca532f 296 writeReg(LIS2DH_CTRL_REG1, 0x00); // Data rate = 0Hz
AhmadAlkaff 0:7b5d37ca532f 297 writeReg(LIS2DH_FIFO_CTRL_REG,
AhmadAlkaff 0:7b5d37ca532f 298 0x00); // set to bypass mode... clears FIFO_SRC_REG
AhmadAlkaff 0:7b5d37ca532f 299 __enable_irq();
AhmadAlkaff 0:7b5d37ca532f 300 }
AhmadAlkaff 0:7b5d37ca532f 301
AhmadAlkaff 0:7b5d37ca532f 302 //******************************************************************************
AhmadAlkaff 0:7b5d37ca532f 303 void LIS2DHIntHandler(void) {
AhmadAlkaff 0:7b5d37ca532f 304 char value;
AhmadAlkaff 0:7b5d37ca532f 305 ///
AhmadAlkaff 0:7b5d37ca532f 306 /// read the data rate axis enable register, if this is zero then just return,
AhmadAlkaff 0:7b5d37ca532f 307 /// we are not ready for interrupts
AhmadAlkaff 0:7b5d37ca532f 308 ///
AhmadAlkaff 0:7b5d37ca532f 309 LIS2DH::instance->readReg(LIS2DH::LIS2DH_CTRL_REG1, &value);
AhmadAlkaff 0:7b5d37ca532f 310 if (value == 0x0) {
AhmadAlkaff 0:7b5d37ca532f 311 return;
AhmadAlkaff 0:7b5d37ca532f 312 }
AhmadAlkaff 0:7b5d37ca532f 313 LIS2DH::instance->int_handler();
AhmadAlkaff 0:7b5d37ca532f 314 }