Maxim Integrated / Mbed OS Host_Software_MAX32664GWEC_SpO2_HR-_EXTE

Dependencies:   BMI160 max32630hsp3 MemoryLCD USBDevice

Fork of Host_Software_MAX32664GWEC_SpO2_HR-_EXTE by Seyhmus Cacina

Committer:
seyhmus.cacina
Date:
Mon Mar 18 14:09:48 2019 +0300
Revision:
0:b259fd1a88f5
ME11C Sample Code First Commit

Who changed what in which revision?

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