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 00:10:04 2016 +0000
Revision:
8:a89b529b1d96
Parent:
7:9848196cb65e
Child:
9:ca6b5fecdd63
Added ACC get data fxs

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 3:e1770675eca4 37 //*****************************************************************************
j3 5:35e032c8d8aa 38 int32_t BMI160::setSensorPowerMode(Sensors sensor, PowerModes pwrMode)
j3 3:e1770675eca4 39 {
j3 3:e1770675eca4 40 int32_t rtnVal = -1;
j3 3:e1770675eca4 41
j3 5:35e032c8d8aa 42 switch(sensor)
j3 5:35e032c8d8aa 43 {
j3 5:35e032c8d8aa 44 case MAG:
j3 5:35e032c8d8aa 45 rtnVal = writeRegister(CMD, (MAG_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 46 break;
j3 5:35e032c8d8aa 47
j3 5:35e032c8d8aa 48 case GYRO:
j3 5:35e032c8d8aa 49 rtnVal = writeRegister(CMD, (GYR_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 50 break;
j3 5:35e032c8d8aa 51
j3 5:35e032c8d8aa 52 case ACC:
j3 5:35e032c8d8aa 53 rtnVal = writeRegister(CMD, (ACC_SET_PMU_MODE | pwrMode));
j3 5:35e032c8d8aa 54 break;
j3 5:35e032c8d8aa 55
j3 5:35e032c8d8aa 56 default:
j3 5:35e032c8d8aa 57 rtnVal = -1;
j3 5:35e032c8d8aa 58 break;
j3 5:35e032c8d8aa 59 }
j3 5:35e032c8d8aa 60
j3 3:e1770675eca4 61 return rtnVal;
j3 3:e1770675eca4 62 }
j3 5:35e032c8d8aa 63
j3 5:35e032c8d8aa 64
j3 5:35e032c8d8aa 65 //*****************************************************************************
j3 5:35e032c8d8aa 66 int32_t BMI160::getTemperature(float *temp)
j3 5:35e032c8d8aa 67 {
j3 5:35e032c8d8aa 68 uint8_t data[2];
j3 6:9615aa90087d 69 uint16_t rawTemp;
j3 5:35e032c8d8aa 70
j3 5:35e032c8d8aa 71 int32_t rtnVal = readBlock(TEMPERATURE_0, TEMPERATURE_1, data);
j3 5:35e032c8d8aa 72 if(rtnVal == RTN_NO_ERROR)
j3 5:35e032c8d8aa 73 {
j3 6:9615aa90087d 74 rawTemp = ((data[1] << 8) | data[0]);
j3 6:9615aa90087d 75 if(rawTemp & 0x8000)
j3 6:9615aa90087d 76 {
j3 7:9848196cb65e 77 *temp = (23.0F - ((0x10000 - rawTemp)/512.0F));
j3 6:9615aa90087d 78 }
j3 6:9615aa90087d 79 else
j3 6:9615aa90087d 80 {
j3 6:9615aa90087d 81 *temp = ((rawTemp/512.0F) + 23.0F);
j3 6:9615aa90087d 82 }
j3 5:35e032c8d8aa 83 }
j3 5:35e032c8d8aa 84
j3 5:35e032c8d8aa 85 return rtnVal;
j3 5:35e032c8d8aa 86 }
j3 8:a89b529b1d96 87
j3 8:a89b529b1d96 88
j3 8:a89b529b1d96 89 //*****************************************************************************
j3 8:a89b529b1d96 90 int32_t BMI160::getSensorDataAndTime(uint8_t *data)
j3 8:a89b529b1d96 91 {
j3 8:a89b529b1d96 92 return readBlock(DATA_0, SENSORTIME_2, data);
j3 8:a89b529b1d96 93 }
j3 8:a89b529b1d96 94
j3 8:a89b529b1d96 95
j3 8:a89b529b1d96 96 //*****************************************************************************
j3 8:a89b529b1d96 97 int32_t BMI160::getAccAxis(SensorAxis axis, AxisData &data)
j3 8:a89b529b1d96 98 {
j3 8:a89b529b1d96 99 uint8_t localData[2];
j3 8:a89b529b1d96 100 int32_t rtnVal;
j3 8:a89b529b1d96 101
j3 8:a89b529b1d96 102 switch(axis)
j3 8:a89b529b1d96 103 {
j3 8:a89b529b1d96 104 case X_AXIS:
j3 8:a89b529b1d96 105 rtnVal = readBlock(DATA_14, DATA_15, localData);
j3 8:a89b529b1d96 106 break;
j3 8:a89b529b1d96 107
j3 8:a89b529b1d96 108 case Y_AXIS:
j3 8:a89b529b1d96 109 rtnVal = readBlock(DATA_16, DATA_17, localData);
j3 8:a89b529b1d96 110 break;
j3 8:a89b529b1d96 111
j3 8:a89b529b1d96 112 case Z_AXIS:
j3 8:a89b529b1d96 113 rtnVal = readBlock(DATA_18, DATA_19, localData);
j3 8:a89b529b1d96 114 break;
j3 8:a89b529b1d96 115
j3 8:a89b529b1d96 116 default:
j3 8:a89b529b1d96 117 rtnVal = -1;
j3 8:a89b529b1d96 118 break;
j3 8:a89b529b1d96 119 }
j3 8:a89b529b1d96 120
j3 8:a89b529b1d96 121 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 122 {
j3 8:a89b529b1d96 123 data.raw = ((localData[1] << 8) | localData[0]);
j3 8:a89b529b1d96 124 data.scaled = (data.raw/16384.0F); //only 2G range right now
j3 8:a89b529b1d96 125 }
j3 8:a89b529b1d96 126
j3 8:a89b529b1d96 127 return rtnVal;
j3 8:a89b529b1d96 128 }
j3 8:a89b529b1d96 129
j3 8:a89b529b1d96 130
j3 8:a89b529b1d96 131 //*****************************************************************************
j3 8:a89b529b1d96 132 int32_t BMI160::getAccXYZ(SensorData &data)
j3 8:a89b529b1d96 133 {
j3 8:a89b529b1d96 134 uint8_t localData[6];
j3 8:a89b529b1d96 135 int32_t rtnVal = readBlock(DATA_14, DATA_19, localData);
j3 8:a89b529b1d96 136
j3 8:a89b529b1d96 137 if(rtnVal == RTN_NO_ERROR)
j3 8:a89b529b1d96 138 {
j3 8:a89b529b1d96 139 data.xAxis.raw = ((localData[1] << 8) | localData[0]);
j3 8:a89b529b1d96 140 data.yAxis.raw = ((localData[3] << 8) | localData[2]);
j3 8:a89b529b1d96 141 data.zAxis.raw = ((localData[5] << 8) | localData[4]);
j3 8:a89b529b1d96 142
j3 8:a89b529b1d96 143 //only 2G range right now
j3 8:a89b529b1d96 144 data.xAxis.scaled = (data.xAxis.raw/16384.0F);
j3 8:a89b529b1d96 145 data.yAxis.scaled = (data.yAxis.raw/16384.0F);
j3 8:a89b529b1d96 146 data.zAxis.scaled = (data.zAxis.raw/16384.0F);
j3 8:a89b529b1d96 147 }
j3 8:a89b529b1d96 148
j3 8:a89b529b1d96 149 return rtnVal;
j3 8:a89b529b1d96 150 }