Library for H3LIS331DL

Committer:
j3
Date:
Fri Apr 28 00:07:39 2017 +0000
Revision:
0:915a712ec85a
init commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 0:915a712ec85a 1 /******************************************************************************
j3 0:915a712ec85a 2 * MIT License
j3 0:915a712ec85a 3 *
j3 0:915a712ec85a 4 * Copyright (c) 2017 Justin J. Jordan
j3 0:915a712ec85a 5 *
j3 0:915a712ec85a 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
j3 0:915a712ec85a 7 * of this software and associated documentation files (the "Software"), to deal
j3 0:915a712ec85a 8 * in the Software without restriction, including without limitation the rights
j3 0:915a712ec85a 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
j3 0:915a712ec85a 10 * copies of the Software, and to permit persons to whom the Software is
j3 0:915a712ec85a 11 * furnished to do so, subject to the following conditions:
j3 0:915a712ec85a 12
j3 0:915a712ec85a 13 * The above copyright notice and this permission notice shall be included in all
j3 0:915a712ec85a 14 * copies or substantial portions of the Software.
j3 0:915a712ec85a 15
j3 0:915a712ec85a 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
j3 0:915a712ec85a 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
j3 0:915a712ec85a 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
j3 0:915a712ec85a 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
j3 0:915a712ec85a 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
j3 0:915a712ec85a 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
j3 0:915a712ec85a 22 * SOFTWARE.
j3 0:915a712ec85a 23 ******************************************************************************/
j3 0:915a712ec85a 24
j3 0:915a712ec85a 25
j3 0:915a712ec85a 26 #include "H3LIS331DL.h"
j3 0:915a712ec85a 27
j3 0:915a712ec85a 28
j3 0:915a712ec85a 29 //************************** Base Class member fxs *****************************
j3 0:915a712ec85a 30 int32_t H3LIS331DL::getDeviceId(uint8_t &data)
j3 0:915a712ec85a 31 {
j3 0:915a712ec85a 32 uint8_t local_data;
j3 0:915a712ec85a 33
j3 0:915a712ec85a 34 int32_t rtn_val = readRegister(WHO_AM_I, local_data);
j3 0:915a712ec85a 35 if(rtn_val == 0)
j3 0:915a712ec85a 36 {
j3 0:915a712ec85a 37 data = local_data;
j3 0:915a712ec85a 38 }
j3 0:915a712ec85a 39
j3 0:915a712ec85a 40 return rtn_val;
j3 0:915a712ec85a 41 }
j3 0:915a712ec85a 42
j3 0:915a712ec85a 43
j3 0:915a712ec85a 44 //******************************************************************************
j3 0:915a712ec85a 45 int32_t H3LIS331DL::readControlRegisters(ControlRegisters_s &controlRegisters)
j3 0:915a712ec85a 46 {
j3 0:915a712ec85a 47 uint8_t data[5];
j3 0:915a712ec85a 48
j3 0:915a712ec85a 49 int32_t rtn_val = readBlock(CTRL_REG1, 5, data);
j3 0:915a712ec85a 50 if(rtn_val == 0)
j3 0:915a712ec85a 51 {
j3 0:915a712ec85a 52 uint8_t idx = 0;
j3 0:915a712ec85a 53 controlRegisters.reg1.all = data[idx++];
j3 0:915a712ec85a 54 controlRegisters.reg2.all = data[idx++];
j3 0:915a712ec85a 55 controlRegisters.reg3.all = data[idx++];
j3 0:915a712ec85a 56 controlRegisters.reg4.all = data[idx++];
j3 0:915a712ec85a 57 controlRegisters.reg5.all = data[idx++];
j3 0:915a712ec85a 58 }
j3 0:915a712ec85a 59
j3 0:915a712ec85a 60 return rtn_val;
j3 0:915a712ec85a 61 }
j3 0:915a712ec85a 62
j3 0:915a712ec85a 63
j3 0:915a712ec85a 64 //******************************************************************************
j3 0:915a712ec85a 65 int32_t H3LIS331DL::writeControlRegisters(
j3 0:915a712ec85a 66 const ControlRegisters_s &controlRegisters)
j3 0:915a712ec85a 67 {
j3 0:915a712ec85a 68 uint8_t data[5];
j3 0:915a712ec85a 69 uint8_t idx = 0;
j3 0:915a712ec85a 70
j3 0:915a712ec85a 71 data[idx++] = controlRegisters.reg1.all;
j3 0:915a712ec85a 72 data[idx++] = controlRegisters.reg2.all;
j3 0:915a712ec85a 73 data[idx++] = controlRegisters.reg3.all;
j3 0:915a712ec85a 74 data[idx++] = controlRegisters.reg4.all;
j3 0:915a712ec85a 75 data[idx++] = controlRegisters.reg5.all;
j3 0:915a712ec85a 76
j3 0:915a712ec85a 77 return writeBlock(CTRL_REG1, idx, data);
j3 0:915a712ec85a 78 }
j3 0:915a712ec85a 79
j3 0:915a712ec85a 80
j3 0:915a712ec85a 81 //******************************************************************************
j3 0:915a712ec85a 82 int32_t H3LIS331DL::resetHPF()
j3 0:915a712ec85a 83 {
j3 0:915a712ec85a 84 uint8_t data; //dummy data for read
j3 0:915a712ec85a 85 return readRegister(HP_FILTER_RESET, data);
j3 0:915a712ec85a 86 }
j3 0:915a712ec85a 87
j3 0:915a712ec85a 88
j3 0:915a712ec85a 89 //******************************************************************************
j3 0:915a712ec85a 90 int32_t H3LIS331DL::readReferenceRegister(uint8_t &ref)
j3 0:915a712ec85a 91 {
j3 0:915a712ec85a 92 uint8_t data;
j3 0:915a712ec85a 93
j3 0:915a712ec85a 94 int32_t rtn_val = readRegister(REFERENCE, data);
j3 0:915a712ec85a 95 if(rtn_val == 0)
j3 0:915a712ec85a 96 {
j3 0:915a712ec85a 97 ref = data;
j3 0:915a712ec85a 98 }
j3 0:915a712ec85a 99
j3 0:915a712ec85a 100 return rtn_val;
j3 0:915a712ec85a 101 }
j3 0:915a712ec85a 102
j3 0:915a712ec85a 103
j3 0:915a712ec85a 104 //******************************************************************************
j3 0:915a712ec85a 105 int32_t H3LIS331DL::writeReferenceRegister(const uint8_t ref)
j3 0:915a712ec85a 106 {
j3 0:915a712ec85a 107 return writeRegister(REFERENCE, ref);
j3 0:915a712ec85a 108 }
j3 0:915a712ec85a 109
j3 0:915a712ec85a 110
j3 0:915a712ec85a 111 //******************************************************************************
j3 0:915a712ec85a 112 int32_t H3LIS331DL::readStatusRegister(STATUS_REG_u &status)
j3 0:915a712ec85a 113 {
j3 0:915a712ec85a 114 uint8_t data;
j3 0:915a712ec85a 115
j3 0:915a712ec85a 116 int32_t rtn_val = readRegister(STATUS_REG, data);
j3 0:915a712ec85a 117 if(rtn_val == 0)
j3 0:915a712ec85a 118 {
j3 0:915a712ec85a 119 status.all = data;
j3 0:915a712ec85a 120 }
j3 0:915a712ec85a 121
j3 0:915a712ec85a 122 return rtn_val;
j3 0:915a712ec85a 123 }
j3 0:915a712ec85a 124
j3 0:915a712ec85a 125
j3 0:915a712ec85a 126 //******************************************************************************
j3 0:915a712ec85a 127 int32_t H3LIS331DL::writeStatusRegister(const STATUS_REG_u &status)
j3 0:915a712ec85a 128 {
j3 0:915a712ec85a 129 return writeRegister(STATUS_REG, status.all);
j3 0:915a712ec85a 130 }
j3 0:915a712ec85a 131
j3 0:915a712ec85a 132
j3 0:915a712ec85a 133 //******************************************************************************
j3 0:915a712ec85a 134 int32_t H3LIS331DL::readAxis(Axis_s &axis)
j3 0:915a712ec85a 135 {
j3 0:915a712ec85a 136 uint8_t data[6];
j3 0:915a712ec85a 137
j3 0:915a712ec85a 138 int32_t rtn_val = readBlock(OUT_X_L, 6, data);
j3 0:915a712ec85a 139 if(rtn_val == 0)
j3 0:915a712ec85a 140 {
j3 0:915a712ec85a 141 uint8_t idx = 0;
j3 0:915a712ec85a 142 axis.x_axis = 0;
j3 0:915a712ec85a 143 axis.x_axis = data[idx++];
j3 0:915a712ec85a 144 axis.x_axis += (data[idx++] << 8);
j3 0:915a712ec85a 145
j3 0:915a712ec85a 146 axis.y_axis = 0;
j3 0:915a712ec85a 147 axis.y_axis = data[idx++];
j3 0:915a712ec85a 148 axis.y_axis += (data[idx++] << 8);
j3 0:915a712ec85a 149
j3 0:915a712ec85a 150 axis.z_axis = 0;
j3 0:915a712ec85a 151 axis.z_axis = data[idx++];
j3 0:915a712ec85a 152 axis.z_axis += (data[idx++] << 8);
j3 0:915a712ec85a 153 }
j3 0:915a712ec85a 154
j3 0:915a712ec85a 155 return rtn_val;
j3 0:915a712ec85a 156 }
j3 0:915a712ec85a 157
j3 0:915a712ec85a 158
j3 0:915a712ec85a 159 //******************************************************************************
j3 0:915a712ec85a 160 int32_t H3LIS331DL::readInterruptConfig(InterruptConfig_s &cfg, bool oneOrTwo)
j3 0:915a712ec85a 161 {
j3 0:915a712ec85a 162 uint8_t data[4];
j3 0:915a712ec85a 163 Register_e reg = oneOrTwo ? INT1_CFG : INT2_CFG;
j3 0:915a712ec85a 164
j3 0:915a712ec85a 165 int32_t rtn_val = readBlock(reg, 4, data);
j3 0:915a712ec85a 166 if(rtn_val == 0)
j3 0:915a712ec85a 167 {
j3 0:915a712ec85a 168 uint8_t idx = 0;
j3 0:915a712ec85a 169 cfg.cfg.all = data[idx++];
j3 0:915a712ec85a 170 cfg.src.all = data[idx++];
j3 0:915a712ec85a 171 cfg.threshold = data[idx++];
j3 0:915a712ec85a 172 cfg.duration = data[idx++];
j3 0:915a712ec85a 173 }
j3 0:915a712ec85a 174
j3 0:915a712ec85a 175 return rtn_val;
j3 0:915a712ec85a 176 }
j3 0:915a712ec85a 177
j3 0:915a712ec85a 178
j3 0:915a712ec85a 179 //******************************************************************************
j3 0:915a712ec85a 180 int32_t H3LIS331DL::writeInterruptConfig(const InterruptConfig_s &cfg,
j3 0:915a712ec85a 181 bool oneOrTwo)
j3 0:915a712ec85a 182 {
j3 0:915a712ec85a 183 uint8_t data[4];
j3 0:915a712ec85a 184 Register_e reg = oneOrTwo ? INT1_CFG : INT2_CFG;
j3 0:915a712ec85a 185 uint8_t idx = 0;
j3 0:915a712ec85a 186
j3 0:915a712ec85a 187 data[idx++] = cfg.cfg.all;
j3 0:915a712ec85a 188 data[idx++] = cfg.src.all;
j3 0:915a712ec85a 189 data[idx++] = cfg.threshold;
j3 0:915a712ec85a 190 data[idx++] = cfg.duration;
j3 0:915a712ec85a 191
j3 0:915a712ec85a 192 return writeBlock(reg, idx, data);
j3 0:915a712ec85a 193 }
j3 0:915a712ec85a 194
j3 0:915a712ec85a 195
j3 0:915a712ec85a 196 //*************************** I2C Implementation ******************************
j3 0:915a712ec85a 197 H3LIS331DL_I2C::H3LIS331DL_I2C(I2C &i2cBus, uint8_t slvAdrs):
j3 0:915a712ec85a 198 m_i2cBus(i2cBus), m_w_adrs(slvAdrs << 1), m_r_adrs((slvAdrs << 1) | 1)
j3 0:915a712ec85a 199 {
j3 0:915a712ec85a 200 }
j3 0:915a712ec85a 201
j3 0:915a712ec85a 202
j3 0:915a712ec85a 203 //*****************************************************************************
j3 0:915a712ec85a 204 int32_t H3LIS331DL_I2C::readRegister(Register_e reg, uint8_t &data)
j3 0:915a712ec85a 205 {
j3 0:915a712ec85a 206 char local_data[1];
j3 0:915a712ec85a 207 local_data[0] = reg;
j3 0:915a712ec85a 208
j3 0:915a712ec85a 209 int32_t rtn_val = m_i2cBus.write(m_w_adrs, local_data, 1, true);
j3 0:915a712ec85a 210 if(rtn_val == 0)
j3 0:915a712ec85a 211 {
j3 0:915a712ec85a 212 rtn_val = m_i2cBus.read(m_r_adrs, local_data, 1);
j3 0:915a712ec85a 213 if(rtn_val == 0)
j3 0:915a712ec85a 214 {
j3 0:915a712ec85a 215 data = local_data[0];
j3 0:915a712ec85a 216 }
j3 0:915a712ec85a 217 }
j3 0:915a712ec85a 218
j3 0:915a712ec85a 219 return rtn_val;
j3 0:915a712ec85a 220 }
j3 0:915a712ec85a 221
j3 0:915a712ec85a 222
j3 0:915a712ec85a 223 //*****************************************************************************
j3 0:915a712ec85a 224 int32_t H3LIS331DL_I2C::writeRegister(Register_e reg, const uint8_t data)
j3 0:915a712ec85a 225 {
j3 0:915a712ec85a 226 char local_data[2];
j3 0:915a712ec85a 227 local_data[0] = reg;
j3 0:915a712ec85a 228 local_data[1] = data;
j3 0:915a712ec85a 229
j3 0:915a712ec85a 230 return m_i2cBus.write(m_w_adrs, local_data, 2);
j3 0:915a712ec85a 231 }
j3 0:915a712ec85a 232
j3 0:915a712ec85a 233
j3 0:915a712ec85a 234 //*****************************************************************************
j3 0:915a712ec85a 235 int32_t H3LIS331DL_I2C::readBlock(Register_e startReg,
j3 0:915a712ec85a 236 const uint8_t readLength, uint8_t *data)
j3 0:915a712ec85a 237 {
j3 0:915a712ec85a 238 char local_data[readLength];
j3 0:915a712ec85a 239 local_data[0] = startReg;
j3 0:915a712ec85a 240
j3 0:915a712ec85a 241 int32_t rtn_val = m_i2cBus.write(m_w_adrs, local_data, 1, true);
j3 0:915a712ec85a 242 if(rtn_val == 0)
j3 0:915a712ec85a 243 {
j3 0:915a712ec85a 244 rtn_val = m_i2cBus.read(m_r_adrs, local_data, readLength);
j3 0:915a712ec85a 245 if(rtn_val == 0)
j3 0:915a712ec85a 246 {
j3 0:915a712ec85a 247 for(uint8_t idx = 0; idx < readLength; idx++)
j3 0:915a712ec85a 248 {
j3 0:915a712ec85a 249 data[idx] = local_data[idx];
j3 0:915a712ec85a 250 }
j3 0:915a712ec85a 251 }
j3 0:915a712ec85a 252 }
j3 0:915a712ec85a 253
j3 0:915a712ec85a 254 return rtn_val;
j3 0:915a712ec85a 255 }
j3 0:915a712ec85a 256
j3 0:915a712ec85a 257
j3 0:915a712ec85a 258 //*****************************************************************************
j3 0:915a712ec85a 259 int32_t H3LIS331DL_I2C::writeBlock(Register_e startReg,
j3 0:915a712ec85a 260 const uint8_t writeLength, const uint8_t *data)
j3 0:915a712ec85a 261 {
j3 0:915a712ec85a 262 char local_data[writeLength + 1];
j3 0:915a712ec85a 263 local_data[0] = startReg;
j3 0:915a712ec85a 264
j3 0:915a712ec85a 265 uint8_t idx = 1;
j3 0:915a712ec85a 266 for(; idx < (writeLength + 1); idx++)
j3 0:915a712ec85a 267 {
j3 0:915a712ec85a 268 local_data[idx] = data[idx];
j3 0:915a712ec85a 269 }
j3 0:915a712ec85a 270
j3 0:915a712ec85a 271 return m_i2cBus.write(m_w_adrs, local_data, idx);
j3 0:915a712ec85a 272 }
j3 0:915a712ec85a 273
j3 0:915a712ec85a 274
j3 0:915a712ec85a 275 //*************************** SPI Implementation ******************************
j3 0:915a712ec85a 276 H3LIS331DL_SPI::H3LIS331DL_SPI(SPI &spiBus, PinName cs):
j3 0:915a712ec85a 277 m_spiBus(spiBus), m_cs(cs, 1)
j3 0:915a712ec85a 278 {
j3 0:915a712ec85a 279 }
j3 0:915a712ec85a 280
j3 0:915a712ec85a 281
j3 0:915a712ec85a 282 //*****************************************************************************
j3 0:915a712ec85a 283 int32_t H3LIS331DL_SPI::readRegister(Register_e reg, uint8_t &data)
j3 0:915a712ec85a 284 {
j3 0:915a712ec85a 285 m_cs = 0;
j3 0:915a712ec85a 286 m_spiBus.write(R_BIT | reg);
j3 0:915a712ec85a 287 data = m_spiBus.write(0xFF);
j3 0:915a712ec85a 288 m_cs = 1;
j3 0:915a712ec85a 289
j3 0:915a712ec85a 290 return 0;
j3 0:915a712ec85a 291 }
j3 0:915a712ec85a 292
j3 0:915a712ec85a 293
j3 0:915a712ec85a 294 //*****************************************************************************
j3 0:915a712ec85a 295 int32_t H3LIS331DL_SPI::writeRegister(Register_e reg, const uint8_t data)
j3 0:915a712ec85a 296 {
j3 0:915a712ec85a 297 m_cs = 0;
j3 0:915a712ec85a 298 m_spiBus.write(reg);
j3 0:915a712ec85a 299 m_spiBus.write(data);
j3 0:915a712ec85a 300 m_cs = 1;
j3 0:915a712ec85a 301
j3 0:915a712ec85a 302 return 0;
j3 0:915a712ec85a 303 }
j3 0:915a712ec85a 304
j3 0:915a712ec85a 305
j3 0:915a712ec85a 306 //*****************************************************************************
j3 0:915a712ec85a 307 int32_t H3LIS331DL_SPI::readBlock(Register_e startReg,
j3 0:915a712ec85a 308 const uint8_t readLength, uint8_t *data)
j3 0:915a712ec85a 309 {
j3 0:915a712ec85a 310 m_cs = 0;
j3 0:915a712ec85a 311 m_spiBus.write(R_BIT | AUTO_INC_BIT | startReg);
j3 0:915a712ec85a 312 for(uint8_t idx = 0; idx < readLength; idx++)
j3 0:915a712ec85a 313 {
j3 0:915a712ec85a 314 data[idx] = m_spiBus.write(0xFF);
j3 0:915a712ec85a 315 }
j3 0:915a712ec85a 316 m_cs = 1;
j3 0:915a712ec85a 317
j3 0:915a712ec85a 318 return 0;
j3 0:915a712ec85a 319 }
j3 0:915a712ec85a 320
j3 0:915a712ec85a 321
j3 0:915a712ec85a 322 //*****************************************************************************
j3 0:915a712ec85a 323 int32_t H3LIS331DL_SPI::writeBlock(Register_e startReg,
j3 0:915a712ec85a 324 const uint8_t writeLength, const uint8_t *data)
j3 0:915a712ec85a 325 {
j3 0:915a712ec85a 326 m_cs = 0;
j3 0:915a712ec85a 327 m_spiBus.write(AUTO_INC_BIT | startReg);
j3 0:915a712ec85a 328 for(uint8_t idx = 0; idx < writeLength; idx++)
j3 0:915a712ec85a 329 {
j3 0:915a712ec85a 330 m_spiBus.write(data[idx]);
j3 0:915a712ec85a 331 }
j3 0:915a712ec85a 332 m_cs = 1;
j3 0:915a712ec85a 333
j3 0:915a712ec85a 334 return 0;
j3 0:915a712ec85a 335 }
j3 0:915a712ec85a 336