Utility library for HSP SPo2 HR demo including user interface, board support adn accelerometer.

Committer:
gmehmet
Date:
Mon Dec 17 13:58:56 2018 +0300
Revision:
0:a12d6976d64c
create and put source to HSP demo utility repo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 0:a12d6976d64c 1 /**********************************************************************
gmehmet 0:a12d6976d64c 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 0:a12d6976d64c 3 *
gmehmet 0:a12d6976d64c 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 0:a12d6976d64c 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 0:a12d6976d64c 6 * to deal in the Software without restriction, including without limitation
gmehmet 0:a12d6976d64c 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 0:a12d6976d64c 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 0:a12d6976d64c 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 0:a12d6976d64c 10 *
gmehmet 0:a12d6976d64c 11 * The above copyright notice and this permission notice shall be included
gmehmet 0:a12d6976d64c 12 * in all copies or substantial portions of the Software.
gmehmet 0:a12d6976d64c 13 *
gmehmet 0:a12d6976d64c 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 0:a12d6976d64c 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 0:a12d6976d64c 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 0:a12d6976d64c 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 0:a12d6976d64c 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 0:a12d6976d64c 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 0:a12d6976d64c 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 0:a12d6976d64c 21 *
gmehmet 0:a12d6976d64c 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 0:a12d6976d64c 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 0:a12d6976d64c 24 * Products, Inc. Branding Policy.
gmehmet 0:a12d6976d64c 25 *
gmehmet 0:a12d6976d64c 26 * The mere transfer of this software does not imply any licenses
gmehmet 0:a12d6976d64c 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 0:a12d6976d64c 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 0:a12d6976d64c 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 0:a12d6976d64c 30 * ownership rights.
gmehmet 0:a12d6976d64c 31 **********************************************************************/
gmehmet 0:a12d6976d64c 32
gmehmet 0:a12d6976d64c 33
gmehmet 0:a12d6976d64c 34 #include "bmi160.h"
gmehmet 0:a12d6976d64c 35
gmehmet 0:a12d6976d64c 36
gmehmet 0:a12d6976d64c 37 const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G,
gmehmet 0:a12d6976d64c 38 ACC_US_OFF,
gmehmet 0:a12d6976d64c 39 ACC_BWP_2,
gmehmet 0:a12d6976d64c 40 ACC_ODR_8};
gmehmet 0:a12d6976d64c 41
gmehmet 0:a12d6976d64c 42 const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000,
gmehmet 0:a12d6976d64c 43 GYRO_BWP_2,
gmehmet 0:a12d6976d64c 44 GYRO_ODR_8};
gmehmet 0:a12d6976d64c 45
gmehmet 0:a12d6976d64c 46
gmehmet 0:a12d6976d64c 47 //*****************************************************************************
gmehmet 0:a12d6976d64c 48 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
gmehmet 0:a12d6976d64c 49 {
gmehmet 0:a12d6976d64c 50 int32_t rtnVal = -1;
gmehmet 0:a12d6976d64c 51
gmehmet 0:a12d6976d64c 52 switch(sensor)
gmehmet 0:a12d6976d64c 53 {
gmehmet 0:a12d6976d64c 54 case MAG:
gmehmet 0:a12d6976d64c 55 rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
gmehmet 0:a12d6976d64c 56 break;
gmehmet 0:a12d6976d64c 57
gmehmet 0:a12d6976d64c 58 case GYRO:
gmehmet 0:a12d6976d64c 59 rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
gmehmet 0:a12d6976d64c 60 break;
gmehmet 0:a12d6976d64c 61
gmehmet 0:a12d6976d64c 62 case ACC:
gmehmet 0:a12d6976d64c 63 rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
gmehmet 0:a12d6976d64c 64 break;
gmehmet 0:a12d6976d64c 65
gmehmet 0:a12d6976d64c 66 default:
gmehmet 0:a12d6976d64c 67 rtnVal = -1;
gmehmet 0:a12d6976d64c 68 break;
gmehmet 0:a12d6976d64c 69 }
gmehmet 0:a12d6976d64c 70
gmehmet 0:a12d6976d64c 71 return rtnVal;
gmehmet 0:a12d6976d64c 72 }
gmehmet 0:a12d6976d64c 73
gmehmet 0:a12d6976d64c 74
gmehmet 0:a12d6976d64c 75 //*****************************************************************************
gmehmet 0:a12d6976d64c 76 int32_t BMI160::setSensorConfig(const AccConfig &config)
gmehmet 0:a12d6976d64c 77 {
gmehmet 0:a12d6976d64c 78 uint8_t data[2];
gmehmet 0:a12d6976d64c 79
gmehmet 0:a12d6976d64c 80 data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) |
gmehmet 0:a12d6976d64c 81 (config.odr << ACC_ODR_POS));
gmehmet 0:a12d6976d64c 82 data[1] = config.range;
gmehmet 0:a12d6976d64c 83
gmehmet 0:a12d6976d64c 84 return writeBlock(ACC_CONF, ACC_RANGE, data);
gmehmet 0:a12d6976d64c 85 }
gmehmet 0:a12d6976d64c 86
gmehmet 0:a12d6976d64c 87
gmehmet 0:a12d6976d64c 88 //*****************************************************************************
gmehmet 0:a12d6976d64c 89 int32_t BMI160::setSensorConfig(const GyroConfig &config)
gmehmet 0:a12d6976d64c 90 {
gmehmet 0:a12d6976d64c 91 uint8_t data[2];
gmehmet 0:a12d6976d64c 92
gmehmet 0:a12d6976d64c 93 data[0] = ((config.bwp << GYRO_BWP_POS) | (config.odr << GYRO_ODR_POS));
gmehmet 0:a12d6976d64c 94 data[1] = config.range;
gmehmet 0:a12d6976d64c 95
gmehmet 0:a12d6976d64c 96 return writeBlock(GYR_CONF, GYR_RANGE, data);
gmehmet 0:a12d6976d64c 97 }
gmehmet 0:a12d6976d64c 98
gmehmet 0:a12d6976d64c 99
gmehmet 0:a12d6976d64c 100 //*****************************************************************************
gmehmet 0:a12d6976d64c 101 int32_t BMI160::getSensorConfig(AccConfig &config)
gmehmet 0:a12d6976d64c 102 {
gmehmet 0:a12d6976d64c 103 uint8_t data[2];
gmehmet 0:a12d6976d64c 104 int32_t rtnVal = readBlock(ACC_CONF, ACC_RANGE, data);
gmehmet 0:a12d6976d64c 105
gmehmet 0:a12d6976d64c 106 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 107 {
gmehmet 0:a12d6976d64c 108 config.range = static_cast<BMI160::AccRange>(
gmehmet 0:a12d6976d64c 109 (data[1] & ACC_RANGE_MASK));
gmehmet 0:a12d6976d64c 110 config.us = static_cast<BMI160::AccUnderSampling>(
gmehmet 0:a12d6976d64c 111 ((data[0] & ACC_US_MASK) >> ACC_US_POS));
gmehmet 0:a12d6976d64c 112 config.bwp = static_cast<BMI160::AccBandWidthParam>(
gmehmet 0:a12d6976d64c 113 ((data[0] & ACC_BWP_MASK) >> ACC_BWP_POS));
gmehmet 0:a12d6976d64c 114 config.odr = static_cast<BMI160::AccOutputDataRate>(
gmehmet 0:a12d6976d64c 115 ((data[0] & ACC_ODR_MASK) >> ACC_ODR_POS));
gmehmet 0:a12d6976d64c 116 }
gmehmet 0:a12d6976d64c 117
gmehmet 0:a12d6976d64c 118 return rtnVal;
gmehmet 0:a12d6976d64c 119 }
gmehmet 0:a12d6976d64c 120
gmehmet 0:a12d6976d64c 121
gmehmet 0:a12d6976d64c 122 //*****************************************************************************
gmehmet 0:a12d6976d64c 123 int32_t BMI160::getSensorConfig(GyroConfig &config)
gmehmet 0:a12d6976d64c 124 {
gmehmet 0:a12d6976d64c 125 uint8_t data[2];
gmehmet 0:a12d6976d64c 126 int32_t rtnVal = readBlock(GYR_CONF, GYR_RANGE, data);
gmehmet 0:a12d6976d64c 127
gmehmet 0:a12d6976d64c 128 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 129 {
gmehmet 0:a12d6976d64c 130 config.range = static_cast<BMI160::GyroRange>(
gmehmet 0:a12d6976d64c 131 (data[1] & GYRO_RANGE_MASK));
gmehmet 0:a12d6976d64c 132 config.bwp = static_cast<BMI160::GyroBandWidthParam>(
gmehmet 0:a12d6976d64c 133 ((data[0] & GYRO_BWP_MASK) >> GYRO_BWP_POS));
gmehmet 0:a12d6976d64c 134 config.odr = static_cast<BMI160::GyroOutputDataRate>(
gmehmet 0:a12d6976d64c 135 ((data[0] & GYRO_ODR_MASK) >> GYRO_ODR_POS));
gmehmet 0:a12d6976d64c 136 }
gmehmet 0:a12d6976d64c 137
gmehmet 0:a12d6976d64c 138 return rtnVal;
gmehmet 0:a12d6976d64c 139 }
gmehmet 0:a12d6976d64c 140
gmehmet 0:a12d6976d64c 141
gmehmet 0:a12d6976d64c 142 //*****************************************************************************
gmehmet 0:a12d6976d64c 143 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, AccRange range)
gmehmet 0:a12d6976d64c 144 {
gmehmet 0:a12d6976d64c 145 uint8_t localData[2];
gmehmet 0:a12d6976d64c 146 int32_t rtnVal;
gmehmet 0:a12d6976d64c 147
gmehmet 0:a12d6976d64c 148 switch(axis)
gmehmet 0:a12d6976d64c 149 {
gmehmet 0:a12d6976d64c 150 case X_AXIS:
gmehmet 0:a12d6976d64c 151 rtnVal = readBlock(DATA_14, DATA_15, localData);
gmehmet 0:a12d6976d64c 152 break;
gmehmet 0:a12d6976d64c 153
gmehmet 0:a12d6976d64c 154 case Y_AXIS:
gmehmet 0:a12d6976d64c 155 rtnVal = readBlock(DATA_16, DATA_17, localData);
gmehmet 0:a12d6976d64c 156 break;
gmehmet 0:a12d6976d64c 157
gmehmet 0:a12d6976d64c 158 case Z_AXIS:
gmehmet 0:a12d6976d64c 159 rtnVal = readBlock(DATA_18, DATA_19, localData);
gmehmet 0:a12d6976d64c 160 break;
gmehmet 0:a12d6976d64c 161
gmehmet 0:a12d6976d64c 162 default:
gmehmet 0:a12d6976d64c 163 rtnVal = -1;
gmehmet 0:a12d6976d64c 164 break;
gmehmet 0:a12d6976d64c 165 }
gmehmet 0:a12d6976d64c 166
gmehmet 0:a12d6976d64c 167 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 168 {
gmehmet 0:a12d6976d64c 169 data.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 170 switch(range)
gmehmet 0:a12d6976d64c 171 {
gmehmet 0:a12d6976d64c 172 case SENS_2G:
gmehmet 0:a12d6976d64c 173 data.scaled = (data.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 174 break;
gmehmet 0:a12d6976d64c 175
gmehmet 0:a12d6976d64c 176 case SENS_4G:
gmehmet 0:a12d6976d64c 177 data.scaled = (data.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 178 break;
gmehmet 0:a12d6976d64c 179
gmehmet 0:a12d6976d64c 180 case SENS_8G:
gmehmet 0:a12d6976d64c 181 data.scaled = (data.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 182 break;
gmehmet 0:a12d6976d64c 183
gmehmet 0:a12d6976d64c 184 case SENS_16G:
gmehmet 0:a12d6976d64c 185 data.scaled = (data.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 186 break;
gmehmet 0:a12d6976d64c 187 }
gmehmet 0:a12d6976d64c 188 }
gmehmet 0:a12d6976d64c 189
gmehmet 0:a12d6976d64c 190 return rtnVal;
gmehmet 0:a12d6976d64c 191 }
gmehmet 0:a12d6976d64c 192
gmehmet 0:a12d6976d64c 193
gmehmet 0:a12d6976d64c 194 //*****************************************************************************
gmehmet 0:a12d6976d64c 195 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range)
gmehmet 0:a12d6976d64c 196 {
gmehmet 0:a12d6976d64c 197 uint8_t localData[2];
gmehmet 0:a12d6976d64c 198 int32_t rtnVal;
gmehmet 0:a12d6976d64c 199
gmehmet 0:a12d6976d64c 200 switch(axis)
gmehmet 0:a12d6976d64c 201 {
gmehmet 0:a12d6976d64c 202 case X_AXIS:
gmehmet 0:a12d6976d64c 203 rtnVal = readBlock(DATA_8, DATA_9, localData);
gmehmet 0:a12d6976d64c 204 break;
gmehmet 0:a12d6976d64c 205
gmehmet 0:a12d6976d64c 206 case Y_AXIS:
gmehmet 0:a12d6976d64c 207 rtnVal = readBlock(DATA_10, DATA_11, localData);
gmehmet 0:a12d6976d64c 208 break;
gmehmet 0:a12d6976d64c 209
gmehmet 0:a12d6976d64c 210 case Z_AXIS:
gmehmet 0:a12d6976d64c 211 rtnVal = readBlock(DATA_12, DATA_13, localData);
gmehmet 0:a12d6976d64c 212 break;
gmehmet 0:a12d6976d64c 213
gmehmet 0:a12d6976d64c 214 default:
gmehmet 0:a12d6976d64c 215 rtnVal = -1;
gmehmet 0:a12d6976d64c 216 break;
gmehmet 0:a12d6976d64c 217 }
gmehmet 0:a12d6976d64c 218
gmehmet 0:a12d6976d64c 219 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 220 {
gmehmet 0:a12d6976d64c 221 data.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 222 switch(range)
gmehmet 0:a12d6976d64c 223 {
gmehmet 0:a12d6976d64c 224 case DPS_2000:
gmehmet 0:a12d6976d64c 225 data.scaled = (data.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 226 break;
gmehmet 0:a12d6976d64c 227
gmehmet 0:a12d6976d64c 228 case DPS_1000:
gmehmet 0:a12d6976d64c 229 data.scaled = (data.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 230 break;
gmehmet 0:a12d6976d64c 231
gmehmet 0:a12d6976d64c 232 case DPS_500:
gmehmet 0:a12d6976d64c 233 data.scaled = (data.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 234 break;
gmehmet 0:a12d6976d64c 235
gmehmet 0:a12d6976d64c 236 case DPS_250:
gmehmet 0:a12d6976d64c 237 data.scaled = (data.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 238 break;
gmehmet 0:a12d6976d64c 239
gmehmet 0:a12d6976d64c 240 case DPS_125:
gmehmet 0:a12d6976d64c 241 data.scaled = (data.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 242 break;
gmehmet 0:a12d6976d64c 243 }
gmehmet 0:a12d6976d64c 244 }
gmehmet 0:a12d6976d64c 245
gmehmet 0:a12d6976d64c 246 return rtnVal;
gmehmet 0:a12d6976d64c 247 }
gmehmet 0:a12d6976d64c 248
gmehmet 0:a12d6976d64c 249
gmehmet 0:a12d6976d64c 250 //*****************************************************************************
gmehmet 0:a12d6976d64c 251 int32_t BMI160::getSensorXYZ(SensorData &data, AccRange range)
gmehmet 0:a12d6976d64c 252 {
gmehmet 0:a12d6976d64c 253 uint8_t localData[6];
gmehmet 0:a12d6976d64c 254 int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
gmehmet 0:a12d6976d64c 255
gmehmet 0:a12d6976d64c 256 if (m_use_irq == true && bmi160_irq_asserted == false)
gmehmet 0:a12d6976d64c 257 return -1;
gmehmet 0:a12d6976d64c 258
gmehmet 0:a12d6976d64c 259 bmi160_irq_asserted = false;
gmehmet 0:a12d6976d64c 260 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 261 {
gmehmet 0:a12d6976d64c 262 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 263 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
gmehmet 0:a12d6976d64c 264 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
gmehmet 0:a12d6976d64c 265
gmehmet 0:a12d6976d64c 266 switch(range)
gmehmet 0:a12d6976d64c 267 {
gmehmet 0:a12d6976d64c 268 case SENS_2G:
gmehmet 0:a12d6976d64c 269 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 270 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 271 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 272 break;
gmehmet 0:a12d6976d64c 273
gmehmet 0:a12d6976d64c 274 case SENS_4G:
gmehmet 0:a12d6976d64c 275 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 276 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 277 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 278 break;
gmehmet 0:a12d6976d64c 279
gmehmet 0:a12d6976d64c 280 case SENS_8G:
gmehmet 0:a12d6976d64c 281 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 282 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 283 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 284 break;
gmehmet 0:a12d6976d64c 285
gmehmet 0:a12d6976d64c 286 case SENS_16G:
gmehmet 0:a12d6976d64c 287 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 288 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 289 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 290 break;
gmehmet 0:a12d6976d64c 291 }
gmehmet 0:a12d6976d64c 292 }
gmehmet 0:a12d6976d64c 293
gmehmet 0:a12d6976d64c 294 return rtnVal;
gmehmet 0:a12d6976d64c 295 }
gmehmet 0:a12d6976d64c 296
gmehmet 0:a12d6976d64c 297
gmehmet 0:a12d6976d64c 298 //*****************************************************************************
gmehmet 0:a12d6976d64c 299 int32_t BMI160::getSensorXYZ(SensorData &data, GyroRange range)
gmehmet 0:a12d6976d64c 300 {
gmehmet 0:a12d6976d64c 301 uint8_t localData[6];
gmehmet 0:a12d6976d64c 302 int32_t rtnVal = readBlock(DATA_8, DATA_13, localData);
gmehmet 0:a12d6976d64c 303
gmehmet 0:a12d6976d64c 304 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 305 {
gmehmet 0:a12d6976d64c 306 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 307 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
gmehmet 0:a12d6976d64c 308 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
gmehmet 0:a12d6976d64c 309
gmehmet 0:a12d6976d64c 310 switch(range)
gmehmet 0:a12d6976d64c 311 {
gmehmet 0:a12d6976d64c 312 case DPS_2000:
gmehmet 0:a12d6976d64c 313 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 314 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 315 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 316 break;
gmehmet 0:a12d6976d64c 317
gmehmet 0:a12d6976d64c 318 case DPS_1000:
gmehmet 0:a12d6976d64c 319 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 320 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 321 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 322 break;
gmehmet 0:a12d6976d64c 323
gmehmet 0:a12d6976d64c 324 case DPS_500:
gmehmet 0:a12d6976d64c 325 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 326 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 327 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 328 break;
gmehmet 0:a12d6976d64c 329
gmehmet 0:a12d6976d64c 330 case DPS_250:
gmehmet 0:a12d6976d64c 331 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 332 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 333 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 334 break;
gmehmet 0:a12d6976d64c 335
gmehmet 0:a12d6976d64c 336 case DPS_125:
gmehmet 0:a12d6976d64c 337 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 338 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 339 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 340 break;
gmehmet 0:a12d6976d64c 341 }
gmehmet 0:a12d6976d64c 342 }
gmehmet 0:a12d6976d64c 343
gmehmet 0:a12d6976d64c 344 return rtnVal;
gmehmet 0:a12d6976d64c 345 }
gmehmet 0:a12d6976d64c 346
gmehmet 0:a12d6976d64c 347
gmehmet 0:a12d6976d64c 348 //*****************************************************************************
gmehmet 0:a12d6976d64c 349 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
gmehmet 0:a12d6976d64c 350 SensorTime &sensorTime,
gmehmet 0:a12d6976d64c 351 AccRange range)
gmehmet 0:a12d6976d64c 352 {
gmehmet 0:a12d6976d64c 353 uint8_t localData[9];
gmehmet 0:a12d6976d64c 354 int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
gmehmet 0:a12d6976d64c 355 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 356 {
gmehmet 0:a12d6976d64c 357 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 358 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
gmehmet 0:a12d6976d64c 359 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
gmehmet 0:a12d6976d64c 360
gmehmet 0:a12d6976d64c 361 switch(range)
gmehmet 0:a12d6976d64c 362 {
gmehmet 0:a12d6976d64c 363 case SENS_2G:
gmehmet 0:a12d6976d64c 364 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 365 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 366 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 367 break;
gmehmet 0:a12d6976d64c 368
gmehmet 0:a12d6976d64c 369 case SENS_4G:
gmehmet 0:a12d6976d64c 370 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 371 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 372 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 373 break;
gmehmet 0:a12d6976d64c 374
gmehmet 0:a12d6976d64c 375 case SENS_8G:
gmehmet 0:a12d6976d64c 376 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 377 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 378 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 379 break;
gmehmet 0:a12d6976d64c 380
gmehmet 0:a12d6976d64c 381 case SENS_16G:
gmehmet 0:a12d6976d64c 382 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 383 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 384 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 385 break;
gmehmet 0:a12d6976d64c 386 }
gmehmet 0:a12d6976d64c 387
gmehmet 0:a12d6976d64c 388 sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) |
gmehmet 0:a12d6976d64c 389 localData[6]);
gmehmet 0:a12d6976d64c 390 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
gmehmet 0:a12d6976d64c 391 }
gmehmet 0:a12d6976d64c 392
gmehmet 0:a12d6976d64c 393 return rtnVal;
gmehmet 0:a12d6976d64c 394 }
gmehmet 0:a12d6976d64c 395
gmehmet 0:a12d6976d64c 396
gmehmet 0:a12d6976d64c 397 //*****************************************************************************
gmehmet 0:a12d6976d64c 398 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
gmehmet 0:a12d6976d64c 399 SensorTime &sensorTime,
gmehmet 0:a12d6976d64c 400 GyroRange range)
gmehmet 0:a12d6976d64c 401 {
gmehmet 0:a12d6976d64c 402 uint8_t localData[16];
gmehmet 0:a12d6976d64c 403 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
gmehmet 0:a12d6976d64c 404 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 405 {
gmehmet 0:a12d6976d64c 406 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 407 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
gmehmet 0:a12d6976d64c 408 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
gmehmet 0:a12d6976d64c 409
gmehmet 0:a12d6976d64c 410 switch(range)
gmehmet 0:a12d6976d64c 411 {
gmehmet 0:a12d6976d64c 412 case DPS_2000:
gmehmet 0:a12d6976d64c 413 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 414 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 415 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 416 break;
gmehmet 0:a12d6976d64c 417
gmehmet 0:a12d6976d64c 418 case DPS_1000:
gmehmet 0:a12d6976d64c 419 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 420 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 421 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 422 break;
gmehmet 0:a12d6976d64c 423
gmehmet 0:a12d6976d64c 424 case DPS_500:
gmehmet 0:a12d6976d64c 425 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 426 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 427 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 428 break;
gmehmet 0:a12d6976d64c 429
gmehmet 0:a12d6976d64c 430 case DPS_250:
gmehmet 0:a12d6976d64c 431 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 432 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 433 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 434 break;
gmehmet 0:a12d6976d64c 435
gmehmet 0:a12d6976d64c 436 case DPS_125:
gmehmet 0:a12d6976d64c 437 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 438 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 439 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 440 break;
gmehmet 0:a12d6976d64c 441 }
gmehmet 0:a12d6976d64c 442
gmehmet 0:a12d6976d64c 443 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
gmehmet 0:a12d6976d64c 444 localData[12]);
gmehmet 0:a12d6976d64c 445 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
gmehmet 0:a12d6976d64c 446 }
gmehmet 0:a12d6976d64c 447
gmehmet 0:a12d6976d64c 448 return rtnVal;
gmehmet 0:a12d6976d64c 449 }
gmehmet 0:a12d6976d64c 450
gmehmet 0:a12d6976d64c 451
gmehmet 0:a12d6976d64c 452 //*****************************************************************************
gmehmet 0:a12d6976d64c 453 int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData,
gmehmet 0:a12d6976d64c 454 SensorData &gyroData,
gmehmet 0:a12d6976d64c 455 SensorTime &sensorTime,
gmehmet 0:a12d6976d64c 456 AccRange accRange,
gmehmet 0:a12d6976d64c 457 GyroRange gyroRange)
gmehmet 0:a12d6976d64c 458 {
gmehmet 0:a12d6976d64c 459 uint8_t localData[16];
gmehmet 0:a12d6976d64c 460 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
gmehmet 0:a12d6976d64c 461 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 462 {
gmehmet 0:a12d6976d64c 463 gyroData.xAxis.raw = ((localData[1] << 8) | localData[0]);
gmehmet 0:a12d6976d64c 464 gyroData.yAxis.raw = ((localData[3] << 8) | localData[2]);
gmehmet 0:a12d6976d64c 465 gyroData.zAxis.raw = ((localData[5] << 8) | localData[4]);
gmehmet 0:a12d6976d64c 466
gmehmet 0:a12d6976d64c 467 accData.xAxis.raw = ((localData[7] << 8) | localData[6]);
gmehmet 0:a12d6976d64c 468 accData.yAxis.raw = ((localData[9] << 8) | localData[8]);
gmehmet 0:a12d6976d64c 469 accData.zAxis.raw = ((localData[11] << 8) | localData[10]);
gmehmet 0:a12d6976d64c 470
gmehmet 0:a12d6976d64c 471 switch(gyroRange)
gmehmet 0:a12d6976d64c 472 {
gmehmet 0:a12d6976d64c 473 case DPS_2000:
gmehmet 0:a12d6976d64c 474 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 475 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 476 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 477 break;
gmehmet 0:a12d6976d64c 478
gmehmet 0:a12d6976d64c 479 case DPS_1000:
gmehmet 0:a12d6976d64c 480 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 481 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 482 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 483 break;
gmehmet 0:a12d6976d64c 484
gmehmet 0:a12d6976d64c 485 case DPS_500:
gmehmet 0:a12d6976d64c 486 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 487 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 488 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 489 break;
gmehmet 0:a12d6976d64c 490
gmehmet 0:a12d6976d64c 491 case DPS_250:
gmehmet 0:a12d6976d64c 492 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 493 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 494 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 495 break;
gmehmet 0:a12d6976d64c 496
gmehmet 0:a12d6976d64c 497 case DPS_125:
gmehmet 0:a12d6976d64c 498 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 499 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 500 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
gmehmet 0:a12d6976d64c 501 break;
gmehmet 0:a12d6976d64c 502 }
gmehmet 0:a12d6976d64c 503
gmehmet 0:a12d6976d64c 504 switch(accRange)
gmehmet 0:a12d6976d64c 505 {
gmehmet 0:a12d6976d64c 506 case SENS_2G:
gmehmet 0:a12d6976d64c 507 accData.xAxis.scaled = (accData.xAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 508 accData.yAxis.scaled = (accData.yAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 509 accData.zAxis.scaled = (accData.zAxis.raw/SENS_2G_LSB_PER_G);
gmehmet 0:a12d6976d64c 510 break;
gmehmet 0:a12d6976d64c 511
gmehmet 0:a12d6976d64c 512 case SENS_4G:
gmehmet 0:a12d6976d64c 513 accData.xAxis.scaled = (accData.xAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 514 accData.yAxis.scaled = (accData.yAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 515 accData.zAxis.scaled = (accData.zAxis.raw/SENS_4G_LSB_PER_G);
gmehmet 0:a12d6976d64c 516 break;
gmehmet 0:a12d6976d64c 517
gmehmet 0:a12d6976d64c 518 case SENS_8G:
gmehmet 0:a12d6976d64c 519 accData.xAxis.scaled = (accData.xAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 520 accData.yAxis.scaled = (accData.yAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 521 accData.zAxis.scaled = (accData.zAxis.raw/SENS_8G_LSB_PER_G);
gmehmet 0:a12d6976d64c 522 break;
gmehmet 0:a12d6976d64c 523
gmehmet 0:a12d6976d64c 524 case SENS_16G:
gmehmet 0:a12d6976d64c 525 accData.xAxis.scaled = (accData.xAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 526 accData.yAxis.scaled = (accData.yAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 527 accData.zAxis.scaled = (accData.zAxis.raw/SENS_16G_LSB_PER_G);
gmehmet 0:a12d6976d64c 528 break;
gmehmet 0:a12d6976d64c 529 }
gmehmet 0:a12d6976d64c 530
gmehmet 0:a12d6976d64c 531 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
gmehmet 0:a12d6976d64c 532 localData[12]);
gmehmet 0:a12d6976d64c 533 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
gmehmet 0:a12d6976d64c 534 }
gmehmet 0:a12d6976d64c 535
gmehmet 0:a12d6976d64c 536 return rtnVal;
gmehmet 0:a12d6976d64c 537 }
gmehmet 0:a12d6976d64c 538
gmehmet 0:a12d6976d64c 539 int32_t BMI160::setSampleRate(int sample_rate)
gmehmet 0:a12d6976d64c 540 {
gmehmet 0:a12d6976d64c 541 int sr_reg_val = -1;
gmehmet 0:a12d6976d64c 542 int i;
gmehmet 0:a12d6976d64c 543 const uint16_t odr_table[][2] = {
gmehmet 0:a12d6976d64c 544 {25, GYRO_ODR_6}, ///<25Hz
gmehmet 0:a12d6976d64c 545 {50, GYRO_ODR_7}, ///<50Hz
gmehmet 0:a12d6976d64c 546 {100, GYRO_ODR_8}, ///<100Hz
gmehmet 0:a12d6976d64c 547 {200, GYRO_ODR_9}, ///<200Hz
gmehmet 0:a12d6976d64c 548 {400, GYRO_ODR_10}, ///<400Hz
gmehmet 0:a12d6976d64c 549 {800, GYRO_ODR_11}, ///<800Hz
gmehmet 0:a12d6976d64c 550 {1600, GYRO_ODR_12}, ///<1600Hz
gmehmet 0:a12d6976d64c 551 {3200, GYRO_ODR_13}, ///<3200Hz
gmehmet 0:a12d6976d64c 552 };
gmehmet 0:a12d6976d64c 553
gmehmet 0:a12d6976d64c 554 int num_sr = sizeof(odr_table)/sizeof(odr_table[0]);
gmehmet 0:a12d6976d64c 555 for (i = 0; i < num_sr; i++) {
gmehmet 0:a12d6976d64c 556 if (sample_rate == odr_table[i][0]) {
gmehmet 0:a12d6976d64c 557 sr_reg_val = odr_table[i][1];
gmehmet 0:a12d6976d64c 558 break;
gmehmet 0:a12d6976d64c 559 }
gmehmet 0:a12d6976d64c 560 }
gmehmet 0:a12d6976d64c 561
gmehmet 0:a12d6976d64c 562 if (sr_reg_val == -1)
gmehmet 0:a12d6976d64c 563 return -2;
gmehmet 0:a12d6976d64c 564
gmehmet 0:a12d6976d64c 565 AccConfig accConfigRead;
gmehmet 0:a12d6976d64c 566 if (getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR) {
gmehmet 0:a12d6976d64c 567 accConfigRead.odr = (AccOutputDataRate)sr_reg_val;
gmehmet 0:a12d6976d64c 568 return setSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR ? 0 : -1;
gmehmet 0:a12d6976d64c 569 } else
gmehmet 0:a12d6976d64c 570 return -1;
gmehmet 0:a12d6976d64c 571 }
gmehmet 0:a12d6976d64c 572
gmehmet 0:a12d6976d64c 573
gmehmet 0:a12d6976d64c 574 //*****************************************************************************
gmehmet 0:a12d6976d64c 575 int32_t BMI160::getSensorTime(SensorTime &sensorTime)
gmehmet 0:a12d6976d64c 576 {
gmehmet 0:a12d6976d64c 577 uint8_t localData[3];
gmehmet 0:a12d6976d64c 578 int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
gmehmet 0:a12d6976d64c 579
gmehmet 0:a12d6976d64c 580 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 581 {
gmehmet 0:a12d6976d64c 582 sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) |
gmehmet 0:a12d6976d64c 583 localData[0]);
gmehmet 0:a12d6976d64c 584 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
gmehmet 0:a12d6976d64c 585 }
gmehmet 0:a12d6976d64c 586
gmehmet 0:a12d6976d64c 587 return rtnVal;
gmehmet 0:a12d6976d64c 588 }
gmehmet 0:a12d6976d64c 589
gmehmet 0:a12d6976d64c 590
gmehmet 0:a12d6976d64c 591 //*****************************************************************************
gmehmet 0:a12d6976d64c 592 int32_t BMI160::getTemperature(float *temp)
gmehmet 0:a12d6976d64c 593 {
gmehmet 0:a12d6976d64c 594 uint8_t data[2];
gmehmet 0:a12d6976d64c 595 uint16_t rawTemp;
gmehmet 0:a12d6976d64c 596
gmehmet 0:a12d6976d64c 597 int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
gmehmet 0:a12d6976d64c 598 if(rtnVal == RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 599 {
gmehmet 0:a12d6976d64c 600 rawTemp = ((data[1] << 8) | data[0]);
gmehmet 0:a12d6976d64c 601 if(rawTemp & 0x8000)
gmehmet 0:a12d6976d64c 602 {
gmehmet 0:a12d6976d64c 603 *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
gmehmet 0:a12d6976d64c 604 }
gmehmet 0:a12d6976d64c 605 else
gmehmet 0:a12d6976d64c 606 {
gmehmet 0:a12d6976d64c 607 *temp = ((rawTemp/512.0F) + 23.0F);
gmehmet 0:a12d6976d64c 608 }
gmehmet 0:a12d6976d64c 609 }
gmehmet 0:a12d6976d64c 610
gmehmet 0:a12d6976d64c 611 return rtnVal;
gmehmet 0:a12d6976d64c 612 }
gmehmet 0:a12d6976d64c 613
gmehmet 0:a12d6976d64c 614 //***********************************************************************************
gmehmet 0:a12d6976d64c 615 int32_t BMI160::BMI160_DefaultInitalize(){
gmehmet 0:a12d6976d64c 616
gmehmet 0:a12d6976d64c 617 //soft reset the accelerometer
gmehmet 0:a12d6976d64c 618 writeRegister(CMD ,SOFT_RESET);
gmehmet 0:a12d6976d64c 619 wait(0.1);
gmehmet 0:a12d6976d64c 620
gmehmet 0:a12d6976d64c 621 //Power up sensors in normal mode
gmehmet 0:a12d6976d64c 622 if(setSensorPowerMode(BMI160::GYRO, BMI160::SUSPEND) != BMI160::RTN_NO_ERROR){
gmehmet 0:a12d6976d64c 623 printf("Failed to set gyroscope power mode\n");
gmehmet 0:a12d6976d64c 624 }
gmehmet 0:a12d6976d64c 625
gmehmet 0:a12d6976d64c 626 wait(0.1);
gmehmet 0:a12d6976d64c 627
gmehmet 0:a12d6976d64c 628 if(setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR){
gmehmet 0:a12d6976d64c 629 printf("Failed to set accelerometer power mode\n");
gmehmet 0:a12d6976d64c 630 }
gmehmet 0:a12d6976d64c 631 wait(0.1);
gmehmet 0:a12d6976d64c 632
gmehmet 0:a12d6976d64c 633 BMI160::AccConfig accConfig;
gmehmet 0:a12d6976d64c 634 BMI160::AccConfig accConfigRead;
gmehmet 0:a12d6976d64c 635 accConfig.range = BMI160::SENS_2G;
gmehmet 0:a12d6976d64c 636 accConfig.us = BMI160::ACC_US_OFF;
gmehmet 0:a12d6976d64c 637 accConfig.bwp = BMI160::ACC_BWP_2;
gmehmet 0:a12d6976d64c 638 accConfig.odr = BMI160::ACC_ODR_6;
gmehmet 0:a12d6976d64c 639 if(setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 640 {
gmehmet 0:a12d6976d64c 641 if(getSensorConfig(accConfigRead) == BMI160::RTN_NO_ERROR)
gmehmet 0:a12d6976d64c 642 {
gmehmet 0:a12d6976d64c 643 if((accConfig.range != accConfigRead.range) ||
gmehmet 0:a12d6976d64c 644 (accConfig.us != accConfigRead.us) ||
gmehmet 0:a12d6976d64c 645 (accConfig.bwp != accConfigRead.bwp) ||
gmehmet 0:a12d6976d64c 646 (accConfig.odr != accConfigRead.odr))
gmehmet 0:a12d6976d64c 647 {
gmehmet 0:a12d6976d64c 648 printf("ACC read data desn't equal set data\n\n");
gmehmet 0:a12d6976d64c 649 printf("ACC Set Range = %d\n", accConfig.range);
gmehmet 0:a12d6976d64c 650 printf("ACC Set UnderSampling = %d\n", accConfig.us);
gmehmet 0:a12d6976d64c 651 printf("ACC Set BandWidthParam = %d\n", accConfig.bwp);
gmehmet 0:a12d6976d64c 652 printf("ACC Set OutputDataRate = %d\n\n", accConfig.odr);
gmehmet 0:a12d6976d64c 653 printf("ACC Read Range = %d\n", accConfigRead.range);
gmehmet 0:a12d6976d64c 654 printf("ACC Read UnderSampling = %d\n", accConfigRead.us);
gmehmet 0:a12d6976d64c 655 printf("ACC Read BandWidthParam = %d\n", accConfigRead.bwp);
gmehmet 0:a12d6976d64c 656 printf("ACC Read OutputDataRate = %d\n\n", accConfigRead.odr);
gmehmet 0:a12d6976d64c 657 }
gmehmet 0:a12d6976d64c 658
gmehmet 0:a12d6976d64c 659 }
gmehmet 0:a12d6976d64c 660 else
gmehmet 0:a12d6976d64c 661 {
gmehmet 0:a12d6976d64c 662 printf("Failed to read back accelerometer configuration\n");
gmehmet 0:a12d6976d64c 663 }
gmehmet 0:a12d6976d64c 664 }
gmehmet 0:a12d6976d64c 665 else
gmehmet 0:a12d6976d64c 666 {
gmehmet 0:a12d6976d64c 667 printf("Failed to set accelerometer configuration\n");
gmehmet 0:a12d6976d64c 668 }
gmehmet 0:a12d6976d64c 669 return 0;
gmehmet 0:a12d6976d64c 670 }
gmehmet 0:a12d6976d64c 671
gmehmet 0:a12d6976d64c 672 //***********************************************************************************
gmehmet 0:a12d6976d64c 673 int32_t BMI160::enable_data_ready_interrupt() {
gmehmet 0:a12d6976d64c 674 uint8_t data = 0;
gmehmet 0:a12d6976d64c 675 uint8_t temp = 0;
gmehmet 0:a12d6976d64c 676 int32_t result;
gmehmet 0:a12d6976d64c 677
gmehmet 0:a12d6976d64c 678 result = readRegister(INT_EN_1, &data);
gmehmet 0:a12d6976d64c 679 temp = data & ~0x10;
gmehmet 0:a12d6976d64c 680 data = temp | ((1 << 4) & 0x10);
gmehmet 0:a12d6976d64c 681 /* Writing data to INT ENABLE 1 Address */
gmehmet 0:a12d6976d64c 682 result |= writeRegister(INT_EN_1, data);
gmehmet 0:a12d6976d64c 683
gmehmet 0:a12d6976d64c 684 // configure in_out ctrl
gmehmet 0:a12d6976d64c 685 //bmi160_get_regs(BMI160_INT_OUT_CTRL_ADDR, &data, 1, dev);
gmehmet 0:a12d6976d64c 686 result |= readRegister(INT_OUT_CTRL, &data);
gmehmet 0:a12d6976d64c 687 data = 0x09;
gmehmet 0:a12d6976d64c 688 result |= writeRegister(INT_OUT_CTRL,data);
gmehmet 0:a12d6976d64c 689
gmehmet 0:a12d6976d64c 690 //config int latch
gmehmet 0:a12d6976d64c 691 //bmi160_get_regs(BMI160_INT_LATCH_ADDR, &data, 1, dev);
gmehmet 0:a12d6976d64c 692 result |= readRegister(INT_LATCH, &data);
gmehmet 0:a12d6976d64c 693 data = 0x0F;
gmehmet 0:a12d6976d64c 694 result |= writeRegister(INT_LATCH, data);
gmehmet 0:a12d6976d64c 695
gmehmet 0:a12d6976d64c 696 //bmi160_get_regs(BMI160_INT_MAP_1_ADDR, &data, 1, dev);
gmehmet 0:a12d6976d64c 697 result |= readRegister(INT_MAP_1, &data);
gmehmet 0:a12d6976d64c 698 data = 0x80;
gmehmet 0:a12d6976d64c 699 result |= writeRegister(INT_MAP_1, data);
gmehmet 0:a12d6976d64c 700
gmehmet 0:a12d6976d64c 701 if(result != 0){
gmehmet 0:a12d6976d64c 702 printf("BMI160::%s failed.\r\n", __func__);
gmehmet 0:a12d6976d64c 703 return -1;
gmehmet 0:a12d6976d64c 704 }
gmehmet 0:a12d6976d64c 705
gmehmet 0:a12d6976d64c 706 m_bmi160_irq->disable_irq();
gmehmet 0:a12d6976d64c 707 m_bmi160_irq->mode(PullUp);
gmehmet 0:a12d6976d64c 708 m_bmi160_irq->fall(this, &BMI160::irq_handler);
gmehmet 0:a12d6976d64c 709 m_bmi160_irq->enable_irq();
gmehmet 0:a12d6976d64c 710 return 0;
gmehmet 0:a12d6976d64c 711 }
gmehmet 0:a12d6976d64c 712
gmehmet 0:a12d6976d64c 713 void BMI160::irq_handler() {
gmehmet 0:a12d6976d64c 714 bmi160_irq_asserted = true;
gmehmet 0:a12d6976d64c 715 }
gmehmet 0:a12d6976d64c 716
gmehmet 0:a12d6976d64c 717 int32_t BMI160::reset() {
gmehmet 0:a12d6976d64c 718 if (m_use_irq)
gmehmet 0:a12d6976d64c 719 m_bmi160_irq->disable_irq();
gmehmet 0:a12d6976d64c 720 bmi160_irq_asserted = false;
gmehmet 0:a12d6976d64c 721 writeRegister(CMD, SOFT_RESET);
gmehmet 0:a12d6976d64c 722 return 0;
gmehmet 0:a12d6976d64c 723 }