test

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Committer:
seyhmus.cacina
Date:
Mon Mar 18 10:21:53 2019 +0300
Revision:
0:ac4dea3e2894
ME11B Sample Code First Commit

Who changed what in which revision?

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