First Commit as a new library

Dependents:   Host_Software_MAX32664GWEB_HR_wrist Host_Software_MAX32664GWEC_SpO2_HR Host_Software_MAX32664GWEB_HR_EXTENDED Host_Software_MAX32664GWEC_SpO2_HR-_EXTE ... more

Committer:
seyhmuscacina
Date:
Wed Dec 19 14:54:05 2018 +0300
Revision:
21:f7216b5dc6c0
Parent:
19:8e66f58bef44
adds interrupt support to the BMI160 library

Who changed what in which revision?

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