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 #ifndef BMI160_H
gmehmet 0:ddc2fef69ef9 35 #define BMI160_H
gmehmet 0:ddc2fef69ef9 36
gmehmet 0:ddc2fef69ef9 37 #include "mbed.h"
gmehmet 0:ddc2fef69ef9 38
gmehmet 0:ddc2fef69ef9 39 /**
gmehmet 0:ddc2fef69ef9 40 @brief The BMI160 is a small, low power, low noise 16-bit inertial measurement
gmehmet 0:ddc2fef69ef9 41 unit designed for use in mobile applications like augmented reality or indoor
gmehmet 0:ddc2fef69ef9 42 navigation which require highly accurate, real-time sensor data.
gmehmet 0:ddc2fef69ef9 43
gmehmet 0:ddc2fef69ef9 44 In full operation mode, with both the accelerometer and gyroscope enabled, the
gmehmet 0:ddc2fef69ef9 45 current consumption is typically 950 μA, enabling always-on applications in
gmehmet 0:ddc2fef69ef9 46 battery driven devices. It is available in a compact 14-pin 2.5 x 3.0 x 0.8 mm³
gmehmet 0:ddc2fef69ef9 47 LGA package."
gmehmet 0:ddc2fef69ef9 48
gmehmet 0:ddc2fef69ef9 49 This class is an abstract base class and can not be instaniated, use BMI160_I2C
gmehmet 0:ddc2fef69ef9 50 or BMI160_SPI.
gmehmet 0:ddc2fef69ef9 51 */
gmehmet 0:ddc2fef69ef9 52 class BMI160
gmehmet 0:ddc2fef69ef9 53 {
gmehmet 0:ddc2fef69ef9 54 public:
gmehmet 0:ddc2fef69ef9 55
gmehmet 0:ddc2fef69ef9 56 ///Return value on success.
gmehmet 0:ddc2fef69ef9 57 static const uint8_t RTN_NO_ERROR = 0;
gmehmet 0:ddc2fef69ef9 58
gmehmet 0:ddc2fef69ef9 59 ///Sensor types
gmehmet 0:ddc2fef69ef9 60 enum Sensors
gmehmet 0:ddc2fef69ef9 61 {
gmehmet 0:ddc2fef69ef9 62 MAG = 0, ///<Optional external sensor
gmehmet 0:ddc2fef69ef9 63 GYRO, ///<Angular rate sensor
gmehmet 0:ddc2fef69ef9 64 ACC ///<g sensor
gmehmet 0:ddc2fef69ef9 65 };
gmehmet 0:ddc2fef69ef9 66
gmehmet 0:ddc2fef69ef9 67 ///Sensor Axis
gmehmet 0:ddc2fef69ef9 68 enum SensorAxis
gmehmet 0:ddc2fef69ef9 69 {
gmehmet 0:ddc2fef69ef9 70 X_AXIS = 0,
gmehmet 0:ddc2fef69ef9 71 Y_AXIS,
gmehmet 0:ddc2fef69ef9 72 Z_AXIS
gmehmet 0:ddc2fef69ef9 73 };
gmehmet 0:ddc2fef69ef9 74
gmehmet 0:ddc2fef69ef9 75 ///Structure for axis data
gmehmet 0:ddc2fef69ef9 76 struct AxisData
gmehmet 0:ddc2fef69ef9 77 {
gmehmet 0:ddc2fef69ef9 78 int16_t raw; ///<Axis raw data
gmehmet 0:ddc2fef69ef9 79 float scaled; ///<Axis scaled data
gmehmet 0:ddc2fef69ef9 80 };
gmehmet 0:ddc2fef69ef9 81
gmehmet 0:ddc2fef69ef9 82 ///Structure for sensor time data
gmehmet 0:ddc2fef69ef9 83 struct SensorTime
gmehmet 0:ddc2fef69ef9 84 {
gmehmet 0:ddc2fef69ef9 85 uint32_t raw; ///<raw SensorTime
gmehmet 0:ddc2fef69ef9 86 float seconds; ///<SensorTime as seconds
gmehmet 0:ddc2fef69ef9 87 };
gmehmet 0:ddc2fef69ef9 88
gmehmet 0:ddc2fef69ef9 89 ///Period of internal counter
gmehmet 0:ddc2fef69ef9 90 static const float SENSOR_TIME_LSB = 39e-6;
gmehmet 0:ddc2fef69ef9 91
gmehmet 0:ddc2fef69ef9 92 ///Structure for holding sensor data
gmehmet 0:ddc2fef69ef9 93 struct SensorData
gmehmet 0:ddc2fef69ef9 94 {
gmehmet 0:ddc2fef69ef9 95 AxisData xAxis; ///<Sensor X axis data
gmehmet 0:ddc2fef69ef9 96 AxisData yAxis; ///<Sensor Y axis data
gmehmet 0:ddc2fef69ef9 97 AxisData zAxis; ///<Sensor Z axis data
gmehmet 0:ddc2fef69ef9 98 };
gmehmet 0:ddc2fef69ef9 99
gmehmet 0:ddc2fef69ef9 100
gmehmet 0:ddc2fef69ef9 101 ///BMI160 registers
gmehmet 0:ddc2fef69ef9 102 enum Registers
gmehmet 0:ddc2fef69ef9 103 {
gmehmet 0:ddc2fef69ef9 104 CHIP_ID = 0x00, ///<Chip Identification.
gmehmet 0:ddc2fef69ef9 105 ERR_REG = 0x02, ///<Reports sensor error flags. Flags reset when read.
gmehmet 0:ddc2fef69ef9 106 PMU_STATUS, ///<Reports current power mode for sensors.
gmehmet 0:ddc2fef69ef9 107 DATA_0, ///<MAG_X axis bits7:0
gmehmet 0:ddc2fef69ef9 108 DATA_1, ///<MAG_X axis bits15:8
gmehmet 0:ddc2fef69ef9 109 DATA_2, ///<MAG_Y axis bits7:0
gmehmet 0:ddc2fef69ef9 110 DATA_3, ///<MAG_Y axis bits15:8
gmehmet 0:ddc2fef69ef9 111 DATA_4, ///<MAG_Z axis bits7:0
gmehmet 0:ddc2fef69ef9 112 DATA_5, ///<MAG_Z axis bits15:8
gmehmet 0:ddc2fef69ef9 113 DATA_6, ///<RHALL bits7:0
gmehmet 0:ddc2fef69ef9 114 DATA_7, ///<RHALL bits15:8
gmehmet 0:ddc2fef69ef9 115 DATA_8, ///<GYR_X axis bits7:0
gmehmet 0:ddc2fef69ef9 116 DATA_9, ///<GYR_X axis bits15:8
gmehmet 0:ddc2fef69ef9 117 DATA_10, ///<GYR_Y axis bits7:0
gmehmet 0:ddc2fef69ef9 118 DATA_11, ///<GYR_Y axis bits15:8
gmehmet 0:ddc2fef69ef9 119 DATA_12, ///<GYR_Z axis bits7:0
gmehmet 0:ddc2fef69ef9 120 DATA_13, ///<GYR_Z axis bits15:8
gmehmet 0:ddc2fef69ef9 121 DATA_14, ///<ACC_X axis bits7:0
gmehmet 0:ddc2fef69ef9 122 DATA_15, ///<ACC_X axis bits15:8
gmehmet 0:ddc2fef69ef9 123 DATA_16, ///<ACC_Y axis bits7:0
gmehmet 0:ddc2fef69ef9 124 DATA_17, ///<ACC_Y axis bits15:8
gmehmet 0:ddc2fef69ef9 125 DATA_18, ///<ACC_Z axis bits7:0
gmehmet 0:ddc2fef69ef9 126 DATA_19, ///<ACC_Z axis bits15:8
gmehmet 0:ddc2fef69ef9 127 SENSORTIME_0, ///<24bit counter synchronized with data, bits7:0
gmehmet 0:ddc2fef69ef9 128 SENSORTIME_1, ///<24bit counter synchronized with data, bits15:8
gmehmet 0:ddc2fef69ef9 129 SENSORTIME_2, ///<24bit counter synchronized with data, bits23:16
gmehmet 0:ddc2fef69ef9 130 STATUS, ///<Reports sensors status flags
gmehmet 0:ddc2fef69ef9 131 INT_STATUS_0, ///<Contains interrupt status flags
gmehmet 0:ddc2fef69ef9 132 INT_STATUS_1, ///<Contains interrupt status flags
gmehmet 0:ddc2fef69ef9 133 INT_STATUS_2, ///<Contains interrupt status flags
gmehmet 0:ddc2fef69ef9 134 INT_STATUS_3, ///<Contains interrupt status flags
gmehmet 0:ddc2fef69ef9 135 TEMPERATURE_0, ///<Contains temperature of sensor, bits7:0
gmehmet 0:ddc2fef69ef9 136 TEMPERATURE_1, ///<Contains temperature of sensor, bits15:8
gmehmet 0:ddc2fef69ef9 137 FIFO_LENGTH_0, ///<Current fill level of FIFO, bits7:0
gmehmet 0:ddc2fef69ef9 138 FIFO_LENGTH_1, ///<Current fill level of FIFO, bits10:8
gmehmet 0:ddc2fef69ef9 139 FIFO_DATA, ///<FIFO data read out register, burst read
gmehmet 0:ddc2fef69ef9 140 ACC_CONF = 0x40, ///<Set ODR, bandwidth, and read mode of accelerometer
gmehmet 0:ddc2fef69ef9 141 ACC_RANGE, ///<Sets accelerometer g-range
gmehmet 0:ddc2fef69ef9 142 GYR_CONF, ///<Set ODR, bandwidth, and read mode of gyroscope
gmehmet 0:ddc2fef69ef9 143 GYR_RANGE, ///<Sets gyroscope angular rate measurement range
gmehmet 0:ddc2fef69ef9 144 MAG_CONF, ///<Sets ODR of magnetometer interface
gmehmet 0:ddc2fef69ef9 145 FIFO_DOWNS, ///<Sets down sampling ratios of accel and gyro data
gmehmet 0:ddc2fef69ef9 146 ///<for FIFO
gmehmet 0:ddc2fef69ef9 147 FIFO_CONFIG_0, ///<Sets FIFO Watermark
gmehmet 0:ddc2fef69ef9 148 FIFO_CONFIG_1, ///<Sets which sensor data is available in FIFO,
gmehmet 0:ddc2fef69ef9 149 ///<Header/Headerless mode, Ext Int tagging, Sensortime
gmehmet 0:ddc2fef69ef9 150 MAG_IF_0 = 0x4B, ///<Magnetometer 7-bit I2C address, bits7:1
gmehmet 0:ddc2fef69ef9 151 MAG_IF_1, ///<Magnetometer interface configuration
gmehmet 0:ddc2fef69ef9 152 MAG_IF_2, ///<Magnetometer address to read
gmehmet 0:ddc2fef69ef9 153 MAG_IF_3, ///<Magnetometer address to write
gmehmet 0:ddc2fef69ef9 154 MAG_IF_4, ///<Magnetometer data to write
gmehmet 0:ddc2fef69ef9 155 INT_EN_0, ///<Interrupt enable bits
gmehmet 0:ddc2fef69ef9 156 INT_EN_1, ///<Interrupt enable bits
gmehmet 0:ddc2fef69ef9 157 INT_EN_2, ///<Interrupt enable bits
gmehmet 0:ddc2fef69ef9 158 INT_OUT_CTRL, ///<Contains the behavioral configuration of INT pins
gmehmet 0:ddc2fef69ef9 159 INT_LATCH, ///<Contains the interrupt rest bit and the interrupt
gmehmet 0:ddc2fef69ef9 160 ///<mode selection
gmehmet 0:ddc2fef69ef9 161 INT_MAP_0, ///<Controls which interrupt signals are mapped to the
gmehmet 0:ddc2fef69ef9 162 ///<INT1 and INT2 pins
gmehmet 0:ddc2fef69ef9 163 INT_MAP_1, ///<Controls which interrupt signals are mapped to the
gmehmet 0:ddc2fef69ef9 164 ///<INT1 and INT2 pins
gmehmet 0:ddc2fef69ef9 165 INT_MAP_2, ///<Controls which interrupt signals are mapped to the
gmehmet 0:ddc2fef69ef9 166 ///<INT1 and INT2 pins
gmehmet 0:ddc2fef69ef9 167 INT_DATA_0, ///<Contains the data source definition for the two
gmehmet 0:ddc2fef69ef9 168 ///<interrupt groups
gmehmet 0:ddc2fef69ef9 169 INT_DATA_1, ///<Contains the data source definition for the two
gmehmet 0:ddc2fef69ef9 170 ///<interrupt groups
gmehmet 0:ddc2fef69ef9 171 INT_LOWHIGH_0, ///<Contains the configuration for the low g interrupt
gmehmet 0:ddc2fef69ef9 172 INT_LOWHIGH_1, ///<Contains the configuration for the low g interrupt
gmehmet 0:ddc2fef69ef9 173 INT_LOWHIGH_2, ///<Contains the configuration for the low g interrupt
gmehmet 0:ddc2fef69ef9 174 INT_LOWHIGH_3, ///<Contains the configuration for the low g interrupt
gmehmet 0:ddc2fef69ef9 175 INT_LOWHIGH_4, ///<Contains the configuration for the low g interrupt
gmehmet 0:ddc2fef69ef9 176 INT_MOTION_0, ///<Contains the configuration for the any motion and
gmehmet 0:ddc2fef69ef9 177 ///<no motion interrupts
gmehmet 0:ddc2fef69ef9 178 INT_MOTION_1, ///<Contains the configuration for the any motion and
gmehmet 0:ddc2fef69ef9 179 ///<no motion interrupts
gmehmet 0:ddc2fef69ef9 180 INT_MOTION_2, ///<Contains the configuration for the any motion and
gmehmet 0:ddc2fef69ef9 181 ///<no motion interrupts
gmehmet 0:ddc2fef69ef9 182 INT_MOTION_3, ///<Contains the configuration for the any motion and
gmehmet 0:ddc2fef69ef9 183 ///<no motion interrupts
gmehmet 0:ddc2fef69ef9 184 INT_TAP_0, ///<Contains the configuration for the tap interrupts
gmehmet 0:ddc2fef69ef9 185 INT_TAP_1, ///<Contains the configuration for the tap interrupts
gmehmet 0:ddc2fef69ef9 186 INT_ORIENT_0, ///<Contains the configuration for the oeientation
gmehmet 0:ddc2fef69ef9 187 ///<interrupt
gmehmet 0:ddc2fef69ef9 188 INT_ORIENT_1, ///<Contains the configuration for the oeientation
gmehmet 0:ddc2fef69ef9 189 ///<interrupt
gmehmet 0:ddc2fef69ef9 190 INT_FLAT_0, ///<Contains the configuration for the flat interrupt
gmehmet 0:ddc2fef69ef9 191 INT_FLAT_1, ///<Contains the configuration for the flat interrupt
gmehmet 0:ddc2fef69ef9 192 FOC_CONF, ///<Contains configuration for the fast offset
gmehmet 0:ddc2fef69ef9 193 ///<compensation for the accelerometer and gyroscope
gmehmet 0:ddc2fef69ef9 194 CONF, ///<Configuration of sensor, nvm_prog_en bit
gmehmet 0:ddc2fef69ef9 195 IF_CONF, ///<Contains settings for the digital interface
gmehmet 0:ddc2fef69ef9 196 PMU_TRIGGER, ///<Sets trigger conditions to change gyro power modes
gmehmet 0:ddc2fef69ef9 197 SELF_TEST, ///<Self test configuration
gmehmet 0:ddc2fef69ef9 198 NV_CONF = 0x70, ///<Contains settings for the digital interface
gmehmet 0:ddc2fef69ef9 199 OFFSET_0, ///<Contains offset comp values for acc_off_x7:0
gmehmet 0:ddc2fef69ef9 200 OFFSET_1, ///<Contains offset comp values for acc_off_y7:0
gmehmet 0:ddc2fef69ef9 201 OFFSET_2, ///<Contains offset comp values for acc_off_z7:0
gmehmet 0:ddc2fef69ef9 202 OFFSET_3, ///<Contains offset comp values for gyr_off_x7:0
gmehmet 0:ddc2fef69ef9 203 OFFSET_4, ///<Contains offset comp values for gyr_off_y7:0
gmehmet 0:ddc2fef69ef9 204 OFFSET_5, ///<Contains offset comp values for gyr_off_z7:0
gmehmet 0:ddc2fef69ef9 205 OFFSET_6, ///<gyr/acc offset enable bit and gyr_off_(zyx) bits9:8
gmehmet 0:ddc2fef69ef9 206 STEP_CNT_0, ///<Step counter bits 15:8
gmehmet 0:ddc2fef69ef9 207 STEP_CNT_1, ///<Step counter bits 7:0
gmehmet 0:ddc2fef69ef9 208 STEP_CONF_0, ///<Contains configuration of the step detector
gmehmet 0:ddc2fef69ef9 209 STEP_CONF_1, ///<Contains configuration of the step detector
gmehmet 0:ddc2fef69ef9 210 CMD = 0x7E ///<Command register triggers operations like
gmehmet 0:ddc2fef69ef9 211 ///<softreset, NVM programming, etc.
gmehmet 0:ddc2fef69ef9 212 };
gmehmet 0:ddc2fef69ef9 213
gmehmet 0:ddc2fef69ef9 214
gmehmet 0:ddc2fef69ef9 215 ///@name ERR_REG(0x02)
gmehmet 0:ddc2fef69ef9 216 ///Error register data
gmehmet 0:ddc2fef69ef9 217 ///@{
gmehmet 0:ddc2fef69ef9 218
gmehmet 0:ddc2fef69ef9 219 static const uint8_t FATAL_ERR_MASK = 0x01;
gmehmet 0:ddc2fef69ef9 220 static const uint8_t FATAL_ERR_POS = 0x00;
gmehmet 0:ddc2fef69ef9 221 static const uint8_t ERR_CODE_MASK = 0x1E;
gmehmet 0:ddc2fef69ef9 222 static const uint8_t ERR_CODE_POS = 0x01;
gmehmet 0:ddc2fef69ef9 223 static const uint8_t I2C_FAIL_ERR_MASK = 0x20;
gmehmet 0:ddc2fef69ef9 224 static const uint8_t I2C_FAIL_ERR_POS = 0x05;
gmehmet 0:ddc2fef69ef9 225 static const uint8_t DROP_CMD_ERR_MASK = 0x40;
gmehmet 0:ddc2fef69ef9 226 static const uint8_t DROP_CMD_ERR_POS = 0x06;
gmehmet 0:ddc2fef69ef9 227 static const uint8_t MAG_DRDY_ERR_MASK = 0x80;
gmehmet 0:ddc2fef69ef9 228 static const uint8_t MAG_DRDY_ERR_POS = 0x08;
gmehmet 0:ddc2fef69ef9 229
gmehmet 0:ddc2fef69ef9 230 ///Enumerated error codes
gmehmet 0:ddc2fef69ef9 231 enum ErrorCodes
gmehmet 0:ddc2fef69ef9 232 {
gmehmet 0:ddc2fef69ef9 233 NO_ERROR = 0, ///<No Error
gmehmet 0:ddc2fef69ef9 234 ERROR_1, ///<Listed as error
gmehmet 0:ddc2fef69ef9 235 ERROR_2, ///<Listed as error
gmehmet 0:ddc2fef69ef9 236 LPM_INT_PFD, ///<Low-power mode and interrupt uses pre-filtered
gmehmet 0:ddc2fef69ef9 237 ///<data
gmehmet 0:ddc2fef69ef9 238 ODR_MISMATCH = 0x06, ///<ODRs of enabled sensors in headerless mode do
gmehmet 0:ddc2fef69ef9 239 ///<not match
gmehmet 0:ddc2fef69ef9 240 PFD_USED_LPM ///<Pre-filtered data are used in low power mode
gmehmet 0:ddc2fef69ef9 241 };
gmehmet 0:ddc2fef69ef9 242 ///@}
gmehmet 0:ddc2fef69ef9 243
gmehmet 0:ddc2fef69ef9 244
gmehmet 0:ddc2fef69ef9 245 ///@name ACC_CONF(0x40) and ACC_RANGE(0x41)
gmehmet 0:ddc2fef69ef9 246 ///Data for configuring accelerometer
gmehmet 0:ddc2fef69ef9 247 ///@{
gmehmet 0:ddc2fef69ef9 248
gmehmet 0:ddc2fef69ef9 249 static const uint8_t ACC_ODR_MASK = 0x0F;
gmehmet 0:ddc2fef69ef9 250 static const uint8_t ACC_ODR_POS = 0x00;
gmehmet 0:ddc2fef69ef9 251 static const uint8_t ACC_BWP_MASK = 0x70;
gmehmet 0:ddc2fef69ef9 252 static const uint8_t ACC_BWP_POS = 0x04;
gmehmet 0:ddc2fef69ef9 253 static const uint8_t ACC_US_MASK = 0x80;
gmehmet 0:ddc2fef69ef9 254 static const uint8_t ACC_US_POS = 0x07;
gmehmet 0:ddc2fef69ef9 255 static const uint8_t ACC_RANGE_MASK = 0x0F;
gmehmet 0:ddc2fef69ef9 256 static const uint8_t ACC_RANGE_POS = 0x00;
gmehmet 0:ddc2fef69ef9 257
gmehmet 0:ddc2fef69ef9 258 ///Accelerometer output data rates
gmehmet 0:ddc2fef69ef9 259 enum AccOutputDataRate
gmehmet 0:ddc2fef69ef9 260 {
gmehmet 0:ddc2fef69ef9 261 ACC_ODR_1 = 1, ///< 25/32Hz
gmehmet 0:ddc2fef69ef9 262 ACC_ODR_2, ///< 25/16Hz
gmehmet 0:ddc2fef69ef9 263 ACC_ODR_3, ///< 25/8Hz
gmehmet 0:ddc2fef69ef9 264 ACC_ODR_4, ///< 25/4Hz
gmehmet 0:ddc2fef69ef9 265 ACC_ODR_5, ///< 25/2Hz
gmehmet 0:ddc2fef69ef9 266 ACC_ODR_6, ///< 25Hz
gmehmet 0:ddc2fef69ef9 267 ACC_ODR_7, ///< 50Hz
gmehmet 0:ddc2fef69ef9 268 ACC_ODR_8, ///< 100Hz
gmehmet 0:ddc2fef69ef9 269 ACC_ODR_9, ///< 200Hz
gmehmet 0:ddc2fef69ef9 270 ACC_ODR_10, ///< 400Hz
gmehmet 0:ddc2fef69ef9 271 ACC_ODR_11, ///< 800Hz
gmehmet 0:ddc2fef69ef9 272 ACC_ODR_12 ///< 1600Hz
gmehmet 0:ddc2fef69ef9 273 };
gmehmet 0:ddc2fef69ef9 274
gmehmet 0:ddc2fef69ef9 275 ///Accelerometer bandwidth parameters
gmehmet 0:ddc2fef69ef9 276 enum AccBandWidthParam
gmehmet 0:ddc2fef69ef9 277 {
gmehmet 0:ddc2fef69ef9 278 ACC_BWP_0 = 0, ///< Average 1 cycle; when acc_us = 0 OSR4
gmehmet 0:ddc2fef69ef9 279 ACC_BWP_1, ///< Average 2 cycles; when acc_us = 0 OSR2
gmehmet 0:ddc2fef69ef9 280 ACC_BWP_2, ///< Average 4 cycles; when acc_us = 0 normal mode
gmehmet 0:ddc2fef69ef9 281 ACC_BWP_3, ///< Average 8 cycles
gmehmet 0:ddc2fef69ef9 282 ACC_BWP_4, ///< Average 16 cycles
gmehmet 0:ddc2fef69ef9 283 ACC_BWP_5, ///< Average 32 cycles
gmehmet 0:ddc2fef69ef9 284 ACC_BWP_6, ///< Average 64 cycles
gmehmet 0:ddc2fef69ef9 285 ACC_BWP_7 ///< Average 128 cycles
gmehmet 0:ddc2fef69ef9 286 };
gmehmet 0:ddc2fef69ef9 287
gmehmet 0:ddc2fef69ef9 288 ///Accelerometer undersampling
gmehmet 0:ddc2fef69ef9 289 enum AccUnderSampling
gmehmet 0:ddc2fef69ef9 290 {
gmehmet 0:ddc2fef69ef9 291 ACC_US_OFF = 0,
gmehmet 0:ddc2fef69ef9 292 ACC_US_ON
gmehmet 0:ddc2fef69ef9 293 };
gmehmet 0:ddc2fef69ef9 294
gmehmet 0:ddc2fef69ef9 295 ///Accelerometer ranges
gmehmet 0:ddc2fef69ef9 296 enum AccRange
gmehmet 0:ddc2fef69ef9 297 {
gmehmet 0:ddc2fef69ef9 298 SENS_2G = 0x03, ///<Accelerometer range +-2G
gmehmet 0:ddc2fef69ef9 299 SENS_4G = 0x05, ///<Accelerometer range +-4G
gmehmet 0:ddc2fef69ef9 300 SENS_8G = 0x08, ///<Accelerometer range +-8G
gmehmet 0:ddc2fef69ef9 301 SENS_16G = 0x0C ///<Accelerometer range +-16G
gmehmet 0:ddc2fef69ef9 302 };
gmehmet 0:ddc2fef69ef9 303
gmehmet 0:ddc2fef69ef9 304 static const float SENS_2G_LSB_PER_G = 16384.0F;
gmehmet 0:ddc2fef69ef9 305 static const float SENS_4G_LSB_PER_G = 8192.0F;
gmehmet 0:ddc2fef69ef9 306 static const float SENS_8G_LSB_PER_G = 4096.0F;
gmehmet 0:ddc2fef69ef9 307 static const float SENS_16G_LSB_PER_G = 2048.0F;
gmehmet 0:ddc2fef69ef9 308
gmehmet 0:ddc2fef69ef9 309 ///Accelerometer configuration data structure
gmehmet 0:ddc2fef69ef9 310 struct AccConfig
gmehmet 0:ddc2fef69ef9 311 {
gmehmet 0:ddc2fef69ef9 312 AccRange range; ///<Accelerometer range
gmehmet 0:ddc2fef69ef9 313 AccUnderSampling us; ///<Accelerometr undersampling mode
gmehmet 0:ddc2fef69ef9 314 AccBandWidthParam bwp; ///<Accelerometer bandwidth param
gmehmet 0:ddc2fef69ef9 315 AccOutputDataRate odr; ///<Accelerometr output data rate
gmehmet 0:ddc2fef69ef9 316 };
gmehmet 0:ddc2fef69ef9 317
gmehmet 0:ddc2fef69ef9 318 ///Accelerometer default configuration
gmehmet 0:ddc2fef69ef9 319 static const AccConfig DEFAULT_ACC_CONFIG;
gmehmet 0:ddc2fef69ef9 320 ///@}
gmehmet 0:ddc2fef69ef9 321
gmehmet 0:ddc2fef69ef9 322
gmehmet 0:ddc2fef69ef9 323 ///@name GYR_CONF(0x42) and GYR_RANGE(0x43)
gmehmet 0:ddc2fef69ef9 324 ///Data for configuring gyroscope
gmehmet 0:ddc2fef69ef9 325 ///@{
gmehmet 0:ddc2fef69ef9 326
gmehmet 0:ddc2fef69ef9 327 static const uint8_t GYRO_ODR_MASK = 0x0F;
gmehmet 0:ddc2fef69ef9 328 static const uint8_t GYRO_ODR_POS = 0x00;
gmehmet 0:ddc2fef69ef9 329 static const uint8_t GYRO_BWP_MASK = 0x30;
gmehmet 0:ddc2fef69ef9 330 static const uint8_t GYRO_BWP_POS = 0x04;
gmehmet 0:ddc2fef69ef9 331 static const uint8_t GYRO_RANGE_MASK = 0x07;
gmehmet 0:ddc2fef69ef9 332 static const uint8_t GYRO_RANGE_POS = 0x00;
gmehmet 0:ddc2fef69ef9 333
gmehmet 0:ddc2fef69ef9 334 ///Gyroscope output data rates
gmehmet 0:ddc2fef69ef9 335 enum GyroOutputDataRate
gmehmet 0:ddc2fef69ef9 336 {
gmehmet 0:ddc2fef69ef9 337 GYRO_ODR_6 = 0x06, ///<25Hz
gmehmet 0:ddc2fef69ef9 338 GYRO_ODR_7 = 0x07, ///<50Hz
gmehmet 0:ddc2fef69ef9 339 GYRO_ODR_8 = 0x08, ///<100Hz
gmehmet 0:ddc2fef69ef9 340 GYRO_ODR_9 = 0x09, ///<200Hz
gmehmet 0:ddc2fef69ef9 341 GYRO_ODR_10 = 0x0A, ///<400Hz
gmehmet 0:ddc2fef69ef9 342 GYRO_ODR_11 = 0x0B, ///<800Hz
gmehmet 0:ddc2fef69ef9 343 GYRO_ODR_12 = 0x0C, ///<1600Hz
gmehmet 0:ddc2fef69ef9 344 GYRO_ODR_13 = 0x0D ///<3200Hz
gmehmet 0:ddc2fef69ef9 345 };
gmehmet 0:ddc2fef69ef9 346
gmehmet 0:ddc2fef69ef9 347 ///Gyroscope bandwidth paramaters
gmehmet 0:ddc2fef69ef9 348 enum GyroBandWidthParam
gmehmet 0:ddc2fef69ef9 349 {
gmehmet 0:ddc2fef69ef9 350 GYRO_BWP_0 = 0, ///<OSR4 Over Sampling Rate of 4
gmehmet 0:ddc2fef69ef9 351 GYRO_BWP_1, ///<OSR2 Over Sampling Rate of 2
gmehmet 0:ddc2fef69ef9 352 GYRO_BWP_2 ///<Normal Mode, Equidistant Sampling
gmehmet 0:ddc2fef69ef9 353 };
gmehmet 0:ddc2fef69ef9 354
gmehmet 0:ddc2fef69ef9 355 ///Gyroscope ranges
gmehmet 0:ddc2fef69ef9 356 enum GyroRange
gmehmet 0:ddc2fef69ef9 357 {
gmehmet 0:ddc2fef69ef9 358 DPS_2000 = 0, ///<+-2000dps, 16.4LSB/dps
gmehmet 0:ddc2fef69ef9 359 DPS_1000, ///<+-1000dps, 32.8LSB/dps
gmehmet 0:ddc2fef69ef9 360 DPS_500, ///<+-500dps, 65.6LSB/dps
gmehmet 0:ddc2fef69ef9 361 DPS_250, ///<+-250dps, 131.2LSB/dps
gmehmet 0:ddc2fef69ef9 362 DPS_125 ///<+-125dps, 262.4LSB/dps,
gmehmet 0:ddc2fef69ef9 363 };
gmehmet 0:ddc2fef69ef9 364
gmehmet 0:ddc2fef69ef9 365 static const float SENS_2000_DPS_LSB_PER_DPS = 16.4F;
gmehmet 0:ddc2fef69ef9 366 static const float SENS_1000_DPS_LSB_PER_DPS = 32.8F;
gmehmet 0:ddc2fef69ef9 367 static const float SENS_500_DPS_LSB_PER_DPS = 65.6F;
gmehmet 0:ddc2fef69ef9 368 static const float SENS_250_DPS_LSB_PER_DPS = 131.2F;
gmehmet 0:ddc2fef69ef9 369 static const float SENS_125_DPS_LSB_PER_DPS = 262.4F;
gmehmet 0:ddc2fef69ef9 370
gmehmet 0:ddc2fef69ef9 371 ///Gyroscope configuration data structure
gmehmet 0:ddc2fef69ef9 372 struct GyroConfig
gmehmet 0:ddc2fef69ef9 373 {
gmehmet 0:ddc2fef69ef9 374 GyroRange range; ///<Gyroscope range
gmehmet 0:ddc2fef69ef9 375 GyroBandWidthParam bwp; ///<Gyroscope bandwidth param
gmehmet 0:ddc2fef69ef9 376 GyroOutputDataRate odr; ///<Gyroscope output data rate
gmehmet 0:ddc2fef69ef9 377 };
gmehmet 0:ddc2fef69ef9 378
gmehmet 0:ddc2fef69ef9 379 ///Gyroscope default configuration
gmehmet 0:ddc2fef69ef9 380 static const GyroConfig DEFAULT_GYRO_CONFIG;
gmehmet 0:ddc2fef69ef9 381 ///@}
gmehmet 0:ddc2fef69ef9 382
gmehmet 0:ddc2fef69ef9 383
gmehmet 0:ddc2fef69ef9 384 ///Enumerated power modes
gmehmet 0:ddc2fef69ef9 385 enum PowerModes
gmehmet 0:ddc2fef69ef9 386 {
gmehmet 0:ddc2fef69ef9 387 SUSPEND = 0, ///<Acc and Gyro, No sampling, No FIFO data readout
gmehmet 0:ddc2fef69ef9 388 NORMAL, ///<Acc and Gyro, Full chip operation
gmehmet 0:ddc2fef69ef9 389 LOW_POWER, ///<Acc duty-cycling between suspend and normal
gmehmet 0:ddc2fef69ef9 390 FAST_START_UP ///<Gyro start up delay time to normal mode <= 10 ms
gmehmet 0:ddc2fef69ef9 391 };
gmehmet 0:ddc2fef69ef9 392
gmehmet 0:ddc2fef69ef9 393
gmehmet 0:ddc2fef69ef9 394 ///Enumerated commands used with CMD register
gmehmet 0:ddc2fef69ef9 395 enum Commands
gmehmet 0:ddc2fef69ef9 396 {
gmehmet 0:ddc2fef69ef9 397 START_FOC = 0x03, ///<Starts Fast Offset Calibrartion
gmehmet 0:ddc2fef69ef9 398 ACC_SET_PMU_MODE = 0x10, ///<Sets acc power mode
gmehmet 0:ddc2fef69ef9 399 GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
gmehmet 0:ddc2fef69ef9 400 MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
gmehmet 0:ddc2fef69ef9 401 PROG_NVM = 0xA0, ///<Writes NVM backed registers into NVM
gmehmet 0:ddc2fef69ef9 402 FIFO_FLUSH = 0xB0, ///<Clears FIFO
gmehmet 0:ddc2fef69ef9 403 INT_RESET, ///<Clears interrupt engine, INT_STATUS, and
gmehmet 0:ddc2fef69ef9 404 ///<the interrupt pin
gmehmet 0:ddc2fef69ef9 405 STEP_CNT_CLR, ///<Triggers reset of the step counter
gmehmet 0:ddc2fef69ef9 406 SOFT_RESET = 0xB6 ///<Triggers a reset including a reboot.
gmehmet 0:ddc2fef69ef9 407 };
gmehmet 0:ddc2fef69ef9 408
gmehmet 0:ddc2fef69ef9 409
gmehmet 0:ddc2fef69ef9 410 ///@brief BMI160 Destructor.\n
gmehmet 0:ddc2fef69ef9 411 ///
gmehmet 0:ddc2fef69ef9 412 ///On Entry:
gmehmet 0:ddc2fef69ef9 413 ///@param[in] none
gmehmet 0:ddc2fef69ef9 414 ///
gmehmet 0:ddc2fef69ef9 415 ///On Exit:
gmehmet 0:ddc2fef69ef9 416 ///@param[out] none
gmehmet 0:ddc2fef69ef9 417 ///
gmehmet 0:ddc2fef69ef9 418 ///@returns none
gmehmet 0:ddc2fef69ef9 419 virtual ~BMI160(){ }
gmehmet 0:ddc2fef69ef9 420
gmehmet 0:ddc2fef69ef9 421
gmehmet 0:ddc2fef69ef9 422 ///@brief Reads a single register.\n
gmehmet 0:ddc2fef69ef9 423 ///
gmehmet 0:ddc2fef69ef9 424 ///On Entry:
gmehmet 0:ddc2fef69ef9 425 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 426 ///
gmehmet 0:ddc2fef69ef9 427 ///On Exit:
gmehmet 0:ddc2fef69ef9 428 ///@param[out] data - holds contents of read register on success
gmehmet 0:ddc2fef69ef9 429 ///
gmehmet 0:ddc2fef69ef9 430 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 431 virtual int32_t readRegister(Registers reg, uint8_t *data) = 0;
gmehmet 0:ddc2fef69ef9 432
gmehmet 0:ddc2fef69ef9 433
gmehmet 0:ddc2fef69ef9 434 ///@brief Writes a single register.\n
gmehmet 0:ddc2fef69ef9 435 ///
gmehmet 0:ddc2fef69ef9 436 ///On Entry:
gmehmet 0:ddc2fef69ef9 437 ///@param[in] data - data to write to register
gmehmet 0:ddc2fef69ef9 438 ///
gmehmet 0:ddc2fef69ef9 439 ///On Exit:
gmehmet 0:ddc2fef69ef9 440 ///@param[out] none
gmehmet 0:ddc2fef69ef9 441 ///
gmehmet 0:ddc2fef69ef9 442 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 443 virtual int32_t writeRegister(Registers reg, const uint8_t data) = 0;
gmehmet 0:ddc2fef69ef9 444
gmehmet 0:ddc2fef69ef9 445
gmehmet 0:ddc2fef69ef9 446 ///@brief Reads a block of registers.\n
gmehmet 0:ddc2fef69ef9 447 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 448 ///'stopReg' exist and are readable. Function reads up to, including,
gmehmet 0:ddc2fef69ef9 449 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 450 ///
gmehmet 0:ddc2fef69ef9 451 ///On Entry:
gmehmet 0:ddc2fef69ef9 452 ///@param[in] startReg - register to start reading from
gmehmet 0:ddc2fef69ef9 453 ///@param[in] stopReg - register to stop reading from
gmehmet 0:ddc2fef69ef9 454 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 455 ///
gmehmet 0:ddc2fef69ef9 456 ///On Exit:
gmehmet 0:ddc2fef69ef9 457 ///@param[out] data - holds contents of read registers on success
gmehmet 0:ddc2fef69ef9 458 ///
gmehmet 0:ddc2fef69ef9 459 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 460 virtual int32_t readBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 461 uint8_t *data) = 0;
gmehmet 0:ddc2fef69ef9 462
gmehmet 0:ddc2fef69ef9 463
gmehmet 0:ddc2fef69ef9 464 ///@brief Writes a block of registers.\n
gmehmet 0:ddc2fef69ef9 465 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 466 ///'stopReg' exist and are writeable. Function writes up to, including,
gmehmet 0:ddc2fef69ef9 467 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 468 ///
gmehmet 0:ddc2fef69ef9 469 ///On Entry:
gmehmet 0:ddc2fef69ef9 470 ///@param[in] startReg - register to start writing at
gmehmet 0:ddc2fef69ef9 471 ///@param[in] stopReg - register to stop writing at
gmehmet 0:ddc2fef69ef9 472 ///@param[in] data - pointer to data to write to registers
gmehmet 0:ddc2fef69ef9 473 ///
gmehmet 0:ddc2fef69ef9 474 ///On Exit:
gmehmet 0:ddc2fef69ef9 475 ///@param[out] none
gmehmet 0:ddc2fef69ef9 476 ///
gmehmet 0:ddc2fef69ef9 477 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 478 virtual int32_t writeBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 479 const uint8_t *data) = 0;
gmehmet 0:ddc2fef69ef9 480
gmehmet 0:ddc2fef69ef9 481
gmehmet 0:ddc2fef69ef9 482 ///@brief Sets sensors power mode through CMD register.\n
gmehmet 0:ddc2fef69ef9 483 ///@details Observe command execution times given in datasheet.\n
gmehmet 0:ddc2fef69ef9 484 ///
gmehmet 0:ddc2fef69ef9 485 ///On Entry:
gmehmet 0:ddc2fef69ef9 486 ///@param[in] sensor - Sensor which power mode we are setting
gmehmet 0:ddc2fef69ef9 487 ///@param[in] pwrMode - Desired powermode of the sensor
gmehmet 0:ddc2fef69ef9 488 ///
gmehmet 0:ddc2fef69ef9 489 ///On Exit:
gmehmet 0:ddc2fef69ef9 490 ///@param[out]
gmehmet 0:ddc2fef69ef9 491 ///
gmehmet 0:ddc2fef69ef9 492 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 493 int32_t setSensorPowerMode(Sensors sensor, PowerModes pwrMode);
gmehmet 0:ddc2fef69ef9 494
gmehmet 0:ddc2fef69ef9 495
gmehmet 0:ddc2fef69ef9 496 ///@brief Configure sensor.\n
gmehmet 0:ddc2fef69ef9 497 ///
gmehmet 0:ddc2fef69ef9 498 ///On Entry:
gmehmet 0:ddc2fef69ef9 499 ///@param[in] config - sSensor configuration data structure
gmehmet 0:ddc2fef69ef9 500 ///
gmehmet 0:ddc2fef69ef9 501 ///On Exit:
gmehmet 0:ddc2fef69ef9 502 ///@param[out] none
gmehmet 0:ddc2fef69ef9 503 ///
gmehmet 0:ddc2fef69ef9 504 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 505 int32_t setSensorConfig(const AccConfig &config);
gmehmet 0:ddc2fef69ef9 506 int32_t setSensorConfig(const GyroConfig &config);
gmehmet 0:ddc2fef69ef9 507
gmehmet 0:ddc2fef69ef9 508
gmehmet 0:ddc2fef69ef9 509 ///@brief Get sensor configuration.\n
gmehmet 0:ddc2fef69ef9 510 ///
gmehmet 0:ddc2fef69ef9 511 ///On Entry:
gmehmet 0:ddc2fef69ef9 512 ///@param[in] config - Sensor configuration data structure
gmehmet 0:ddc2fef69ef9 513 ///
gmehmet 0:ddc2fef69ef9 514 ///On Exit:
gmehmet 0:ddc2fef69ef9 515 ///@param[out] config - on success, holds sensor's current
gmehmet 0:ddc2fef69ef9 516 ///configuration
gmehmet 0:ddc2fef69ef9 517 ///
gmehmet 0:ddc2fef69ef9 518 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 519 int32_t getSensorConfig(AccConfig &config);
gmehmet 0:ddc2fef69ef9 520 int32_t getSensorConfig(GyroConfig &config);
gmehmet 0:ddc2fef69ef9 521
gmehmet 0:ddc2fef69ef9 522
gmehmet 0:ddc2fef69ef9 523 ///@brief Get sensor axis.\n
gmehmet 0:ddc2fef69ef9 524 ///
gmehmet 0:ddc2fef69ef9 525 ///On Entry:
gmehmet 0:ddc2fef69ef9 526 ///@param[in] axis - Sensor axis
gmehmet 0:ddc2fef69ef9 527 ///@param[in] data - AxisData structure
gmehmet 0:ddc2fef69ef9 528 ///@param[in] range - Sensor range
gmehmet 0:ddc2fef69ef9 529 ///
gmehmet 0:ddc2fef69ef9 530 ///On Exit:
gmehmet 0:ddc2fef69ef9 531 ///@param[out] data - Structure holds raw and scaled axis data
gmehmet 0:ddc2fef69ef9 532 ///
gmehmet 0:ddc2fef69ef9 533 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 534 int32_t getSensorAxis(SensorAxis axis, AxisData &data, AccRange range);
gmehmet 0:ddc2fef69ef9 535 int32_t getSensorAxis(SensorAxis axis, AxisData &data, GyroRange range);
gmehmet 0:ddc2fef69ef9 536
gmehmet 0:ddc2fef69ef9 537
gmehmet 0:ddc2fef69ef9 538 ///@brief Get sensor xyz axis.\n
gmehmet 0:ddc2fef69ef9 539 ///
gmehmet 0:ddc2fef69ef9 540 ///On Entry:
gmehmet 0:ddc2fef69ef9 541 ///@param[in] data - SensorData structure
gmehmet 0:ddc2fef69ef9 542 ///@param[in] range - Sensor range
gmehmet 0:ddc2fef69ef9 543 ///
gmehmet 0:ddc2fef69ef9 544 ///On Exit:
gmehmet 0:ddc2fef69ef9 545 ///@param[out] data - Structure holds raw and scaled data for all three axis
gmehmet 0:ddc2fef69ef9 546 ///
gmehmet 0:ddc2fef69ef9 547 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 548 int32_t getSensorXYZ(SensorData &data, AccRange range);
gmehmet 0:ddc2fef69ef9 549 int32_t getSensorXYZ(SensorData &data, GyroRange range);
gmehmet 0:ddc2fef69ef9 550
gmehmet 0:ddc2fef69ef9 551
gmehmet 0:ddc2fef69ef9 552 ///@brief Get sensor xyz axis and sensor time.\n
gmehmet 0:ddc2fef69ef9 553 ///
gmehmet 0:ddc2fef69ef9 554 ///On Entry:
gmehmet 0:ddc2fef69ef9 555 ///@param[in] data - SensorData structure
gmehmet 0:ddc2fef69ef9 556 ///@param[in] sensorTime - SensorTime structure for data
gmehmet 0:ddc2fef69ef9 557 ///@param[in] range - Sensor range
gmehmet 0:ddc2fef69ef9 558 ///
gmehmet 0:ddc2fef69ef9 559 ///On Exit:
gmehmet 0:ddc2fef69ef9 560 ///@param[out] data - Structure holds raw and scaled data for all three axis
gmehmet 0:ddc2fef69ef9 561 ///@param[out] sensorTime - Holds sensor time on success
gmehmet 0:ddc2fef69ef9 562 ///
gmehmet 0:ddc2fef69ef9 563 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 564 int32_t getSensorXYZandSensorTime(SensorData &data, SensorTime &sensorTime,
gmehmet 0:ddc2fef69ef9 565 AccRange range);
gmehmet 0:ddc2fef69ef9 566 int32_t getSensorXYZandSensorTime(SensorData &data, SensorTime &sensorTime,
gmehmet 0:ddc2fef69ef9 567 GyroRange range);
gmehmet 0:ddc2fef69ef9 568
gmehmet 0:ddc2fef69ef9 569
gmehmet 0:ddc2fef69ef9 570 ///@brief Get Gyroscope/Accelerometer data and sensor time.\n
gmehmet 0:ddc2fef69ef9 571 ///
gmehmet 0:ddc2fef69ef9 572 ///On Entry:
gmehmet 0:ddc2fef69ef9 573 ///@param[in] accData - Sensor data structure for accelerometer
gmehmet 0:ddc2fef69ef9 574 ///@param[in] gyroData - Sensor data structure for gyroscope
gmehmet 0:ddc2fef69ef9 575 ///@param[in] sensorTime - SensorTime data structure
gmehmet 0:ddc2fef69ef9 576 ///@param[in] accRange - Accelerometer range
gmehmet 0:ddc2fef69ef9 577 ///@param[in] gyroRange - Gyroscope range
gmehmet 0:ddc2fef69ef9 578 ///
gmehmet 0:ddc2fef69ef9 579 ///On Exit:
gmehmet 0:ddc2fef69ef9 580 ///@param[out] accData - Synchronized accelerometer data
gmehmet 0:ddc2fef69ef9 581 ///@param[out] gyroData - Synchronized gyroscope data
gmehmet 0:ddc2fef69ef9 582 ///@param[out] sensorTime - Synchronized sensor time
gmehmet 0:ddc2fef69ef9 583 ///
gmehmet 0:ddc2fef69ef9 584 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 585 int32_t getGyroAccXYZandSensorTime(SensorData &accData,
gmehmet 0:ddc2fef69ef9 586 SensorData &gyroData,
gmehmet 0:ddc2fef69ef9 587 SensorTime &sensorTime,
gmehmet 0:ddc2fef69ef9 588 AccRange accRange, GyroRange gyroRange);
gmehmet 0:ddc2fef69ef9 589
gmehmet 0:ddc2fef69ef9 590
gmehmet 0:ddc2fef69ef9 591 ///@brief Get sensor time.\n
gmehmet 0:ddc2fef69ef9 592 ///
gmehmet 0:ddc2fef69ef9 593 ///On Entry:
gmehmet 0:ddc2fef69ef9 594 ///@param[in] sensorTime - SensorTime structure for data
gmehmet 0:ddc2fef69ef9 595 ///
gmehmet 0:ddc2fef69ef9 596 ///On Exit:
gmehmet 0:ddc2fef69ef9 597 ///@param[out] sensorTime - Holds sensor time on success
gmehmet 0:ddc2fef69ef9 598 ///
gmehmet 0:ddc2fef69ef9 599 ///@returns returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 600 int32_t getSensorTime(SensorTime &sensorTime);
gmehmet 0:ddc2fef69ef9 601
gmehmet 0:ddc2fef69ef9 602
gmehmet 0:ddc2fef69ef9 603 ///@brief Get die temperature.\n
gmehmet 0:ddc2fef69ef9 604 ///
gmehmet 0:ddc2fef69ef9 605 ///On Entry:
gmehmet 0:ddc2fef69ef9 606 ///@param[in] temp - pointer to float for temperature
gmehmet 0:ddc2fef69ef9 607 ///
gmehmet 0:ddc2fef69ef9 608 ///On Exit:
gmehmet 0:ddc2fef69ef9 609 ///@param[out] temp - on success, holds the die temperature
gmehmet 0:ddc2fef69ef9 610 ///
gmehmet 0:ddc2fef69ef9 611 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 612 int32_t getTemperature(float *temp);
gmehmet 0:ddc2fef69ef9 613
gmehmet 0:ddc2fef69ef9 614 // Initialize BMI160 with default parameters:
gmehmet 0:ddc2fef69ef9 615 // set GYRO: Suspended, Acc Normal Mode, ODR:25 Hz
gmehmet 0:ddc2fef69ef9 616 int32_t BMI160_DefaultInitalize();
gmehmet 0:ddc2fef69ef9 617
gmehmet 0:ddc2fef69ef9 618 //
gmehmet 0:ddc2fef69ef9 619 //
gmehmet 0:ddc2fef69ef9 620 int32_t enable_data_ready_interrupt();
gmehmet 0:ddc2fef69ef9 621
gmehmet 0:ddc2fef69ef9 622 //
gmehmet 0:ddc2fef69ef9 623 // Set sample rate
gmehmet 0:ddc2fef69ef9 624 // This function can be alled after BMI160_DefaultInitalize
gmehmet 0:ddc2fef69ef9 625 int32_t setSampleRate(int sample_rate);
gmehmet 0:ddc2fef69ef9 626
gmehmet 0:ddc2fef69ef9 627 /// @brief Soft reset
gmehmet 0:ddc2fef69ef9 628 ///
gmehmet 0:ddc2fef69ef9 629 int32_t reset();
gmehmet 0:ddc2fef69ef9 630
gmehmet 0:ddc2fef69ef9 631 private:
gmehmet 0:ddc2fef69ef9 632 bool m_use_irq;
gmehmet 0:ddc2fef69ef9 633 bool bmi160_irq_asserted;
gmehmet 0:ddc2fef69ef9 634 InterruptIn *m_bmi160_irq;
gmehmet 0:ddc2fef69ef9 635 void irq_handler();
gmehmet 0:ddc2fef69ef9 636
gmehmet 0:ddc2fef69ef9 637 protected:
gmehmet 0:ddc2fef69ef9 638 BMI160(InterruptIn *int_pin): m_bmi160_irq(int_pin), m_use_irq(true) {
gmehmet 0:ddc2fef69ef9 639 bmi160_irq_asserted = false;
gmehmet 0:ddc2fef69ef9 640 }
gmehmet 0:ddc2fef69ef9 641
gmehmet 0:ddc2fef69ef9 642 BMI160(): m_use_irq(false) { }
gmehmet 0:ddc2fef69ef9 643 };
gmehmet 0:ddc2fef69ef9 644
gmehmet 0:ddc2fef69ef9 645
gmehmet 0:ddc2fef69ef9 646 /**
gmehmet 0:ddc2fef69ef9 647 @brief BMI160_I2C - supports BMI160 object with I2C interface
gmehmet 0:ddc2fef69ef9 648 */
gmehmet 0:ddc2fef69ef9 649 class BMI160_I2C: public BMI160
gmehmet 0:ddc2fef69ef9 650 {
gmehmet 0:ddc2fef69ef9 651 public:
gmehmet 0:ddc2fef69ef9 652
gmehmet 0:ddc2fef69ef9 653 ///BMI160 default I2C address.
gmehmet 0:ddc2fef69ef9 654 static const uint8_t I2C_ADRS_SDO_LO = 0x68;
gmehmet 0:ddc2fef69ef9 655 ///BMI160 optional I2C address.
gmehmet 0:ddc2fef69ef9 656 static const uint8_t I2C_ADRS_SDO_HI = 0x69;
gmehmet 0:ddc2fef69ef9 657
gmehmet 0:ddc2fef69ef9 658
gmehmet 0:ddc2fef69ef9 659 ///@brief BMI160_I2C Constructor.\n
gmehmet 0:ddc2fef69ef9 660 ///
gmehmet 0:ddc2fef69ef9 661 ///On Entry:
gmehmet 0:ddc2fef69ef9 662 ///@param[in] i2cBus - reference to I2C bus for this device
gmehmet 0:ddc2fef69ef9 663 ///@param[in] i2cAdrs - 7-bit I2C address
gmehmet 0:ddc2fef69ef9 664 ///
gmehmet 0:ddc2fef69ef9 665 ///On Exit:
gmehmet 0:ddc2fef69ef9 666 ///@param[out] none
gmehmet 0:ddc2fef69ef9 667 ///
gmehmet 0:ddc2fef69ef9 668 ///@returns none
gmehmet 0:ddc2fef69ef9 669 BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs);
gmehmet 0:ddc2fef69ef9 670
gmehmet 0:ddc2fef69ef9 671 ///@brief BMI160_I2C Constructor.\n
gmehmet 0:ddc2fef69ef9 672 ///
gmehmet 0:ddc2fef69ef9 673 ///On Entry:
gmehmet 0:ddc2fef69ef9 674 ///@param[in] i2cBus - reference to I2C bus for this device
gmehmet 0:ddc2fef69ef9 675 ///@param[in] i2cAdrs - 7-bit I2C address
gmehmet 0:ddc2fef69ef9 676 ///@param[in] int_pin - Interrupt pin
gmehmet 0:ddc2fef69ef9 677 ///
gmehmet 0:ddc2fef69ef9 678 ///On Exit:
gmehmet 0:ddc2fef69ef9 679 ///@param[out] none
gmehmet 0:ddc2fef69ef9 680 ///
gmehmet 0:ddc2fef69ef9 681 ///@returns none
gmehmet 0:ddc2fef69ef9 682 BMI160_I2C(I2C *i2cBus, uint8_t i2cAdrs, InterruptIn *int_pin);
gmehmet 0:ddc2fef69ef9 683
gmehmet 0:ddc2fef69ef9 684 ///@brief Reads a single register.\n
gmehmet 0:ddc2fef69ef9 685 ///
gmehmet 0:ddc2fef69ef9 686 ///On Entry:
gmehmet 0:ddc2fef69ef9 687 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 688 ///
gmehmet 0:ddc2fef69ef9 689 ///On Exit:
gmehmet 0:ddc2fef69ef9 690 ///@param[out] data - holds contents of read register on success
gmehmet 0:ddc2fef69ef9 691 ///
gmehmet 0:ddc2fef69ef9 692 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 693 virtual int32_t readRegister(Registers reg, uint8_t *data);
gmehmet 0:ddc2fef69ef9 694
gmehmet 0:ddc2fef69ef9 695
gmehmet 0:ddc2fef69ef9 696 ///@brief Writes a single register.\n
gmehmet 0:ddc2fef69ef9 697 ///
gmehmet 0:ddc2fef69ef9 698 ///On Entry:
gmehmet 0:ddc2fef69ef9 699 ///@param[in] data - data to write to register
gmehmet 0:ddc2fef69ef9 700 ///
gmehmet 0:ddc2fef69ef9 701 ///On Exit:
gmehmet 0:ddc2fef69ef9 702 ///@param[out] none
gmehmet 0:ddc2fef69ef9 703 ///
gmehmet 0:ddc2fef69ef9 704 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 705 virtual int32_t writeRegister(Registers reg, const uint8_t data);
gmehmet 0:ddc2fef69ef9 706
gmehmet 0:ddc2fef69ef9 707
gmehmet 0:ddc2fef69ef9 708 ///@brief Reads a block of registers.\n
gmehmet 0:ddc2fef69ef9 709 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 710 ///'stopReg' exist and are readable. Function reads up to, including,
gmehmet 0:ddc2fef69ef9 711 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 712 ///
gmehmet 0:ddc2fef69ef9 713 ///On Entry:
gmehmet 0:ddc2fef69ef9 714 ///@param[in] startReg - register to start reading from
gmehmet 0:ddc2fef69ef9 715 ///@param[in] stopReg - register to stop reading from
gmehmet 0:ddc2fef69ef9 716 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 717 ///
gmehmet 0:ddc2fef69ef9 718 ///On Exit:
gmehmet 0:ddc2fef69ef9 719 ///@param[out] data - holds contents of read registers on success
gmehmet 0:ddc2fef69ef9 720 ///
gmehmet 0:ddc2fef69ef9 721 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 722 virtual int32_t readBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 723 uint8_t *data);
gmehmet 0:ddc2fef69ef9 724
gmehmet 0:ddc2fef69ef9 725
gmehmet 0:ddc2fef69ef9 726 ///@brief Writes a block of registers.\n
gmehmet 0:ddc2fef69ef9 727 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 728 ///'stopReg' exist and are writeable. Function writes up to, including,
gmehmet 0:ddc2fef69ef9 729 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 730 ///
gmehmet 0:ddc2fef69ef9 731 ///On Entry:
gmehmet 0:ddc2fef69ef9 732 ///@param[in] startReg - register to start writing at
gmehmet 0:ddc2fef69ef9 733 ///@param[in] stopReg - register to stop writing at
gmehmet 0:ddc2fef69ef9 734 ///@param[in] data - pointer to data to write to registers
gmehmet 0:ddc2fef69ef9 735 ///
gmehmet 0:ddc2fef69ef9 736 ///On Exit:
gmehmet 0:ddc2fef69ef9 737 ///@param[out] none
gmehmet 0:ddc2fef69ef9 738 ///
gmehmet 0:ddc2fef69ef9 739 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 740 virtual int32_t writeBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 741 const uint8_t *data);
gmehmet 0:ddc2fef69ef9 742
gmehmet 0:ddc2fef69ef9 743 private:
gmehmet 0:ddc2fef69ef9 744 I2C *m_i2cBus;
gmehmet 0:ddc2fef69ef9 745 uint8_t m_Wadrs, m_Radrs;
gmehmet 0:ddc2fef69ef9 746 };
gmehmet 0:ddc2fef69ef9 747
gmehmet 0:ddc2fef69ef9 748
gmehmet 0:ddc2fef69ef9 749 /**
gmehmet 0:ddc2fef69ef9 750 @brief BMI160_SPI - supports BMI160 object with SPI interface
gmehmet 0:ddc2fef69ef9 751 */
gmehmet 0:ddc2fef69ef9 752 class BMI160_SPI: public BMI160
gmehmet 0:ddc2fef69ef9 753 {
gmehmet 0:ddc2fef69ef9 754 public:
gmehmet 0:ddc2fef69ef9 755
gmehmet 0:ddc2fef69ef9 756 ///@brief BMI160_SPI Constructor.\n
gmehmet 0:ddc2fef69ef9 757 ///
gmehmet 0:ddc2fef69ef9 758 ///On Entry:
gmehmet 0:ddc2fef69ef9 759 ///@param[in] spiBus - reference to SPI bus for this device
gmehmet 0:ddc2fef69ef9 760 ///@param[in] cs - reference to DigitalOut used for chip select
gmehmet 0:ddc2fef69ef9 761 ///
gmehmet 0:ddc2fef69ef9 762 ///On Exit:
gmehmet 0:ddc2fef69ef9 763 ///@param[out] none
gmehmet 0:ddc2fef69ef9 764 ///
gmehmet 0:ddc2fef69ef9 765 ///@returns none
gmehmet 0:ddc2fef69ef9 766 BMI160_SPI(SPI *spiBus, DigitalOut &cs);
gmehmet 0:ddc2fef69ef9 767
gmehmet 0:ddc2fef69ef9 768
gmehmet 0:ddc2fef69ef9 769 ///@brief Reads a single register.\n
gmehmet 0:ddc2fef69ef9 770 ///
gmehmet 0:ddc2fef69ef9 771 ///On Entry:
gmehmet 0:ddc2fef69ef9 772 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 773 ///
gmehmet 0:ddc2fef69ef9 774 ///On Exit:
gmehmet 0:ddc2fef69ef9 775 ///@param[out] data - holds contents of read register on success
gmehmet 0:ddc2fef69ef9 776 ///
gmehmet 0:ddc2fef69ef9 777 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 778 virtual int32_t readRegister(Registers reg, uint8_t *data);
gmehmet 0:ddc2fef69ef9 779
gmehmet 0:ddc2fef69ef9 780
gmehmet 0:ddc2fef69ef9 781 ///@brief Writes a single register.\n
gmehmet 0:ddc2fef69ef9 782 ///
gmehmet 0:ddc2fef69ef9 783 ///On Entry:
gmehmet 0:ddc2fef69ef9 784 ///@param[in] data - data to write to register
gmehmet 0:ddc2fef69ef9 785 ///
gmehmet 0:ddc2fef69ef9 786 ///On Exit:
gmehmet 0:ddc2fef69ef9 787 ///@param[out] none
gmehmet 0:ddc2fef69ef9 788 ///
gmehmet 0:ddc2fef69ef9 789 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 790 virtual int32_t writeRegister(Registers reg, const uint8_t data);
gmehmet 0:ddc2fef69ef9 791
gmehmet 0:ddc2fef69ef9 792
gmehmet 0:ddc2fef69ef9 793 ///@brief Reads a block of registers.\n
gmehmet 0:ddc2fef69ef9 794 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 795 ///'stopReg' exist and are readable. Function reads up to, including,
gmehmet 0:ddc2fef69ef9 796 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 797 ///
gmehmet 0:ddc2fef69ef9 798 ///On Entry:
gmehmet 0:ddc2fef69ef9 799 ///@param[in] startReg - register to start reading from
gmehmet 0:ddc2fef69ef9 800 ///@param[in] stopReg - register to stop reading from
gmehmet 0:ddc2fef69ef9 801 ///@param[in] data - pointer to memory for storing read data
gmehmet 0:ddc2fef69ef9 802 ///
gmehmet 0:ddc2fef69ef9 803 ///On Exit:
gmehmet 0:ddc2fef69ef9 804 ///@param[out] data - holds contents of read registers on success
gmehmet 0:ddc2fef69ef9 805 ///
gmehmet 0:ddc2fef69ef9 806 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 807 virtual int32_t readBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 808 uint8_t *data);
gmehmet 0:ddc2fef69ef9 809
gmehmet 0:ddc2fef69ef9 810
gmehmet 0:ddc2fef69ef9 811 ///@brief Writes a block of registers.\n
gmehmet 0:ddc2fef69ef9 812 ///@detail User must ensure that all registers between 'startReg' and
gmehmet 0:ddc2fef69ef9 813 ///'stopReg' exist and are writeable. Function writes up to, including,
gmehmet 0:ddc2fef69ef9 814 ///'stopReg'.\n
gmehmet 0:ddc2fef69ef9 815 ///
gmehmet 0:ddc2fef69ef9 816 ///On Entry:
gmehmet 0:ddc2fef69ef9 817 ///@param[in] startReg - register to start writing at
gmehmet 0:ddc2fef69ef9 818 ///@param[in] stopReg - register to stop writing at
gmehmet 0:ddc2fef69ef9 819 ///@param[in] data - pointer to data to write to registers
gmehmet 0:ddc2fef69ef9 820 ///
gmehmet 0:ddc2fef69ef9 821 ///On Exit:
gmehmet 0:ddc2fef69ef9 822 ///@param[out] none
gmehmet 0:ddc2fef69ef9 823 ///
gmehmet 0:ddc2fef69ef9 824 ///@returns 0 on success, non 0 on failure
gmehmet 0:ddc2fef69ef9 825 virtual int32_t writeBlock(Registers startReg, Registers stopReg,
gmehmet 0:ddc2fef69ef9 826 const uint8_t *data);
gmehmet 0:ddc2fef69ef9 827
gmehmet 0:ddc2fef69ef9 828 private:
gmehmet 0:ddc2fef69ef9 829
gmehmet 0:ddc2fef69ef9 830 SPI *m_spiBus;
gmehmet 0:ddc2fef69ef9 831 DigitalOut m_cs;
gmehmet 0:ddc2fef69ef9 832 };
gmehmet 0:ddc2fef69ef9 833
gmehmet 0:ddc2fef69ef9 834 #endif /* BMI160_H */
gmehmet 0:ddc2fef69ef9 835
gmehmet 0:ddc2fef69ef9 836
gmehmet 0:ddc2fef69ef9 837 ///@brief fx documentation template.\n
gmehmet 0:ddc2fef69ef9 838 ///
gmehmet 0:ddc2fef69ef9 839 ///On Entry:
gmehmet 0:ddc2fef69ef9 840 ///@param[in] none
gmehmet 0:ddc2fef69ef9 841 ///
gmehmet 0:ddc2fef69ef9 842 ///On Exit:
gmehmet 0:ddc2fef69ef9 843 ///@param[out] none
gmehmet 0:ddc2fef69ef9 844 ///
gmehmet 0:ddc2fef69ef9 845 ///@returns none