BMI160 Initial

Dependents:   MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks

Committer:
CharlesMaxim
Date:
Tue Dec 04 09:50:52 2018 +0000
Revision:
21:0b28b9d13164
Parent:
19:8e66f58bef44
Initial Release for BMI160

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 }