Library for Bosch Sensortec BMI160 IMU

Dependents:   Rocket MAX32630FTHR_JOYSTICK MAX32630FTHR_IMU_Hello_World Pike_the_Flipper_Main_Branch ... more

Fork of BMI160 by Justin Jordan

Committer:
j3
Date:
Tue Dec 20 18:38:42 2016 +0000
Revision:
12:64931a80340d
Parent:
10:9e219f2f1fb3
Child:
14:646eb94fa2eb
experimenting with doxygen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j3 3:e1770675eca4 1 /**********************************************************************
j3 3:e1770675eca4 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
j3 3:e1770675eca4 3 *
j3 3:e1770675eca4 4 * Permission is hereby granted, free of charge, to any person obtaining a
j3 3:e1770675eca4 5 * copy of this software and associated documentation files (the "Software"),
j3 3:e1770675eca4 6 * to deal in the Software without restriction, including without limitation
j3 3:e1770675eca4 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
j3 3:e1770675eca4 8 * and/or sell copies of the Software, and to permit persons to whom the
j3 3:e1770675eca4 9 * Software is furnished to do so, subject to the following conditions:
j3 3:e1770675eca4 10 *
j3 3:e1770675eca4 11 * The above copyright notice and this permission notice shall be included
j3 3:e1770675eca4 12 * in all copies or substantial portions of the Software.
j3 3:e1770675eca4 13 *
j3 3:e1770675eca4 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
j3 3:e1770675eca4 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
j3 3:e1770675eca4 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
j3 3:e1770675eca4 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
j3 3:e1770675eca4 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
j3 3:e1770675eca4 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
j3 3:e1770675eca4 20 * OTHER DEALINGS IN THE SOFTWARE.
j3 3:e1770675eca4 21 *
j3 3:e1770675eca4 22 * Except as contained in this notice, the name of Maxim Integrated
j3 3:e1770675eca4 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
j3 3:e1770675eca4 24 * Products, Inc. Branding Policy.
j3 3:e1770675eca4 25 *
j3 3:e1770675eca4 26 * The mere transfer of this software does not imply any licenses
j3 3:e1770675eca4 27 * of trade secrets, proprietary technology, copyrights, patents,
j3 3:e1770675eca4 28 * trademarks, maskwork rights, or any other form of intellectual
j3 3:e1770675eca4 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
j3 3:e1770675eca4 30 * ownership rights.
j3 3:e1770675eca4 31 **********************************************************************/
j3 3:e1770675eca4 32
j3 3:e1770675eca4 33
j3 3:e1770675eca4 34 #include "bmi160.h"
j3 3:e1770675eca4 35
j3 3:e1770675eca4 36
j3 9:ca6b5fecdd63 37 const struct BMI160::AccConfig BMI160::DEFAULT_ACC_CONFIG = {SENS_2G, ACC_US_OFF, ACC_BWP_2, ACC_ODR_8};
j3 9:ca6b5fecdd63 38
j3 9:ca6b5fecdd63 39
j3 3:e1770675eca4 40 //*****************************************************************************
j3 5:35e032c8d8aa 41 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
j3 3:e1770675eca4 42 {
j3 3:e1770675eca4 43 int32_t rtnVal = -1;
j3 3:e1770675eca4 44
j3 5:35e032c8d8aa 45 switch(sensor)
j3 5:35e032c8d8aa 46 {
j3 5:35e032c8d8aa 47 case MAG:
j3 5:35e032c8d8aa 48 rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 49 break;
j3 5:35e032c8d8aa 50
j3 5:35e032c8d8aa 51 case GYRO:
j3 5:35e032c8d8aa 52 rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 53 break;
j3 5:35e032c8d8aa 54
j3 5:35e032c8d8aa 55 case ACC:
j3 5:35e032c8d8aa 56 rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 57 break;
j3 5:35e032c8d8aa 58
j3 5:35e032c8d8aa 59 default:
j3 5:35e032c8d8aa 60 rtnVal = -1;
j3 5:35e032c8d8aa 61 break;
j3 5:35e032c8d8aa 62 }
j3 5:35e032c8d8aa 63
j3 3:e1770675eca4 64 return rtnVal;
j3 3:e1770675eca4 65 }
j3 5:35e032c8d8aa 66
j3 5:35e032c8d8aa 67
j3 5:35e032c8d8aa 68 //*****************************************************************************
j3 12:64931a80340d 69 int32_t setAccConfig(const AccConfig &config)
j3 5:35e032c8d8aa 70 {
j3 12:64931a80340d 71 int32_t rtnVal = -1;
j3 5:35e032c8d8aa 72 uint8_t data[2];
j3 5:35e032c8d8aa 73
j3 12:64931a80340d 74
j3 5:35e032c8d8aa 75
j3 5:35e032c8d8aa 76 return rtnVal;
j3 5:35e032c8d8aa 77 }
j3 8:a89b529b1d96 78
j3 8:a89b529b1d96 79
j3 8:a89b529b1d96 80 //*****************************************************************************
j3 12:64931a80340d 81 int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data, AccRange range)
j3 8:a89b529b1d96 82 {
j3 8:a89b529b1d96 83 uint8_t localData[2];
j3 8:a89b529b1d96 84 int32_t rtnVal;
j3 8:a89b529b1d96 85
j3 8:a89b529b1d96 86 switch(axis)
j3 8:a89b529b1d96 87 {
j3 8:a89b529b1d96 88 case X_AXIS:
j3 8:a89b529b1d96 89 rtnVal = readBlock(DATA_14, DATA_15, localData);
j3 8:a89b529b1d96 90 break;
j3 8:a89b529b1d96 91
j3 8:a89b529b1d96 92 case Y_AXIS:
j3 8:a89b529b1d96 93 rtnVal = readBlock(DATA_16, DATA_17, localData);
j3 8:a89b529b1d96 94 break;
j3 8:a89b529b1d96 95
j3 8:a89b529b1d96 96 case Z_AXIS:
j3 8:a89b529b1d96 97 rtnVal = readBlock(DATA_18, DATA_19, localData);
j3 8:a89b529b1d96 98 break;
j3 8:a89b529b1d96 99
j3 8:a89b529b1d96 100 default:
j3 8:a89b529b1d96 101 rtnVal = -1;
j3 8:a89b529b1d96 102 break;
j3 8:a89b529b1d96 103 }
j3 8:a89b529b1d96 104
j3 8:a89b529b1d96 105 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 106 {
j3 8:a89b529b1d96 107 data.raw = ((localData[1] << 8) | localData[0]);
j3 12:64931a80340d 108 switch(range)
j3 9:ca6b5fecdd63 109 {
j3 9:ca6b5fecdd63 110 //magic numbers are typical values for LSB/g from EC table
j3 9:ca6b5fecdd63 111 case SENS_2G:
j3 9:ca6b5fecdd63 112 data.scaled = (data.raw/16384.0F);
j3 9:ca6b5fecdd63 113 break;
j3 9:ca6b5fecdd63 114
j3 9:ca6b5fecdd63 115 case SENS_4G:
j3 9:ca6b5fecdd63 116 data.scaled = (data.raw/8192.0F);
j3 9:ca6b5fecdd63 117 break;
j3 9:ca6b5fecdd63 118
j3 9:ca6b5fecdd63 119 case SENS_8G:
j3 9:ca6b5fecdd63 120 data.scaled = (data.raw/4096.0F);
j3 9:ca6b5fecdd63 121 break;
j3 9:ca6b5fecdd63 122
j3 9:ca6b5fecdd63 123 case SENS_16G:
j3 9:ca6b5fecdd63 124 data.scaled = (data.raw/2048.0F);
j3 9:ca6b5fecdd63 125 break;
j3 9:ca6b5fecdd63 126 }
j3 8:a89b529b1d96 127 }
j3 8:a89b529b1d96 128
j3 8:a89b529b1d96 129 return rtnVal;
j3 8:a89b529b1d96 130 }
j3 8:a89b529b1d96 131
j3 8:a89b529b1d96 132
j3 8:a89b529b1d96 133 //*****************************************************************************
j3 12:64931a80340d 134 int32_t BMI160::getAccXYZ(SensorData &data, AccRange range)
j3 8:a89b529b1d96 135 {
j3 8:a89b529b1d96 136 uint8_t localData[6];
j3 8:a89b529b1d96 137 int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
j3 8:a89b529b1d96 138
j3 8:a89b529b1d96 139 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 140 {
j3 8:a89b529b1d96 141 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 8:a89b529b1d96 142 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 8:a89b529b1d96 143 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 8:a89b529b1d96 144
j3 12:64931a80340d 145 switch(range)
j3 9:ca6b5fecdd63 146 {
j3 9:ca6b5fecdd63 147 //magic numbers are typical values for LSB/g from EC table
j3 9:ca6b5fecdd63 148 case SENS_2G:
j3 9:ca6b5fecdd63 149 data.xAxis.scaled = (data.xAxis.raw/16384.0F);
j3 9:ca6b5fecdd63 150 data.yAxis.scaled = (data.yAxis.raw/16384.0F);
j3 9:ca6b5fecdd63 151 data.zAxis.scaled = (data.zAxis.raw/16384.0F);
j3 9:ca6b5fecdd63 152 break;
j3 9:ca6b5fecdd63 153
j3 9:ca6b5fecdd63 154 case SENS_4G:
j3 9:ca6b5fecdd63 155 data.xAxis.scaled = (data.xAxis.raw/8192.0F);
j3 9:ca6b5fecdd63 156 data.yAxis.scaled = (data.yAxis.raw/8192.0F);
j3 9:ca6b5fecdd63 157 data.zAxis.scaled = (data.zAxis.raw/8192.0F);
j3 9:ca6b5fecdd63 158 break;
j3 9:ca6b5fecdd63 159
j3 9:ca6b5fecdd63 160 case SENS_8G:
j3 9:ca6b5fecdd63 161 data.xAxis.scaled = (data.xAxis.raw/4096.0F);
j3 9:ca6b5fecdd63 162 data.yAxis.scaled = (data.yAxis.raw/4096.0F);
j3 9:ca6b5fecdd63 163 data.zAxis.scaled = (data.zAxis.raw/4096.0F);
j3 9:ca6b5fecdd63 164 break;
j3 9:ca6b5fecdd63 165
j3 9:ca6b5fecdd63 166 case SENS_16G:
j3 9:ca6b5fecdd63 167 data.xAxis.scaled = (data.xAxis.raw/2048.0F);
j3 9:ca6b5fecdd63 168 data.yAxis.scaled = (data.yAxis.raw/2048.0F);
j3 9:ca6b5fecdd63 169 data.zAxis.scaled = (data.zAxis.raw/2048.0F);
j3 9:ca6b5fecdd63 170 break;
j3 9:ca6b5fecdd63 171 }
j3 8:a89b529b1d96 172 }
j3 8:a89b529b1d96 173
j3 8:a89b529b1d96 174 return rtnVal;
j3 8:a89b529b1d96 175 }
j3 10:9e219f2f1fb3 176
j3 10:9e219f2f1fb3 177
j3 10:9e219f2f1fb3 178 //*****************************************************************************
j3 10:9e219f2f1fb3 179 int32_t BMI160::getSensorTime(float *data)
j3 10:9e219f2f1fb3 180 {
j3 10:9e219f2f1fb3 181 uint8_t localData[3];
j3 10:9e219f2f1fb3 182 int32_t rtnVal = readBlock(SENSORTIME_0, SENSORTIME_2, localData);
j3 10:9e219f2f1fb3 183
j3 10:9e219f2f1fb3 184 if(rtnVal == RTN_NO_ERROR)
j3 10:9e219f2f1fb3 185 {
j3 10:9e219f2f1fb3 186 *data = (((localData[2] << 16) | (localData[1] << 8) | localData[0]) * 39e-6);
j3 10:9e219f2f1fb3 187 }
j3 10:9e219f2f1fb3 188
j3 10:9e219f2f1fb3 189 return rtnVal;
j3 10:9e219f2f1fb3 190 }
j3 10:9e219f2f1fb3 191
j3 12:64931a80340d 192
j3 12:64931a80340d 193 //*****************************************************************************
j3 12:64931a80340d 194 int32_t BMI160::getTemperature(float *temp)
j3 12:64931a80340d 195 {
j3 12:64931a80340d 196 uint8_t data[2];
j3 12:64931a80340d 197 uint16_t rawTemp;
j3 12:64931a80340d 198
j3 12:64931a80340d 199 int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
j3 12:64931a80340d 200 if(rtnVal == RTN_NO_ERROR)
j3 12:64931a80340d 201 {
j3 12:64931a80340d 202 rawTemp = ((data[1] << 8) | data[0]);
j3 12:64931a80340d 203 if(rawTemp & 0x8000)
j3 12:64931a80340d 204 {
j3 12:64931a80340d 205 *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
j3 12:64931a80340d 206 }
j3 12:64931a80340d 207 else
j3 12:64931a80340d 208 {
j3 12:64931a80340d 209 *temp = ((rawTemp/512.0F) + 23.0F);
j3 12:64931a80340d 210 }
j3 12:64931a80340d 211 }
j3 12:64931a80340d 212
j3 12:64931a80340d 213 return rtnVal;
j3 12:64931a80340d 214 }