Example Host software for integration of MAX3266x chips (, MAX32664GWEB) equipped with Heart Rate from Wrist Algorithm. This is “stand-alone” software that runs on the MAX32630 low-power microcontroller to display heart rate on the display of the MAXREFDES101 reference design. It is intended provide a simple example of how to initialize and communicate with the sensor hub. Windows and Android communications are not supported.

Dependencies:   Maxim_Sensor_Hub_Communications BMI160 whrmDemoUI max32630hsp3

Fork of Host_Software_MAX32664GWEB_HR_wrist by mehmet gok

Committer:
gmehmet
Date:
Mon Dec 17 10:34:32 2018 +0300
Revision:
0:ddc2fef69ef9
First Commit New Repo name

Who changed what in which revision?

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