Library for Bosch Sensortec BMI160 IMU

Dependents:   Rocket MAX32630FTHR_JOYSTICK MAX32630FTHR_IMU_Hello_World Pike_the_Flipper_Main_Branch ... more

Fork of BMI160 by Justin Jordan

Committer:
Emre.Eken
Date:
Fri May 04 13:35:59 2018 +0300
Revision:
20:a521606048bb
Parent:
19:8e66f58bef44
Some minor changes are done to make it be compiled by IAR. It can be still compiled by GCC, mbed online, Keil compilers and it has the same functionality with the previous revision

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
j3 16:12782f5d4aa4 37 const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G,
j3 16:12782f5d4aa4 38 ACC_US_OFF,
j3 16:12782f5d4aa4 39 ACC_BWP_2,
j3 16:12782f5d4aa4 40 ACC_ODR_8};
j3 16:12782f5d4aa4 41
j3 16:12782f5d4aa4 42 const struct BMI160::GyroConfig BMI160::DEFAULT_GYRO_CONFIG = {DPS_2000,
j3 16:12782f5d4aa4 43 GYRO_BWP_2,
j3 16:12782f5d4aa4 44 GYRO_ODR_8};
Emre.Eken 19:8e66f58bef44 45
Emre.Eken 19:8e66f58bef44 46 ///Period of internal counter
Emre.Eken 19:8e66f58bef44 47 static const float SENSOR_TIME_LSB = 39e-6;
Emre.Eken 19:8e66f58bef44 48
Emre.Eken 19:8e66f58bef44 49 static const float SENS_2G_LSB_PER_G = 16384.0F;
Emre.Eken 19:8e66f58bef44 50 static const float SENS_4G_LSB_PER_G = 8192.0F;
Emre.Eken 19:8e66f58bef44 51 static const float SENS_8G_LSB_PER_G = 4096.0F;
Emre.Eken 19:8e66f58bef44 52 static const float SENS_16G_LSB_PER_G = 2048.0F;
Emre.Eken 19:8e66f58bef44 53
Emre.Eken 19:8e66f58bef44 54 static const float SENS_2000_DPS_LSB_PER_DPS = 16.4F;
Emre.Eken 19:8e66f58bef44 55 static const float SENS_1000_DPS_LSB_PER_DPS = 32.8F;
Emre.Eken 19:8e66f58bef44 56 static const float SENS_500_DPS_LSB_PER_DPS = 65.6F;
Emre.Eken 19:8e66f58bef44 57 static const float SENS_250_DPS_LSB_PER_DPS = 131.2F;
Emre.Eken 19:8e66f58bef44 58 static const float SENS_125_DPS_LSB_PER_DPS = 262.4F;
j3 9:ca6b5fecdd63 59
j3 9:ca6b5fecdd63 60
j3 3:e1770675eca4 61 //*****************************************************************************
j3 5:35e032c8d8aa 62 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
j3 3:e1770675eca4 63 {
j3 3:e1770675eca4 64 int32_t rtnVal = -1;
j3 3:e1770675eca4 65
j3 5:35e032c8d8aa 66 switch(sensor)
j3 5:35e032c8d8aa 67 {
j3 5:35e032c8d8aa 68 case MAG:
j3 5:35e032c8d8aa 69 rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 70 break;
j3 5:35e032c8d8aa 71
j3 5:35e032c8d8aa 72 case GYRO:
j3 5:35e032c8d8aa 73 rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 74 break;
j3 5:35e032c8d8aa 75
j3 5:35e032c8d8aa 76 case ACC:
j3 5:35e032c8d8aa 77 rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 78 break;
j3 5:35e032c8d8aa 79
j3 5:35e032c8d8aa 80 default:
j3 5:35e032c8d8aa 81 rtnVal = -1;
j3 5:35e032c8d8aa 82 break;
j3 5:35e032c8d8aa 83 }
j3 5:35e032c8d8aa 84
j3 3:e1770675eca4 85 return rtnVal;
j3 3:e1770675eca4 86 }
j3 5:35e032c8d8aa 87
j3 5:35e032c8d8aa 88
j3 5:35e032c8d8aa 89 //*****************************************************************************
j3 16:12782f5d4aa4 90 int32_t BMI160::setSensorConfig(const AccConfig &config)
j3 5:35e032c8d8aa 91 {
j3 5:35e032c8d8aa 92 uint8_t data[2];
j3 5:35e032c8d8aa 93
j3 14:646eb94fa2eb 94 data[0] = ((config.us << ACC_US_POS) | (config.bwp << ACC_BWP_POS) |
j3 14:646eb94fa2eb 95 (config.odr << ACC_ODR_POS));
j3 14:646eb94fa2eb 96 data[1] = config.range;
j3 12:64931a80340d 97
j3 14:646eb94fa2eb 98 return writeBlock(ACC_CONF, ACC_RANGE, data);
j3 14:646eb94fa2eb 99 }
j3 14:646eb94fa2eb 100
j3 14:646eb94fa2eb 101
j3 14:646eb94fa2eb 102 //*****************************************************************************
j3 16:12782f5d4aa4 103 int32_t BMI160::setSensorConfig(const GyroConfig &config)
j3 16:12782f5d4aa4 104 {
j3 16:12782f5d4aa4 105 uint8_t data[2];
j3 16:12782f5d4aa4 106
j3 16:12782f5d4aa4 107 data[0] = ((config.bwp << GYRO_BWP_POS) | (config.odr << GYRO_ODR_POS));
j3 16:12782f5d4aa4 108 data[1] = config.range;
j3 16:12782f5d4aa4 109
j3 16:12782f5d4aa4 110 return writeBlock(GYR_CONF, GYR_RANGE, data);
j3 16:12782f5d4aa4 111 }
j3 16:12782f5d4aa4 112
j3 16:12782f5d4aa4 113
j3 16:12782f5d4aa4 114 //*****************************************************************************
j3 16:12782f5d4aa4 115 int32_t BMI160::getSensorConfig(AccConfig &config)
j3 14:646eb94fa2eb 116 {
j3 14:646eb94fa2eb 117 uint8_t data[2];
j3 14:646eb94fa2eb 118 int32_t rtnVal = readBlock(ACC_CONF, ACC_RANGE, data);
j3 14:646eb94fa2eb 119
j3 14:646eb94fa2eb 120 if(rtnVal == RTN_NO_ERROR)
j3 14:646eb94fa2eb 121 {
j3 14:646eb94fa2eb 122 config.range = static_cast<BMI160::AccRange>(
j3 14:646eb94fa2eb 123 (data[1] & ACC_RANGE_MASK));
j3 14:646eb94fa2eb 124 config.us = static_cast<BMI160::AccUnderSampling>(
j3 14:646eb94fa2eb 125 ((data[0] & ACC_US_MASK) >> ACC_US_POS));
j3 14:646eb94fa2eb 126 config.bwp = static_cast<BMI160::AccBandWidthParam>(
j3 14:646eb94fa2eb 127 ((data[0] & ACC_BWP_MASK) >> ACC_BWP_POS));
j3 16:12782f5d4aa4 128 config.odr = static_cast<BMI160::AccOutputDataRate>(
j3 14:646eb94fa2eb 129 ((data[0] & ACC_ODR_MASK) >> ACC_ODR_POS));
j3 14:646eb94fa2eb 130 }
j3 5:35e032c8d8aa 131
j3 5:35e032c8d8aa 132 return rtnVal;
j3 5:35e032c8d8aa 133 }
j3 8:a89b529b1d96 134
j3 8:a89b529b1d96 135
j3 8:a89b529b1d96 136 //*****************************************************************************
j3 16:12782f5d4aa4 137 int32_t BMI160::getSensorConfig(GyroConfig &config)
j3 16:12782f5d4aa4 138 {
j3 16:12782f5d4aa4 139 uint8_t data[2];
j3 16:12782f5d4aa4 140 int32_t rtnVal = readBlock(GYR_CONF, GYR_RANGE, data);
j3 16:12782f5d4aa4 141
j3 16:12782f5d4aa4 142 if(rtnVal == RTN_NO_ERROR)
j3 16:12782f5d4aa4 143 {
j3 16:12782f5d4aa4 144 config.range = static_cast<BMI160::GyroRange>(
j3 16:12782f5d4aa4 145 (data[1] & GYRO_RANGE_MASK));
j3 16:12782f5d4aa4 146 config.bwp = static_cast<BMI160::GyroBandWidthParam>(
j3 16:12782f5d4aa4 147 ((data[0] & GYRO_BWP_MASK) >> GYRO_BWP_POS));
j3 16:12782f5d4aa4 148 config.odr = static_cast<BMI160::GyroOutputDataRate>(
j3 16:12782f5d4aa4 149 ((data[0] & GYRO_ODR_MASK) >> GYRO_ODR_POS));
j3 16:12782f5d4aa4 150 }
j3 16:12782f5d4aa4 151
j3 16:12782f5d4aa4 152 return rtnVal;
j3 16:12782f5d4aa4 153 }
j3 16:12782f5d4aa4 154
j3 16:12782f5d4aa4 155
j3 16:12782f5d4aa4 156 //*****************************************************************************
j3 16:12782f5d4aa4 157 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, AccRange range)
j3 8:a89b529b1d96 158 {
j3 8:a89b529b1d96 159 uint8_t localData[2];
j3 8:a89b529b1d96 160 int32_t rtnVal;
j3 8:a89b529b1d96 161
j3 8:a89b529b1d96 162 switch(axis)
j3 8:a89b529b1d96 163 {
j3 8:a89b529b1d96 164 case X_AXIS:
j3 8:a89b529b1d96 165 rtnVal = readBlock(DATA_14, DATA_15, localData);
j3 8:a89b529b1d96 166 break;
j3 8:a89b529b1d96 167
j3 8:a89b529b1d96 168 case Y_AXIS:
j3 8:a89b529b1d96 169 rtnVal = readBlock(DATA_16, DATA_17, localData);
j3 8:a89b529b1d96 170 break;
j3 8:a89b529b1d96 171
j3 8:a89b529b1d96 172 case Z_AXIS:
j3 8:a89b529b1d96 173 rtnVal = readBlock(DATA_18, DATA_19, localData);
j3 8:a89b529b1d96 174 break;
j3 8:a89b529b1d96 175
j3 8:a89b529b1d96 176 default:
j3 8:a89b529b1d96 177 rtnVal = -1;
j3 8:a89b529b1d96 178 break;
j3 8:a89b529b1d96 179 }
j3 8:a89b529b1d96 180
j3 8:a89b529b1d96 181 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 182 {
j3 8:a89b529b1d96 183 data.raw = ((localData[1] << 8) | localData[0]);
j3 12:64931a80340d 184 switch(range)
j3 9:ca6b5fecdd63 185 {
j3 9:ca6b5fecdd63 186 case SENS_2G:
j3 15:dc35ccc0b08e 187 data.scaled = (data.raw/SENS_2G_LSB_PER_G);
j3 9:ca6b5fecdd63 188 break;
j3 9:ca6b5fecdd63 189
j3 9:ca6b5fecdd63 190 case SENS_4G:
j3 15:dc35ccc0b08e 191 data.scaled = (data.raw/SENS_4G_LSB_PER_G);
j3 9:ca6b5fecdd63 192 break;
j3 9:ca6b5fecdd63 193
j3 9:ca6b5fecdd63 194 case SENS_8G:
j3 15:dc35ccc0b08e 195 data.scaled = (data.raw/SENS_8G_LSB_PER_G);
j3 9:ca6b5fecdd63 196 break;
j3 9:ca6b5fecdd63 197
j3 9:ca6b5fecdd63 198 case SENS_16G:
j3 15:dc35ccc0b08e 199 data.scaled = (data.raw/SENS_16G_LSB_PER_G);
j3 9:ca6b5fecdd63 200 break;
j3 9:ca6b5fecdd63 201 }
j3 8:a89b529b1d96 202 }
j3 8:a89b529b1d96 203
j3 8:a89b529b1d96 204 return rtnVal;
j3 8:a89b529b1d96 205 }
j3 16:12782f5d4aa4 206
j3 16:12782f5d4aa4 207
j3 16:12782f5d4aa4 208 //*****************************************************************************
j3 16:12782f5d4aa4 209 int32_t BMI160::getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range)
j3 16:12782f5d4aa4 210 {
j3 16:12782f5d4aa4 211 uint8_t localData[2];
j3 16:12782f5d4aa4 212 int32_t rtnVal;
j3 16:12782f5d4aa4 213
j3 16:12782f5d4aa4 214 switch(axis)
j3 16:12782f5d4aa4 215 {
j3 16:12782f5d4aa4 216 case X_AXIS:
j3 16:12782f5d4aa4 217 rtnVal = readBlock(DATA_8, DATA_9, localData);
j3 16:12782f5d4aa4 218 break;
j3 16:12782f5d4aa4 219
j3 16:12782f5d4aa4 220 case Y_AXIS:
j3 16:12782f5d4aa4 221 rtnVal = readBlock(DATA_10, DATA_11, localData);
j3 16:12782f5d4aa4 222 break;
j3 16:12782f5d4aa4 223
j3 16:12782f5d4aa4 224 case Z_AXIS:
j3 16:12782f5d4aa4 225 rtnVal = readBlock(DATA_12, DATA_13, localData);
j3 16:12782f5d4aa4 226 break;
j3 16:12782f5d4aa4 227
j3 16:12782f5d4aa4 228 default:
j3 16:12782f5d4aa4 229 rtnVal = -1;
j3 16:12782f5d4aa4 230 break;
j3 16:12782f5d4aa4 231 }
j3 16:12782f5d4aa4 232
j3 16:12782f5d4aa4 233 if(rtnVal == RTN_NO_ERROR)
j3 16:12782f5d4aa4 234 {
j3 16:12782f5d4aa4 235 data.raw = ((localData[1] << 8) | localData[0]);
j3 16:12782f5d4aa4 236 switch(range)
j3 16:12782f5d4aa4 237 {
j3 16:12782f5d4aa4 238 case DPS_2000:
j3 16:12782f5d4aa4 239 data.scaled = (data.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 240 break;
j3 16:12782f5d4aa4 241
j3 16:12782f5d4aa4 242 case DPS_1000:
j3 16:12782f5d4aa4 243 data.scaled = (data.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 244 break;
j3 16:12782f5d4aa4 245
j3 16:12782f5d4aa4 246 case DPS_500:
j3 16:12782f5d4aa4 247 data.scaled = (data.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 248 break;
j3 16:12782f5d4aa4 249
j3 16:12782f5d4aa4 250 case DPS_250:
j3 16:12782f5d4aa4 251 data.scaled = (data.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 252 break;
j3 16:12782f5d4aa4 253
j3 16:12782f5d4aa4 254 case DPS_125:
j3 16:12782f5d4aa4 255 data.scaled = (data.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 256 break;
j3 16:12782f5d4aa4 257 }
j3 16:12782f5d4aa4 258 }
j3 16:12782f5d4aa4 259
j3 16:12782f5d4aa4 260 return rtnVal;
j3 16:12782f5d4aa4 261 }
j3 8:a89b529b1d96 262
j3 8:a89b529b1d96 263
j3 8:a89b529b1d96 264 //*****************************************************************************
j3 16:12782f5d4aa4 265 int32_t BMI160::getSensorXYZ(SensorData &data, AccRange range)
j3 8:a89b529b1d96 266 {
j3 8:a89b529b1d96 267 uint8_t localData[6];
j3 8:a89b529b1d96 268 int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
j3 8:a89b529b1d96 269
j3 8:a89b529b1d96 270 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 271 {
j3 8:a89b529b1d96 272 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 8:a89b529b1d96 273 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 8:a89b529b1d96 274 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 8:a89b529b1d96 275
j3 12:64931a80340d 276 switch(range)
j3 9:ca6b5fecdd63 277 {
j3 9:ca6b5fecdd63 278 case SENS_2G:
j3 15:dc35ccc0b08e 279 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
j3 15:dc35ccc0b08e 280 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
j3 15:dc35ccc0b08e 281 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
j3 9:ca6b5fecdd63 282 break;
j3 9:ca6b5fecdd63 283
j3 9:ca6b5fecdd63 284 case SENS_4G:
j3 15:dc35ccc0b08e 285 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
j3 15:dc35ccc0b08e 286 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
j3 15:dc35ccc0b08e 287 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
j3 9:ca6b5fecdd63 288 break;
j3 9:ca6b5fecdd63 289
j3 9:ca6b5fecdd63 290 case SENS_8G:
j3 15:dc35ccc0b08e 291 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
j3 15:dc35ccc0b08e 292 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
j3 15:dc35ccc0b08e 293 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
j3 9:ca6b5fecdd63 294 break;
j3 9:ca6b5fecdd63 295
j3 9:ca6b5fecdd63 296 case SENS_16G:
j3 15:dc35ccc0b08e 297 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
j3 15:dc35ccc0b08e 298 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
j3 15:dc35ccc0b08e 299 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
j3 9:ca6b5fecdd63 300 break;
j3 9:ca6b5fecdd63 301 }
j3 8:a89b529b1d96 302 }
j3 8:a89b529b1d96 303
j3 8:a89b529b1d96 304 return rtnVal;
j3 8:a89b529b1d96 305 }
j3 10:9e219f2f1fb3 306
j3 10:9e219f2f1fb3 307
j3 16:12782f5d4aa4 308 //*****************************************************************************
j3 16:12782f5d4aa4 309 int32_t BMI160::getSensorXYZ(SensorData &data, GyroRange range)
j3 16:12782f5d4aa4 310 {
j3 16:12782f5d4aa4 311 uint8_t localData[6];
j3 16:12782f5d4aa4 312 int32_t rtnVal = readBlock(DATA_8, DATA_13, localData);
j3 16:12782f5d4aa4 313
j3 16:12782f5d4aa4 314 if(rtnVal == RTN_NO_ERROR)
j3 16:12782f5d4aa4 315 {
j3 16:12782f5d4aa4 316 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 16:12782f5d4aa4 317 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 16:12782f5d4aa4 318 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 16:12782f5d4aa4 319
j3 16:12782f5d4aa4 320 switch(range)
j3 16:12782f5d4aa4 321 {
j3 16:12782f5d4aa4 322 case DPS_2000:
j3 16:12782f5d4aa4 323 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 324 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 325 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 326 break;
j3 16:12782f5d4aa4 327
j3 16:12782f5d4aa4 328 case DPS_1000:
j3 16:12782f5d4aa4 329 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 330 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 331 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 332 break;
j3 16:12782f5d4aa4 333
j3 16:12782f5d4aa4 334 case DPS_500:
j3 16:12782f5d4aa4 335 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 336 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 337 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 338 break;
j3 16:12782f5d4aa4 339
j3 16:12782f5d4aa4 340 case DPS_250:
j3 16:12782f5d4aa4 341 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 342 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 343 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 344 break;
j3 16:12782f5d4aa4 345
j3 16:12782f5d4aa4 346 case DPS_125:
j3 16:12782f5d4aa4 347 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 348 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 349 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 350 break;
j3 16:12782f5d4aa4 351 }
j3 16:12782f5d4aa4 352 }
j3 16:12782f5d4aa4 353
j3 16:12782f5d4aa4 354 return rtnVal;
j3 16:12782f5d4aa4 355 }
j3 16:12782f5d4aa4 356
j3 16:12782f5d4aa4 357
j3 10:9e219f2f1fb3 358 //*****************************************************************************
j3 16:12782f5d4aa4 359 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
j3 16:12782f5d4aa4 360 SensorTime &sensorTime,
j3 16:12782f5d4aa4 361 AccRange range)
j3 15:dc35ccc0b08e 362 {
j3 15:dc35ccc0b08e 363 uint8_t localData[9];
j3 15:dc35ccc0b08e 364 int32_t rtnVal = readBlock(DATA_14, SENSORTIME_2, localData);
j3 15:dc35ccc0b08e 365 if(rtnVal == RTN_NO_ERROR)
j3 15:dc35ccc0b08e 366 {
j3 15:dc35ccc0b08e 367 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 15:dc35ccc0b08e 368 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 15:dc35ccc0b08e 369 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 15:dc35ccc0b08e 370
j3 15:dc35ccc0b08e 371 switch(range)
j3 15:dc35ccc0b08e 372 {
j3 15:dc35ccc0b08e 373 case SENS_2G:
j3 15:dc35ccc0b08e 374 data.xAxis.scaled = (data.xAxis.raw/SENS_2G_LSB_PER_G);
j3 15:dc35ccc0b08e 375 data.yAxis.scaled = (data.yAxis.raw/SENS_2G_LSB_PER_G);
j3 15:dc35ccc0b08e 376 data.zAxis.scaled = (data.zAxis.raw/SENS_2G_LSB_PER_G);
j3 15:dc35ccc0b08e 377 break;
j3 15:dc35ccc0b08e 378
j3 15:dc35ccc0b08e 379 case SENS_4G:
j3 15:dc35ccc0b08e 380 data.xAxis.scaled = (data.xAxis.raw/SENS_4G_LSB_PER_G);
j3 15:dc35ccc0b08e 381 data.yAxis.scaled = (data.yAxis.raw/SENS_4G_LSB_PER_G);
j3 15:dc35ccc0b08e 382 data.zAxis.scaled = (data.zAxis.raw/SENS_4G_LSB_PER_G);
j3 15:dc35ccc0b08e 383 break;
j3 15:dc35ccc0b08e 384
j3 15:dc35ccc0b08e 385 case SENS_8G:
j3 15:dc35ccc0b08e 386 data.xAxis.scaled = (data.xAxis.raw/SENS_8G_LSB_PER_G);
j3 15:dc35ccc0b08e 387 data.yAxis.scaled = (data.yAxis.raw/SENS_8G_LSB_PER_G);
j3 15:dc35ccc0b08e 388 data.zAxis.scaled = (data.zAxis.raw/SENS_8G_LSB_PER_G);
j3 15:dc35ccc0b08e 389 break;
j3 15:dc35ccc0b08e 390
j3 15:dc35ccc0b08e 391 case SENS_16G:
j3 15:dc35ccc0b08e 392 data.xAxis.scaled = (data.xAxis.raw/SENS_16G_LSB_PER_G);
j3 15:dc35ccc0b08e 393 data.yAxis.scaled = (data.yAxis.raw/SENS_16G_LSB_PER_G);
j3 15:dc35ccc0b08e 394 data.zAxis.scaled = (data.zAxis.raw/SENS_16G_LSB_PER_G);
j3 15:dc35ccc0b08e 395 break;
j3 15:dc35ccc0b08e 396 }
j3 15:dc35ccc0b08e 397
j3 15:dc35ccc0b08e 398 sensorTime.raw = ((localData[8] << 16) | (localData[7] << 8) |
j3 15:dc35ccc0b08e 399 localData[6]);
j3 15:dc35ccc0b08e 400 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
j3 15:dc35ccc0b08e 401 }
j3 15:dc35ccc0b08e 402
j3 15:dc35ccc0b08e 403 return rtnVal;
j3 15:dc35ccc0b08e 404 }
j3 15:dc35ccc0b08e 405
j3 15:dc35ccc0b08e 406
j3 15:dc35ccc0b08e 407 //*****************************************************************************
j3 16:12782f5d4aa4 408 int32_t BMI160::getSensorXYZandSensorTime(SensorData &data,
j3 16:12782f5d4aa4 409 SensorTime &sensorTime,
j3 16:12782f5d4aa4 410 GyroRange range)
j3 16:12782f5d4aa4 411 {
j3 16:12782f5d4aa4 412 uint8_t localData[16];
j3 16:12782f5d4aa4 413 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
j3 16:12782f5d4aa4 414 if(rtnVal == RTN_NO_ERROR)
j3 16:12782f5d4aa4 415 {
j3 16:12782f5d4aa4 416 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 16:12782f5d4aa4 417 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 16:12782f5d4aa4 418 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 16:12782f5d4aa4 419
j3 16:12782f5d4aa4 420 switch(range)
j3 16:12782f5d4aa4 421 {
j3 16:12782f5d4aa4 422 case DPS_2000:
j3 16:12782f5d4aa4 423 data.xAxis.scaled = (data.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 424 data.yAxis.scaled = (data.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 425 data.zAxis.scaled = (data.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 426 break;
j3 16:12782f5d4aa4 427
j3 16:12782f5d4aa4 428 case DPS_1000:
j3 16:12782f5d4aa4 429 data.xAxis.scaled = (data.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 430 data.yAxis.scaled = (data.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 431 data.zAxis.scaled = (data.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 432 break;
j3 16:12782f5d4aa4 433
j3 16:12782f5d4aa4 434 case DPS_500:
j3 16:12782f5d4aa4 435 data.xAxis.scaled = (data.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 436 data.yAxis.scaled = (data.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 437 data.zAxis.scaled = (data.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 438 break;
j3 16:12782f5d4aa4 439
j3 16:12782f5d4aa4 440 case DPS_250:
j3 16:12782f5d4aa4 441 data.xAxis.scaled = (data.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 442 data.yAxis.scaled = (data.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 443 data.zAxis.scaled = (data.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 444 break;
j3 16:12782f5d4aa4 445
j3 16:12782f5d4aa4 446 case DPS_125:
j3 16:12782f5d4aa4 447 data.xAxis.scaled = (data.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 448 data.yAxis.scaled = (data.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 449 data.zAxis.scaled = (data.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 450 break;
j3 16:12782f5d4aa4 451 }
j3 16:12782f5d4aa4 452
j3 16:12782f5d4aa4 453 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
j3 16:12782f5d4aa4 454 localData[12]);
j3 16:12782f5d4aa4 455 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
j3 16:12782f5d4aa4 456 }
j3 16:12782f5d4aa4 457
j3 16:12782f5d4aa4 458 return rtnVal;
j3 16:12782f5d4aa4 459 }
j3 16:12782f5d4aa4 460
j3 16:12782f5d4aa4 461
j3 16:12782f5d4aa4 462 //*****************************************************************************
j3 16:12782f5d4aa4 463 int32_t BMI160::getGyroAccXYZandSensorTime(SensorData &accData,
j3 16:12782f5d4aa4 464 SensorData &gyroData,
j3 16:12782f5d4aa4 465 SensorTime &sensorTime,
j3 16:12782f5d4aa4 466 AccRange accRange,
j3 16:12782f5d4aa4 467 GyroRange gyroRange)
j3 16:12782f5d4aa4 468 {
j3 16:12782f5d4aa4 469 uint8_t localData[16];
j3 16:12782f5d4aa4 470 int32_t rtnVal = readBlock(DATA_8, SENSORTIME_2, localData);
j3 16:12782f5d4aa4 471 if(rtnVal == RTN_NO_ERROR)
j3 16:12782f5d4aa4 472 {
j3 16:12782f5d4aa4 473 gyroData.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 16:12782f5d4aa4 474 gyroData.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 16:12782f5d4aa4 475 gyroData.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 16:12782f5d4aa4 476
j3 16:12782f5d4aa4 477 accData.xAxis.raw = ((localData[7] << 8) | localData[6]);
j3 16:12782f5d4aa4 478 accData.yAxis.raw = ((localData[9] << 8) | localData[8]);
j3 16:12782f5d4aa4 479 accData.zAxis.raw = ((localData[11] << 8) | localData[10]);
j3 16:12782f5d4aa4 480
j3 16:12782f5d4aa4 481 switch(gyroRange)
j3 16:12782f5d4aa4 482 {
j3 16:12782f5d4aa4 483 case DPS_2000:
j3 16:12782f5d4aa4 484 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 485 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 486 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_2000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 487 break;
j3 16:12782f5d4aa4 488
j3 16:12782f5d4aa4 489 case DPS_1000:
j3 16:12782f5d4aa4 490 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 491 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 492 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_1000_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 493 break;
j3 16:12782f5d4aa4 494
j3 16:12782f5d4aa4 495 case DPS_500:
j3 16:12782f5d4aa4 496 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 497 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 498 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_500_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 499 break;
j3 16:12782f5d4aa4 500
j3 16:12782f5d4aa4 501 case DPS_250:
j3 16:12782f5d4aa4 502 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 503 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 504 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_250_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 505 break;
j3 16:12782f5d4aa4 506
j3 16:12782f5d4aa4 507 case DPS_125:
j3 16:12782f5d4aa4 508 gyroData.xAxis.scaled = (gyroData.xAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 509 gyroData.yAxis.scaled = (gyroData.yAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 510 gyroData.zAxis.scaled = (gyroData.zAxis.raw/SENS_125_DPS_LSB_PER_DPS);
j3 16:12782f5d4aa4 511 break;
j3 16:12782f5d4aa4 512 }
j3 16:12782f5d4aa4 513
j3 16:12782f5d4aa4 514 switch(accRange)
j3 16:12782f5d4aa4 515 {
j3 16:12782f5d4aa4 516 case SENS_2G:
j3 16:12782f5d4aa4 517 accData.xAxis.scaled = (accData.xAxis.raw/SENS_2G_LSB_PER_G);
j3 16:12782f5d4aa4 518 accData.yAxis.scaled = (accData.yAxis.raw/SENS_2G_LSB_PER_G);
j3 16:12782f5d4aa4 519 accData.zAxis.scaled = (accData.zAxis.raw/SENS_2G_LSB_PER_G);
j3 16:12782f5d4aa4 520 break;
j3 16:12782f5d4aa4 521
j3 16:12782f5d4aa4 522 case SENS_4G:
j3 16:12782f5d4aa4 523 accData.xAxis.scaled = (accData.xAxis.raw/SENS_4G_LSB_PER_G);
j3 16:12782f5d4aa4 524 accData.yAxis.scaled = (accData.yAxis.raw/SENS_4G_LSB_PER_G);
j3 16:12782f5d4aa4 525 accData.zAxis.scaled = (accData.zAxis.raw/SENS_4G_LSB_PER_G);
j3 16:12782f5d4aa4 526 break;
j3 16:12782f5d4aa4 527
j3 16:12782f5d4aa4 528 case SENS_8G:
j3 16:12782f5d4aa4 529 accData.xAxis.scaled = (accData.xAxis.raw/SENS_8G_LSB_PER_G);
j3 16:12782f5d4aa4 530 accData.yAxis.scaled = (accData.yAxis.raw/SENS_8G_LSB_PER_G);
j3 16:12782f5d4aa4 531 accData.zAxis.scaled = (accData.zAxis.raw/SENS_8G_LSB_PER_G);
j3 16:12782f5d4aa4 532 break;
j3 16:12782f5d4aa4 533
j3 16:12782f5d4aa4 534 case SENS_16G:
j3 16:12782f5d4aa4 535 accData.xAxis.scaled = (accData.xAxis.raw/SENS_16G_LSB_PER_G);
j3 16:12782f5d4aa4 536 accData.yAxis.scaled = (accData.yAxis.raw/SENS_16G_LSB_PER_G);
j3 16:12782f5d4aa4 537 accData.zAxis.scaled = (accData.zAxis.raw/SENS_16G_LSB_PER_G);
j3 16:12782f5d4aa4 538 break;
j3 16:12782f5d4aa4 539 }
j3 16:12782f5d4aa4 540
j3 16:12782f5d4aa4 541 sensorTime.raw = ((localData[14] << 16) | (localData[13] << 8) |
j3 16:12782f5d4aa4 542 localData[12]);
j3 16:12782f5d4aa4 543 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
j3 16:12782f5d4aa4 544 }
j3 16:12782f5d4aa4 545
j3 16:12782f5d4aa4 546 return rtnVal;
j3 16:12782f5d4aa4 547 }
j3 16:12782f5d4aa4 548
j3 16:12782f5d4aa4 549
j3 16:12782f5d4aa4 550 //*****************************************************************************
j3 15:dc35ccc0b08e 551 int32_t BMI160::getSensorTime(SensorTime &sensorTime)
j3 10:9e219f2f1fb3 552 {
j3 10:9e219f2f1fb3 553 uint8_t localData[3];
j3 10:9e219f2f1fb3 554 int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
j3 10:9e219f2f1fb3 555
j3 10:9e219f2f1fb3 556 if(rtnVal == RTN_NO_ERROR)
j3 10:9e219f2f1fb3 557 {
j3 15:dc35ccc0b08e 558 sensorTime.raw = ((localData[2] << 16) | (localData[1] << 8) |
j3 15:dc35ccc0b08e 559 localData[0]);
j3 15:dc35ccc0b08e 560 sensorTime.seconds = (sensorTime.raw * SENSOR_TIME_LSB);
j3 10:9e219f2f1fb3 561 }
j3 10:9e219f2f1fb3 562
j3 10:9e219f2f1fb3 563 return rtnVal;
j3 10:9e219f2f1fb3 564 }
j3 10:9e219f2f1fb3 565
j3 12:64931a80340d 566
j3 12:64931a80340d 567 //*****************************************************************************
j3 12:64931a80340d 568 int32_t BMI160::getTemperature(float *temp)
j3 12:64931a80340d 569 {
j3 12:64931a80340d 570 uint8_t data[2];
j3 12:64931a80340d 571 uint16_t rawTemp;
j3 12:64931a80340d 572
j3 12:64931a80340d 573 int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
j3 12:64931a80340d 574 if(rtnVal == RTN_NO_ERROR)
j3 12:64931a80340d 575 {
j3 12:64931a80340d 576 rawTemp = ((data[1] << 8) | data[0]);
j3 12:64931a80340d 577 if(rawTemp & 0x8000)
j3 12:64931a80340d 578 {
j3 12:64931a80340d 579 *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
j3 12:64931a80340d 580 }
j3 12:64931a80340d 581 else
j3 12:64931a80340d 582 {
j3 12:64931a80340d 583 *temp = ((rawTemp/512.0F) + 23.0F);
j3 12:64931a80340d 584 }
j3 12:64931a80340d 585 }
j3 12:64931a80340d 586
j3 12:64931a80340d 587 return rtnVal;
j3 12:64931a80340d 588 }