BMI160 Initial

Dependents:   MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks

Committer:
CharlesMaxim
Date:
Tue Dec 04 09:50:52 2018 +0000
Revision:
21:0b28b9d13164
Initial Release for BMI160

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CharlesMaxim 21:0b28b9d13164 1 /**
CharlesMaxim 21:0b28b9d13164 2 * Copyright (C) 2015 - 2016 Bosch Sensortec GmbH
CharlesMaxim 21:0b28b9d13164 3 *
CharlesMaxim 21:0b28b9d13164 4 * Redistribution and use in source and binary forms, with or without
CharlesMaxim 21:0b28b9d13164 5 * modification, are permitted provided that the following conditions are met:
CharlesMaxim 21:0b28b9d13164 6 *
CharlesMaxim 21:0b28b9d13164 7 * Redistributions of source code must retain the above copyright
CharlesMaxim 21:0b28b9d13164 8 * notice, this list of conditions and the following disclaimer.
CharlesMaxim 21:0b28b9d13164 9 *
CharlesMaxim 21:0b28b9d13164 10 * Redistributions in binary form must reproduce the above copyright
CharlesMaxim 21:0b28b9d13164 11 * notice, this list of conditions and the following disclaimer in the
CharlesMaxim 21:0b28b9d13164 12 * documentation and/or other materials provided with the distribution.
CharlesMaxim 21:0b28b9d13164 13 *
CharlesMaxim 21:0b28b9d13164 14 * Neither the name of the copyright holder nor the names of the
CharlesMaxim 21:0b28b9d13164 15 * contributors may be used to endorse or promote products derived from
CharlesMaxim 21:0b28b9d13164 16 * this software without specific prior written permission.
CharlesMaxim 21:0b28b9d13164 17 *
CharlesMaxim 21:0b28b9d13164 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CharlesMaxim 21:0b28b9d13164 19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
CharlesMaxim 21:0b28b9d13164 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
CharlesMaxim 21:0b28b9d13164 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
CharlesMaxim 21:0b28b9d13164 22 * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
CharlesMaxim 21:0b28b9d13164 23 * OR CONTRIBUTORS BE LIABLE FOR ANY
CharlesMaxim 21:0b28b9d13164 24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
CharlesMaxim 21:0b28b9d13164 25 * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
CharlesMaxim 21:0b28b9d13164 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
CharlesMaxim 21:0b28b9d13164 27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
CharlesMaxim 21:0b28b9d13164 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
CharlesMaxim 21:0b28b9d13164 29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
CharlesMaxim 21:0b28b9d13164 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
CharlesMaxim 21:0b28b9d13164 31 * ANY WAY OUT OF THE USE OF THIS
CharlesMaxim 21:0b28b9d13164 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
CharlesMaxim 21:0b28b9d13164 33 *
CharlesMaxim 21:0b28b9d13164 34 * The information provided is believed to be accurate and reliable.
CharlesMaxim 21:0b28b9d13164 35 * The copyright holder assumes no responsibility
CharlesMaxim 21:0b28b9d13164 36 * for the consequences of use
CharlesMaxim 21:0b28b9d13164 37 * of such information nor for any infringement of patents or
CharlesMaxim 21:0b28b9d13164 38 * other rights of third parties which may result from its use.
CharlesMaxim 21:0b28b9d13164 39 * No license is granted by implication or otherwise under any patent or
CharlesMaxim 21:0b28b9d13164 40 * patent rights of the copyright holder.
CharlesMaxim 21:0b28b9d13164 41 *
CharlesMaxim 21:0b28b9d13164 42 * @file bmi160_defs.h
CharlesMaxim 21:0b28b9d13164 43 * @date 11 Jan 2018
CharlesMaxim 21:0b28b9d13164 44 * @version 3.7.5
CharlesMaxim 21:0b28b9d13164 45 * @brief
CharlesMaxim 21:0b28b9d13164 46 *
CharlesMaxim 21:0b28b9d13164 47 */
CharlesMaxim 21:0b28b9d13164 48
CharlesMaxim 21:0b28b9d13164 49 /*!
CharlesMaxim 21:0b28b9d13164 50 * @defgroup bmi160_defs
CharlesMaxim 21:0b28b9d13164 51 * @brief
CharlesMaxim 21:0b28b9d13164 52 * @{*/
CharlesMaxim 21:0b28b9d13164 53
CharlesMaxim 21:0b28b9d13164 54 #ifndef BMI160_DEFS_H_
CharlesMaxim 21:0b28b9d13164 55 #define BMI160_DEFS_H_
CharlesMaxim 21:0b28b9d13164 56
CharlesMaxim 21:0b28b9d13164 57 /*************************** C types headers *****************************/
CharlesMaxim 21:0b28b9d13164 58 #ifdef __KERNEL__
CharlesMaxim 21:0b28b9d13164 59 #include <linux/types.h>
CharlesMaxim 21:0b28b9d13164 60 #include <linux/kernel.h>
CharlesMaxim 21:0b28b9d13164 61 #else
CharlesMaxim 21:0b28b9d13164 62 #include <stdint.h>
CharlesMaxim 21:0b28b9d13164 63 #include <stddef.h>
CharlesMaxim 21:0b28b9d13164 64 #endif
CharlesMaxim 21:0b28b9d13164 65
CharlesMaxim 21:0b28b9d13164 66 /*************************** Common macros *****************************/
CharlesMaxim 21:0b28b9d13164 67
CharlesMaxim 21:0b28b9d13164 68 #if !defined(UINT8_C) && !defined(INT8_C)
CharlesMaxim 21:0b28b9d13164 69 #define INT8_C(x) S8_C(x)
CharlesMaxim 21:0b28b9d13164 70 #define UINT8_C(x) U8_C(x)
CharlesMaxim 21:0b28b9d13164 71 #endif
CharlesMaxim 21:0b28b9d13164 72
CharlesMaxim 21:0b28b9d13164 73 #if !defined(UINT16_C) && !defined(INT16_C)
CharlesMaxim 21:0b28b9d13164 74 #define INT16_C(x) S16_C(x)
CharlesMaxim 21:0b28b9d13164 75 #define UINT16_C(x) U16_C(x)
CharlesMaxim 21:0b28b9d13164 76 #endif
CharlesMaxim 21:0b28b9d13164 77
CharlesMaxim 21:0b28b9d13164 78 #if !defined(INT32_C) && !defined(UINT32_C)
CharlesMaxim 21:0b28b9d13164 79 #define INT32_C(x) S32_C(x)
CharlesMaxim 21:0b28b9d13164 80 #define UINT32_C(x) U32_C(x)
CharlesMaxim 21:0b28b9d13164 81 #endif
CharlesMaxim 21:0b28b9d13164 82
CharlesMaxim 21:0b28b9d13164 83 #if !defined(INT64_C) && !defined(UINT64_C)
CharlesMaxim 21:0b28b9d13164 84 #define INT64_C(x) S64_C(x)
CharlesMaxim 21:0b28b9d13164 85 #define UINT64_C(x) U64_C(x)
CharlesMaxim 21:0b28b9d13164 86 #endif
CharlesMaxim 21:0b28b9d13164 87
CharlesMaxim 21:0b28b9d13164 88 /**@}*/
CharlesMaxim 21:0b28b9d13164 89
CharlesMaxim 21:0b28b9d13164 90 /**\name C standard macros */
CharlesMaxim 21:0b28b9d13164 91 #ifndef NULL
CharlesMaxim 21:0b28b9d13164 92 #ifdef __cplusplus
CharlesMaxim 21:0b28b9d13164 93 #define NULL 0
CharlesMaxim 21:0b28b9d13164 94 #else
CharlesMaxim 21:0b28b9d13164 95 #define NULL ((void *) 0)
CharlesMaxim 21:0b28b9d13164 96 #endif
CharlesMaxim 21:0b28b9d13164 97 #endif
CharlesMaxim 21:0b28b9d13164 98
CharlesMaxim 21:0b28b9d13164 99 /*************************** Sensor macros *****************************/
CharlesMaxim 21:0b28b9d13164 100 /* Test for an endian machine */
CharlesMaxim 21:0b28b9d13164 101 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
CharlesMaxim 21:0b28b9d13164 102 #define LITTLE_ENDIAN 1
CharlesMaxim 21:0b28b9d13164 103 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
CharlesMaxim 21:0b28b9d13164 104 #define BIG_ENDIAN 1
CharlesMaxim 21:0b28b9d13164 105 #else
CharlesMaxim 21:0b28b9d13164 106 #error "Code does not support Endian format of the processor"
CharlesMaxim 21:0b28b9d13164 107 #endif
CharlesMaxim 21:0b28b9d13164 108
CharlesMaxim 21:0b28b9d13164 109 /** Mask definitions */
CharlesMaxim 21:0b28b9d13164 110 #define BMI160_ACCEL_BW_MASK UINT8_C(0x70)
CharlesMaxim 21:0b28b9d13164 111 #define BMI160_ACCEL_ODR_MASK UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 112 #define BMI160_ACCEL_UNDERSAMPLING_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 113 #define BMI160_ACCEL_RANGE_MASK UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 114 #define BMI160_GYRO_BW_MASK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 115 #define BMI160_GYRO_ODR_MASK UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 116 #define BMI160_GYRO_RANGE_MSK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 117
CharlesMaxim 21:0b28b9d13164 118 /** Mask definitions for INT_EN registers */
CharlesMaxim 21:0b28b9d13164 119 #define BMI160_ANY_MOTION_X_INT_EN_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 120 #define BMI160_HIGH_G_X_INT_EN_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 121 #define BMI160_NO_MOTION_X_INT_EN_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 122 #define BMI160_ANY_MOTION_Y_INT_EN_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 123 #define BMI160_HIGH_G_Y_INT_EN_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 124 #define BMI160_NO_MOTION_Y_INT_EN_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 125 #define BMI160_ANY_MOTION_Z_INT_EN_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 126 #define BMI160_HIGH_G_Z_INT_EN_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 127 #define BMI160_NO_MOTION_Z_INT_EN_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 128 #define BMI160_SIG_MOTION_INT_EN_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 129 #define BMI160_ANY_MOTION_ALL_INT_EN_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 130 #define BMI160_STEP_DETECT_INT_EN_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 131 #define BMI160_DOUBLE_TAP_INT_EN_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 132 #define BMI160_SINGLE_TAP_INT_EN_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 133 #define BMI160_FIFO_FULL_INT_EN_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 134 #define BMI160_ORIENT_INT_EN_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 135 #define BMI160_FIFO_WATERMARK_INT_EN_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 136 #define BMI160_LOW_G_INT_EN_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 137 #define BMI160_STEP_DETECT_EN_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 138 #define BMI160_FLAT_INT_EN_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 139 #define BMI160_DATA_RDY_INT_EN_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 140
CharlesMaxim 21:0b28b9d13164 141 /** PMU status Macros */
CharlesMaxim 21:0b28b9d13164 142 #define BMI160_AUX_PMU_SUSPEND UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 143 #define BMI160_AUX_PMU_NORMAL UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 144 #define BMI160_AUX_PMU_LOW_POWER UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 145
CharlesMaxim 21:0b28b9d13164 146 #define BMI160_GYRO_PMU_SUSPEND UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 147 #define BMI160_GYRO_PMU_NORMAL UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 148 #define BMI160_GYRO_PMU_FSU UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 149
CharlesMaxim 21:0b28b9d13164 150 #define BMI160_ACCEL_PMU_SUSPEND UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 151 #define BMI160_ACCEL_PMU_NORMAL UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 152 #define BMI160_ACCEL_PMU_LOW_POWER UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 153
CharlesMaxim 21:0b28b9d13164 154 /** Mask definitions for INT_OUT_CTRL register */
CharlesMaxim 21:0b28b9d13164 155 #define BMI160_INT1_EDGE_CTRL_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 156 #define BMI160_INT1_OUTPUT_MODE_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 157 #define BMI160_INT1_OUTPUT_TYPE_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 158 #define BMI160_INT1_OUTPUT_EN_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 159 #define BMI160_INT2_EDGE_CTRL_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 160 #define BMI160_INT2_OUTPUT_MODE_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 161 #define BMI160_INT2_OUTPUT_TYPE_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 162 #define BMI160_INT2_OUTPUT_EN_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 163
CharlesMaxim 21:0b28b9d13164 164 /** Mask definitions for INT_LATCH register */
CharlesMaxim 21:0b28b9d13164 165 #define BMI160_INT1_INPUT_EN_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 166 #define BMI160_INT2_INPUT_EN_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 167 #define BMI160_INT_LATCH_MASK UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 168
CharlesMaxim 21:0b28b9d13164 169 /** Mask definitions for INT_MAP register */
CharlesMaxim 21:0b28b9d13164 170 #define BMI160_INT1_LOW_G_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 171 #define BMI160_INT1_HIGH_G_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 172 #define BMI160_INT1_SLOPE_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 173 #define BMI160_INT1_NO_MOTION_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 174 #define BMI160_INT1_DOUBLE_TAP_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 175 #define BMI160_INT1_SINGLE_TAP_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 176 #define BMI160_INT1_FIFO_FULL_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 177 #define BMI160_INT1_FIFO_WM_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 178 #define BMI160_INT1_ORIENT_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 179 #define BMI160_INT1_FLAT_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 180 #define BMI160_INT1_DATA_READY_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 181 #define BMI160_INT2_LOW_G_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 182 #define BMI160_INT1_LOW_STEP_DETECT_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 183 #define BMI160_INT2_LOW_STEP_DETECT_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 184 #define BMI160_INT2_HIGH_G_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 185 #define BMI160_INT2_FIFO_FULL_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 186 #define BMI160_INT2_FIFO_WM_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 187 #define BMI160_INT2_SLOPE_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 188 #define BMI160_INT2_DATA_READY_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 189 #define BMI160_INT2_NO_MOTION_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 190 #define BMI160_INT2_DOUBLE_TAP_MASK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 191 #define BMI160_INT2_SINGLE_TAP_MASK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 192 #define BMI160_INT2_ORIENT_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 193 #define BMI160_INT2_FLAT_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 194
CharlesMaxim 21:0b28b9d13164 195 /** Mask definitions for INT_DATA register */
CharlesMaxim 21:0b28b9d13164 196 #define BMI160_TAP_SRC_INT_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 197 #define BMI160_LOW_HIGH_SRC_INT_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 198 #define BMI160_MOTION_SRC_INT_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 199
CharlesMaxim 21:0b28b9d13164 200 /** Mask definitions for INT_MOTION register */
CharlesMaxim 21:0b28b9d13164 201 #define BMI160_SLOPE_INT_DUR_MASK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 202 #define BMI160_NO_MOTION_INT_DUR_MASK UINT8_C(0xFC)
CharlesMaxim 21:0b28b9d13164 203 #define BMI160_NO_MOTION_SEL_BIT_MASK UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 204
CharlesMaxim 21:0b28b9d13164 205 /** Mask definitions for INT_TAP register */
CharlesMaxim 21:0b28b9d13164 206 #define BMI160_TAP_DUR_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 207 #define BMI160_TAP_SHOCK_DUR_MASK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 208 #define BMI160_TAP_QUIET_DUR_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 209 #define BMI160_TAP_THRES_MASK UINT8_C(0x1F)
CharlesMaxim 21:0b28b9d13164 210
CharlesMaxim 21:0b28b9d13164 211 /** Mask definitions for INT_FLAT register */
CharlesMaxim 21:0b28b9d13164 212 #define BMI160_FLAT_THRES_MASK UINT8_C(0x3F)
CharlesMaxim 21:0b28b9d13164 213 #define BMI160_FLAT_HOLD_TIME_MASK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 214 #define BMI160_FLAT_HYST_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 215
CharlesMaxim 21:0b28b9d13164 216 /** Mask definitions for INT_LOWHIGH register */
CharlesMaxim 21:0b28b9d13164 217 #define BMI160_LOW_G_HYST_MASK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 218 #define BMI160_LOW_G_LOW_MODE_MASK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 219 #define BMI160_HIGH_G_HYST_MASK UINT8_C(0xC0)
CharlesMaxim 21:0b28b9d13164 220
CharlesMaxim 21:0b28b9d13164 221 /** Mask definitions for INT_SIG_MOTION register */
CharlesMaxim 21:0b28b9d13164 222 #define BMI160_SIG_MOTION_SEL_MASK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 223 #define BMI160_SIG_MOTION_SKIP_MASK UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 224 #define BMI160_SIG_MOTION_PROOF_MASK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 225
CharlesMaxim 21:0b28b9d13164 226 /** Mask definitions for INT_ORIENT register */
CharlesMaxim 21:0b28b9d13164 227 #define BMI160_ORIENT_MODE_MASK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 228 #define BMI160_ORIENT_BLOCK_MASK UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 229 #define BMI160_ORIENT_HYST_MASK UINT8_C(0xF0)
CharlesMaxim 21:0b28b9d13164 230 #define BMI160_ORIENT_THETA_MASK UINT8_C(0x3F)
CharlesMaxim 21:0b28b9d13164 231 #define BMI160_ORIENT_UD_ENABLE UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 232 #define BMI160_AXES_EN_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 233
CharlesMaxim 21:0b28b9d13164 234 /** Mask definitions for FIFO_CONFIG register */
CharlesMaxim 21:0b28b9d13164 235 #define BMI160_FIFO_GYRO UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 236 #define BMI160_FIFO_ACCEL UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 237 #define BMI160_FIFO_AUX UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 238 #define BMI160_FIFO_TAG_INT1 UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 239 #define BMI160_FIFO_TAG_INT2 UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 240 #define BMI160_FIFO_TIME UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 241 #define BMI160_FIFO_HEADER UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 242 #define BMI160_FIFO_CONFIG_1_MASK UINT8_C(0xFE)
CharlesMaxim 21:0b28b9d13164 243
CharlesMaxim 21:0b28b9d13164 244
CharlesMaxim 21:0b28b9d13164 245 /** Mask definitions for STEP_CONF register */
CharlesMaxim 21:0b28b9d13164 246 #define BMI160_STEP_COUNT_EN_BIT_MASK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 247 #define BMI160_STEP_DETECT_MIN_THRES_MASK UINT8_C(0x18)
CharlesMaxim 21:0b28b9d13164 248 #define BMI160_STEP_DETECT_STEPTIME_MIN_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 249 #define BMI160_STEP_MIN_BUF_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 250
CharlesMaxim 21:0b28b9d13164 251 /** Mask definition for FIFO Header Data Tag */
CharlesMaxim 21:0b28b9d13164 252 #define BMI160_FIFO_TAG_INTR_MASK UINT8_C(0xFC)
CharlesMaxim 21:0b28b9d13164 253
CharlesMaxim 21:0b28b9d13164 254 /** Fifo byte counter mask definitions */
CharlesMaxim 21:0b28b9d13164 255 #define BMI160_FIFO_BYTE_COUNTER_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 256
CharlesMaxim 21:0b28b9d13164 257 /** Enable/disable bit value */
CharlesMaxim 21:0b28b9d13164 258 #define BMI160_ENABLE 0x01
CharlesMaxim 21:0b28b9d13164 259 #define BMI160_DISABLE UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 260
CharlesMaxim 21:0b28b9d13164 261 /** Latch Duration */
CharlesMaxim 21:0b28b9d13164 262 #define BMI160_LATCH_DUR_NONE UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 263 #define BMI160_LATCH_DUR_312_5_MICRO_SEC UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 264 #define BMI160_LATCH_DUR_625_MICRO_SEC UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 265 #define BMI160_LATCH_DUR_1_25_MILLI_SEC UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 266 #define BMI160_LATCH_DUR_2_5_MILLI_SEC UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 267 #define BMI160_LATCH_DUR_5_MILLI_SEC UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 268 #define BMI160_LATCH_DUR_10_MILLI_SEC UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 269 #define BMI160_LATCH_DUR_20_MILLI_SEC UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 270 #define BMI160_LATCH_DUR_40_MILLI_SEC UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 271 #define BMI160_LATCH_DUR_80_MILLI_SEC UINT8_C(0x09)
CharlesMaxim 21:0b28b9d13164 272 #define BMI160_LATCH_DUR_160_MILLI_SEC UINT8_C(0x0A)
CharlesMaxim 21:0b28b9d13164 273 #define BMI160_LATCH_DUR_320_MILLI_SEC UINT8_C(0x0B)
CharlesMaxim 21:0b28b9d13164 274 #define BMI160_LATCH_DUR_640_MILLI_SEC UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 275 #define BMI160_LATCH_DUR_1_28_SEC UINT8_C(0x0D)
CharlesMaxim 21:0b28b9d13164 276 #define BMI160_LATCH_DUR_2_56_SEC UINT8_C(0x0E)
CharlesMaxim 21:0b28b9d13164 277 #define BMI160_LATCHED UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 278
CharlesMaxim 21:0b28b9d13164 279 /** BMI160 Register map */
CharlesMaxim 21:0b28b9d13164 280 #define BMI160_CHIP_ID_ADDR UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 281 #define BMI160_ERROR_REG_ADDR UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 282 #define BMI160_PMU_STATUS_ADDR UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 283 #define BMI160_AUX_DATA_ADDR UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 284 #define BMI160_GYRO_DATA_ADDR UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 285 #define BMI160_ACCEL_DATA_ADDR UINT8_C(0x12)
CharlesMaxim 21:0b28b9d13164 286 #define BMI160_STATUS_ADDR UINT8_C(0x1B)
CharlesMaxim 21:0b28b9d13164 287 #define BMI160_INT_STATUS_ADDR UINT8_C(0x1C)
CharlesMaxim 21:0b28b9d13164 288 #define BMI160_FIFO_LENGTH_ADDR UINT8_C(0x22)
CharlesMaxim 21:0b28b9d13164 289 #define BMI160_FIFO_DATA_ADDR UINT8_C(0x24)
CharlesMaxim 21:0b28b9d13164 290 #define BMI160_ACCEL_CONFIG_ADDR UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 291 #define BMI160_ACCEL_RANGE_ADDR UINT8_C(0x41)
CharlesMaxim 21:0b28b9d13164 292 #define BMI160_GYRO_CONFIG_ADDR UINT8_C(0x42)
CharlesMaxim 21:0b28b9d13164 293 #define BMI160_GYRO_RANGE_ADDR UINT8_C(0x43)
CharlesMaxim 21:0b28b9d13164 294 #define BMI160_AUX_ODR_ADDR UINT8_C(0x44)
CharlesMaxim 21:0b28b9d13164 295 #define BMI160_FIFO_DOWN_ADDR UINT8_C(0x45)
CharlesMaxim 21:0b28b9d13164 296 #define BMI160_FIFO_CONFIG_0_ADDR UINT8_C(0x46)
CharlesMaxim 21:0b28b9d13164 297 #define BMI160_FIFO_CONFIG_1_ADDR UINT8_C(0x47)
CharlesMaxim 21:0b28b9d13164 298 #define BMI160_AUX_IF_0_ADDR UINT8_C(0x4B)
CharlesMaxim 21:0b28b9d13164 299 #define BMI160_AUX_IF_1_ADDR UINT8_C(0x4C)
CharlesMaxim 21:0b28b9d13164 300 #define BMI160_AUX_IF_2_ADDR UINT8_C(0x4D)
CharlesMaxim 21:0b28b9d13164 301 #define BMI160_AUX_IF_3_ADDR UINT8_C(0x4E)
CharlesMaxim 21:0b28b9d13164 302 #define BMI160_AUX_IF_4_ADDR UINT8_C(0x4F)
CharlesMaxim 21:0b28b9d13164 303 #define BMI160_INT_ENABLE_0_ADDR UINT8_C(0x50)
CharlesMaxim 21:0b28b9d13164 304 #define BMI160_INT_ENABLE_1_ADDR UINT8_C(0x51)
CharlesMaxim 21:0b28b9d13164 305 #define BMI160_INT_ENABLE_2_ADDR UINT8_C(0x52)
CharlesMaxim 21:0b28b9d13164 306 #define BMI160_INT_OUT_CTRL_ADDR UINT8_C(0x53)
CharlesMaxim 21:0b28b9d13164 307 #define BMI160_INT_LATCH_ADDR UINT8_C(0x54)
CharlesMaxim 21:0b28b9d13164 308 #define BMI160_INT_MAP_0_ADDR UINT8_C(0x55)
CharlesMaxim 21:0b28b9d13164 309 #define BMI160_INT_MAP_1_ADDR UINT8_C(0x56)
CharlesMaxim 21:0b28b9d13164 310 #define BMI160_INT_MAP_2_ADDR UINT8_C(0x57)
CharlesMaxim 21:0b28b9d13164 311 #define BMI160_INT_DATA_0_ADDR UINT8_C(0x58)
CharlesMaxim 21:0b28b9d13164 312 #define BMI160_INT_DATA_1_ADDR UINT8_C(0x59)
CharlesMaxim 21:0b28b9d13164 313 #define BMI160_INT_LOWHIGH_0_ADDR UINT8_C(0x5A)
CharlesMaxim 21:0b28b9d13164 314 #define BMI160_INT_LOWHIGH_1_ADDR UINT8_C(0x5B)
CharlesMaxim 21:0b28b9d13164 315 #define BMI160_INT_LOWHIGH_2_ADDR UINT8_C(0x5C)
CharlesMaxim 21:0b28b9d13164 316 #define BMI160_INT_LOWHIGH_3_ADDR UINT8_C(0x5D)
CharlesMaxim 21:0b28b9d13164 317 #define BMI160_INT_LOWHIGH_4_ADDR UINT8_C(0x5E)
CharlesMaxim 21:0b28b9d13164 318 #define BMI160_INT_MOTION_0_ADDR UINT8_C(0x5F)
CharlesMaxim 21:0b28b9d13164 319 #define BMI160_INT_MOTION_1_ADDR UINT8_C(0x60)
CharlesMaxim 21:0b28b9d13164 320 #define BMI160_INT_MOTION_2_ADDR UINT8_C(0x61)
CharlesMaxim 21:0b28b9d13164 321 #define BMI160_INT_MOTION_3_ADDR UINT8_C(0x62)
CharlesMaxim 21:0b28b9d13164 322 #define BMI160_INT_TAP_0_ADDR UINT8_C(0x63)
CharlesMaxim 21:0b28b9d13164 323 #define BMI160_INT_TAP_1_ADDR UINT8_C(0x64)
CharlesMaxim 21:0b28b9d13164 324 #define BMI160_INT_ORIENT_0_ADDR UINT8_C(0x65)
CharlesMaxim 21:0b28b9d13164 325 #define BMI160_INT_ORIENT_1_ADDR UINT8_C(0x66)
CharlesMaxim 21:0b28b9d13164 326 #define BMI160_INT_FLAT_0_ADDR UINT8_C(0x67)
CharlesMaxim 21:0b28b9d13164 327 #define BMI160_INT_FLAT_1_ADDR UINT8_C(0x68)
CharlesMaxim 21:0b28b9d13164 328 #define BMI160_FOC_CONF_ADDR UINT8_C(0x69)
CharlesMaxim 21:0b28b9d13164 329 #define BMI160_CONF_ADDR UINT8_C(0x6A)
CharlesMaxim 21:0b28b9d13164 330
CharlesMaxim 21:0b28b9d13164 331 #define BMI160_IF_CONF_ADDR UINT8_C(0x6B)
CharlesMaxim 21:0b28b9d13164 332 #define BMI160_SELF_TEST_ADDR UINT8_C(0x6D)
CharlesMaxim 21:0b28b9d13164 333 #define BMI160_OFFSET_ADDR UINT8_C(0x71)
CharlesMaxim 21:0b28b9d13164 334 #define BMI160_OFFSET_CONF_ADDR UINT8_C(0x77)
CharlesMaxim 21:0b28b9d13164 335 #define BMI160_INT_STEP_CNT_0_ADDR UINT8_C(0x78)
CharlesMaxim 21:0b28b9d13164 336 #define BMI160_INT_STEP_CONFIG_0_ADDR UINT8_C(0x7A)
CharlesMaxim 21:0b28b9d13164 337 #define BMI160_INT_STEP_CONFIG_1_ADDR UINT8_C(0x7B)
CharlesMaxim 21:0b28b9d13164 338 #define BMI160_COMMAND_REG_ADDR UINT8_C(0x7E)
CharlesMaxim 21:0b28b9d13164 339 #define BMI160_SPI_COMM_TEST_ADDR UINT8_C(0x7F)
CharlesMaxim 21:0b28b9d13164 340 #define BMI160_INTL_PULLUP_CONF_ADDR UINT8_C(0x85)
CharlesMaxim 21:0b28b9d13164 341
CharlesMaxim 21:0b28b9d13164 342 /** Error code definitions */
CharlesMaxim 21:0b28b9d13164 343 #define BMI160_OK 0
CharlesMaxim 21:0b28b9d13164 344 #define BMI160_E_NULL_PTR INT8_C(-1)
CharlesMaxim 21:0b28b9d13164 345 #define BMI160_E_COM_FAIL INT8_C(-2)
CharlesMaxim 21:0b28b9d13164 346 #define BMI160_E_DEV_NOT_FOUND INT8_C(-3)
CharlesMaxim 21:0b28b9d13164 347 #define BMI160_E_OUT_OF_RANGE INT8_C(-4)
CharlesMaxim 21:0b28b9d13164 348 #define BMI160_E_INVALID_INPUT INT8_C(-5)
CharlesMaxim 21:0b28b9d13164 349 #define BMI160_E_ACCEL_ODR_BW_INVALID INT8_C(-6)
CharlesMaxim 21:0b28b9d13164 350 #define BMI160_E_GYRO_ODR_BW_INVALID INT8_C(-7)
CharlesMaxim 21:0b28b9d13164 351 #define BMI160_E_LWP_PRE_FLTR_INT_INVALID INT8_C(-8)
CharlesMaxim 21:0b28b9d13164 352 #define BMI160_E_LWP_PRE_FLTR_INVALID INT8_C(-9)
CharlesMaxim 21:0b28b9d13164 353 #define BMI160_E_AUX_NOT_FOUND INT8_C(-10)
CharlesMaxim 21:0b28b9d13164 354 #define BMI160_FOC_FAILURE INT8_C(-11)
CharlesMaxim 21:0b28b9d13164 355
CharlesMaxim 21:0b28b9d13164 356 /**\name API warning codes */
CharlesMaxim 21:0b28b9d13164 357 #define BMI160_W_GYRO_SELF_TEST_FAIL INT8_C(1)
CharlesMaxim 21:0b28b9d13164 358 #define BMI160_W_ACCEl_SELF_TEST_FAIL INT8_C(2)
CharlesMaxim 21:0b28b9d13164 359
CharlesMaxim 21:0b28b9d13164 360 /** BMI160 unique chip identifier */
CharlesMaxim 21:0b28b9d13164 361 #define BMI160_CHIP_ID UINT8_C(0xD1)
CharlesMaxim 21:0b28b9d13164 362
CharlesMaxim 21:0b28b9d13164 363 /** Soft reset command */
CharlesMaxim 21:0b28b9d13164 364 #define BMI160_SOFT_RESET_CMD UINT8_C(0xb6)
CharlesMaxim 21:0b28b9d13164 365 #define BMI160_SOFT_RESET_DELAY_MS UINT8_C(15)
CharlesMaxim 21:0b28b9d13164 366 /** Start FOC command */
CharlesMaxim 21:0b28b9d13164 367 #define BMI160_START_FOC_CMD UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 368 /** NVM backup enabling command */
CharlesMaxim 21:0b28b9d13164 369 #define BMI160_NVM_BACKUP_EN UINT8_C(0xA0)
CharlesMaxim 21:0b28b9d13164 370
CharlesMaxim 21:0b28b9d13164 371 /* Delay in ms settings */
CharlesMaxim 21:0b28b9d13164 372 #define BMI160_ACCEL_DELAY_MS UINT8_C(5)
CharlesMaxim 21:0b28b9d13164 373 #define BMI160_GYRO_DELAY_MS UINT8_C(81)
CharlesMaxim 21:0b28b9d13164 374 #define BMI160_ONE_MS_DELAY UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 375 #define BMI160_AUX_COM_DELAY UINT8_C(10)
CharlesMaxim 21:0b28b9d13164 376 #define BMI160_GYRO_SELF_TEST_DELAY UINT8_C(20)
CharlesMaxim 21:0b28b9d13164 377 #define BMI160_ACCEL_SELF_TEST_DELAY UINT8_C(50)
CharlesMaxim 21:0b28b9d13164 378
CharlesMaxim 21:0b28b9d13164 379 /** Self test configurations */
CharlesMaxim 21:0b28b9d13164 380 #define BMI160_ACCEL_SELF_TEST_CONFIG UINT8_C(0x2C)
CharlesMaxim 21:0b28b9d13164 381 #define BMI160_ACCEL_SELF_TEST_POSITIVE_EN UINT8_C(0x0D)
CharlesMaxim 21:0b28b9d13164 382 #define BMI160_ACCEL_SELF_TEST_NEGATIVE_EN UINT8_C(0x09)
CharlesMaxim 21:0b28b9d13164 383 #define BMI160_ACCEL_SELF_TEST_LIMIT UINT16_C(8192)
CharlesMaxim 21:0b28b9d13164 384
CharlesMaxim 21:0b28b9d13164 385 /** Power mode settings */
CharlesMaxim 21:0b28b9d13164 386 /* Accel power mode */
CharlesMaxim 21:0b28b9d13164 387 #define BMI160_ACCEL_NORMAL_MODE UINT8_C(0x11)
CharlesMaxim 21:0b28b9d13164 388 #define BMI160_ACCEL_LOWPOWER_MODE UINT8_C(0x12)
CharlesMaxim 21:0b28b9d13164 389 #define BMI160_ACCEL_SUSPEND_MODE UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 390
CharlesMaxim 21:0b28b9d13164 391 /* Gyro power mode */
CharlesMaxim 21:0b28b9d13164 392 #define BMI160_GYRO_SUSPEND_MODE UINT8_C(0x14)
CharlesMaxim 21:0b28b9d13164 393 #define BMI160_GYRO_NORMAL_MODE UINT8_C(0x15)
CharlesMaxim 21:0b28b9d13164 394 #define BMI160_GYRO_FASTSTARTUP_MODE UINT8_C(0x17)
CharlesMaxim 21:0b28b9d13164 395
CharlesMaxim 21:0b28b9d13164 396 /* Aux power mode */
CharlesMaxim 21:0b28b9d13164 397 #define BMI160_AUX_SUSPEND_MODE UINT8_C(0x18)
CharlesMaxim 21:0b28b9d13164 398 #define BMI160_AUX_NORMAL_MODE UINT8_C(0x19)
CharlesMaxim 21:0b28b9d13164 399 #define BMI160_AUX_LOWPOWER_MODE UINT8_C(0x1A)
CharlesMaxim 21:0b28b9d13164 400
CharlesMaxim 21:0b28b9d13164 401 /** Range settings */
CharlesMaxim 21:0b28b9d13164 402 /* Accel Range */
CharlesMaxim 21:0b28b9d13164 403 #define BMI160_ACCEL_RANGE_2G UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 404 #define BMI160_ACCEL_RANGE_4G UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 405 #define BMI160_ACCEL_RANGE_8G UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 406 #define BMI160_ACCEL_RANGE_16G UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 407
CharlesMaxim 21:0b28b9d13164 408 /* Gyro Range */
CharlesMaxim 21:0b28b9d13164 409 #define BMI160_GYRO_RANGE_2000_DPS UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 410 #define BMI160_GYRO_RANGE_1000_DPS UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 411 #define BMI160_GYRO_RANGE_500_DPS UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 412 #define BMI160_GYRO_RANGE_250_DPS UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 413 #define BMI160_GYRO_RANGE_125_DPS UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 414
CharlesMaxim 21:0b28b9d13164 415 /** Bandwidth settings */
CharlesMaxim 21:0b28b9d13164 416 /* Accel Bandwidth */
CharlesMaxim 21:0b28b9d13164 417 #define BMI160_ACCEL_BW_OSR4_AVG1 UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 418 #define BMI160_ACCEL_BW_OSR2_AVG2 UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 419 #define BMI160_ACCEL_BW_NORMAL_AVG4 UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 420 #define BMI160_ACCEL_BW_RES_AVG8 UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 421 #define BMI160_ACCEL_BW_RES_AVG16 UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 422 #define BMI160_ACCEL_BW_RES_AVG32 UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 423 #define BMI160_ACCEL_BW_RES_AVG64 UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 424 #define BMI160_ACCEL_BW_RES_AVG128 UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 425
CharlesMaxim 21:0b28b9d13164 426 #define BMI160_GYRO_BW_OSR4_MODE UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 427 #define BMI160_GYRO_BW_OSR2_MODE UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 428 #define BMI160_GYRO_BW_NORMAL_MODE UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 429
CharlesMaxim 21:0b28b9d13164 430 /* Output Data Rate settings */
CharlesMaxim 21:0b28b9d13164 431 /* Accel Output data rate */
CharlesMaxim 21:0b28b9d13164 432 #define BMI160_ACCEL_ODR_RESERVED UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 433 #define BMI160_ACCEL_ODR_0_78HZ UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 434 #define BMI160_ACCEL_ODR_1_56HZ UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 435 #define BMI160_ACCEL_ODR_3_12HZ UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 436 #define BMI160_ACCEL_ODR_6_25HZ UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 437 #define BMI160_ACCEL_ODR_12_5HZ UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 438 #define BMI160_ACCEL_ODR_25HZ UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 439 #define BMI160_ACCEL_ODR_50HZ UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 440 #define BMI160_ACCEL_ODR_100HZ UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 441 #define BMI160_ACCEL_ODR_200HZ UINT8_C(0x09)
CharlesMaxim 21:0b28b9d13164 442 #define BMI160_ACCEL_ODR_400HZ UINT8_C(0x0A)
CharlesMaxim 21:0b28b9d13164 443 #define BMI160_ACCEL_ODR_800HZ UINT8_C(0x0B)
CharlesMaxim 21:0b28b9d13164 444 #define BMI160_ACCEL_ODR_1600HZ UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 445 #define BMI160_ACCEL_ODR_RESERVED0 UINT8_C(0x0D)
CharlesMaxim 21:0b28b9d13164 446 #define BMI160_ACCEL_ODR_RESERVED1 UINT8_C(0x0E)
CharlesMaxim 21:0b28b9d13164 447 #define BMI160_ACCEL_ODR_RESERVED2 UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 448
CharlesMaxim 21:0b28b9d13164 449 /* Gyro Output data rate */
CharlesMaxim 21:0b28b9d13164 450 #define BMI160_GYRO_ODR_RESERVED UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 451 #define BMI160_GYRO_ODR_25HZ UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 452 #define BMI160_GYRO_ODR_50HZ UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 453 #define BMI160_GYRO_ODR_100HZ UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 454 #define BMI160_GYRO_ODR_200HZ UINT8_C(0x09)
CharlesMaxim 21:0b28b9d13164 455 #define BMI160_GYRO_ODR_400HZ UINT8_C(0x0A)
CharlesMaxim 21:0b28b9d13164 456 #define BMI160_GYRO_ODR_800HZ UINT8_C(0x0B)
CharlesMaxim 21:0b28b9d13164 457 #define BMI160_GYRO_ODR_1600HZ UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 458 #define BMI160_GYRO_ODR_3200HZ UINT8_C(0x0D)
CharlesMaxim 21:0b28b9d13164 459
CharlesMaxim 21:0b28b9d13164 460 /* Auxiliary sensor Output data rate */
CharlesMaxim 21:0b28b9d13164 461 #define BMI160_AUX_ODR_RESERVED UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 462 #define BMI160_AUX_ODR_0_78HZ UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 463 #define BMI160_AUX_ODR_1_56HZ UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 464 #define BMI160_AUX_ODR_3_12HZ UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 465 #define BMI160_AUX_ODR_6_25HZ UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 466 #define BMI160_AUX_ODR_12_5HZ UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 467 #define BMI160_AUX_ODR_25HZ UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 468 #define BMI160_AUX_ODR_50HZ UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 469 #define BMI160_AUX_ODR_100HZ UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 470 #define BMI160_AUX_ODR_200HZ UINT8_C(0x09)
CharlesMaxim 21:0b28b9d13164 471 #define BMI160_AUX_ODR_400HZ UINT8_C(0x0A)
CharlesMaxim 21:0b28b9d13164 472 #define BMI160_AUX_ODR_800HZ UINT8_C(0x0B)
CharlesMaxim 21:0b28b9d13164 473
CharlesMaxim 21:0b28b9d13164 474 /* Maximum limits definition */
CharlesMaxim 21:0b28b9d13164 475 #define BMI160_ACCEL_ODR_MAX UINT8_C(15)
CharlesMaxim 21:0b28b9d13164 476 #define BMI160_ACCEL_BW_MAX UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 477 #define BMI160_ACCEL_RANGE_MAX UINT8_C(12)
CharlesMaxim 21:0b28b9d13164 478 #define BMI160_GYRO_ODR_MAX UINT8_C(13)
CharlesMaxim 21:0b28b9d13164 479 #define BMI160_GYRO_BW_MAX UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 480 #define BMI160_GYRO_RANGE_MAX UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 481
CharlesMaxim 21:0b28b9d13164 482 /** FIFO_CONFIG Definitions */
CharlesMaxim 21:0b28b9d13164 483 #define BMI160_FIFO_TIME_ENABLE UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 484 #define BMI160_FIFO_TAG_INT2_ENABLE UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 485 #define BMI160_FIFO_TAG_INT1_ENABLE UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 486 #define BMI160_FIFO_HEAD_ENABLE UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 487 #define BMI160_FIFO_M_ENABLE UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 488 #define BMI160_FIFO_A_ENABLE UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 489 #define BMI160_FIFO_M_A_ENABLE UINT8_C(0x60)
CharlesMaxim 21:0b28b9d13164 490 #define BMI160_FIFO_G_ENABLE UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 491 #define BMI160_FIFO_M_G_ENABLE UINT8_C(0xA0)
CharlesMaxim 21:0b28b9d13164 492 #define BMI160_FIFO_G_A_ENABLE UINT8_C(0xC0)
CharlesMaxim 21:0b28b9d13164 493 #define BMI160_FIFO_M_G_A_ENABLE UINT8_C(0xE0)
CharlesMaxim 21:0b28b9d13164 494
CharlesMaxim 21:0b28b9d13164 495 /* Macro to specify the number of bytes over-read from the
CharlesMaxim 21:0b28b9d13164 496 * FIFO in order to get the sensor time at the end of FIFO */
CharlesMaxim 21:0b28b9d13164 497 #ifndef BMI160_FIFO_BYTES_OVERREAD
CharlesMaxim 21:0b28b9d13164 498 #define BMI160_FIFO_BYTES_OVERREAD UINT8_C(25)
CharlesMaxim 21:0b28b9d13164 499 #endif
CharlesMaxim 21:0b28b9d13164 500
CharlesMaxim 21:0b28b9d13164 501
CharlesMaxim 21:0b28b9d13164 502
CharlesMaxim 21:0b28b9d13164 503 /* Accel, gyro and aux. sensor length and also their combined
CharlesMaxim 21:0b28b9d13164 504 * length definitions in FIFO */
CharlesMaxim 21:0b28b9d13164 505 #define BMI160_FIFO_G_LENGTH UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 506 #define BMI160_FIFO_A_LENGTH UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 507 #define BMI160_FIFO_M_LENGTH UINT8_C(8)
CharlesMaxim 21:0b28b9d13164 508 #define BMI160_FIFO_GA_LENGTH UINT8_C(12)
CharlesMaxim 21:0b28b9d13164 509 #define BMI160_FIFO_MA_LENGTH UINT8_C(14)
CharlesMaxim 21:0b28b9d13164 510 #define BMI160_FIFO_MG_LENGTH UINT8_C(14)
CharlesMaxim 21:0b28b9d13164 511 #define BMI160_FIFO_MGA_LENGTH UINT8_C(20)
CharlesMaxim 21:0b28b9d13164 512
CharlesMaxim 21:0b28b9d13164 513
CharlesMaxim 21:0b28b9d13164 514 /** FIFO Header Data definitions */
CharlesMaxim 21:0b28b9d13164 515 #define BMI160_FIFO_HEAD_SKIP_FRAME UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 516 #define BMI160_FIFO_HEAD_SENSOR_TIME UINT8_C(0x44)
CharlesMaxim 21:0b28b9d13164 517 #define BMI160_FIFO_HEAD_INPUT_CONFIG UINT8_C(0x48)
CharlesMaxim 21:0b28b9d13164 518 #define BMI160_FIFO_HEAD_OVER_READ UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 519 #define BMI160_FIFO_HEAD_A UINT8_C(0x84)
CharlesMaxim 21:0b28b9d13164 520 #define BMI160_FIFO_HEAD_G UINT8_C(0x88)
CharlesMaxim 21:0b28b9d13164 521 #define BMI160_FIFO_HEAD_G_A UINT8_C(0x8C)
CharlesMaxim 21:0b28b9d13164 522 #define BMI160_FIFO_HEAD_M UINT8_C(0x90)
CharlesMaxim 21:0b28b9d13164 523 #define BMI160_FIFO_HEAD_M_A UINT8_C(0x94)
CharlesMaxim 21:0b28b9d13164 524 #define BMI160_FIFO_HEAD_M_G UINT8_C(0x98)
CharlesMaxim 21:0b28b9d13164 525 #define BMI160_FIFO_HEAD_M_G_A UINT8_C(0x9C)
CharlesMaxim 21:0b28b9d13164 526
CharlesMaxim 21:0b28b9d13164 527
CharlesMaxim 21:0b28b9d13164 528 /** FIFO sensor time length definitions */
CharlesMaxim 21:0b28b9d13164 529 #define BMI160_SENSOR_TIME_LENGTH UINT8_C(3)
CharlesMaxim 21:0b28b9d13164 530
CharlesMaxim 21:0b28b9d13164 531
CharlesMaxim 21:0b28b9d13164 532 /** FIFO DOWN selection */
CharlesMaxim 21:0b28b9d13164 533 /* Accel fifo down-sampling values*/
CharlesMaxim 21:0b28b9d13164 534 #define BMI160_ACCEL_FIFO_DOWN_ZERO UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 535 #define BMI160_ACCEL_FIFO_DOWN_ONE UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 536 #define BMI160_ACCEL_FIFO_DOWN_TWO UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 537 #define BMI160_ACCEL_FIFO_DOWN_THREE UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 538 #define BMI160_ACCEL_FIFO_DOWN_FOUR UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 539 #define BMI160_ACCEL_FIFO_DOWN_FIVE UINT8_C(0x50)
CharlesMaxim 21:0b28b9d13164 540 #define BMI160_ACCEL_FIFO_DOWN_SIX UINT8_C(0x60)
CharlesMaxim 21:0b28b9d13164 541 #define BMI160_ACCEL_FIFO_DOWN_SEVEN UINT8_C(0x70)
CharlesMaxim 21:0b28b9d13164 542
CharlesMaxim 21:0b28b9d13164 543 /* Gyro fifo down-smapling values*/
CharlesMaxim 21:0b28b9d13164 544 #define BMI160_GYRO_FIFO_DOWN_ZERO UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 545 #define BMI160_GYRO_FIFO_DOWN_ONE UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 546 #define BMI160_GYRO_FIFO_DOWN_TWO UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 547 #define BMI160_GYRO_FIFO_DOWN_THREE UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 548 #define BMI160_GYRO_FIFO_DOWN_FOUR UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 549 #define BMI160_GYRO_FIFO_DOWN_FIVE UINT8_C(0x05)
CharlesMaxim 21:0b28b9d13164 550 #define BMI160_GYRO_FIFO_DOWN_SIX UINT8_C(0x06)
CharlesMaxim 21:0b28b9d13164 551 #define BMI160_GYRO_FIFO_DOWN_SEVEN UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 552
CharlesMaxim 21:0b28b9d13164 553 /* Accel Fifo filter enable*/
CharlesMaxim 21:0b28b9d13164 554 #define BMI160_ACCEL_FIFO_FILT_EN UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 555
CharlesMaxim 21:0b28b9d13164 556 /* Gyro Fifo filter enable*/
CharlesMaxim 21:0b28b9d13164 557 #define BMI160_GYRO_FIFO_FILT_EN UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 558
CharlesMaxim 21:0b28b9d13164 559 /** Definitions to check validity of FIFO frames */
CharlesMaxim 21:0b28b9d13164 560 #define FIFO_CONFIG_MSB_CHECK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 561 #define FIFO_CONFIG_LSB_CHECK UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 562
CharlesMaxim 21:0b28b9d13164 563 /*! BMI160 accel FOC configurations */
CharlesMaxim 21:0b28b9d13164 564 #define BMI160_FOC_ACCEL_DISABLED UINT8_C(0x00)
CharlesMaxim 21:0b28b9d13164 565 #define BMI160_FOC_ACCEL_POSITIVE_G 0x01
CharlesMaxim 21:0b28b9d13164 566 #define BMI160_FOC_ACCEL_NEGATIVE_G 0x02
CharlesMaxim 21:0b28b9d13164 567 #define BMI160_FOC_ACCEL_0G 0x03
CharlesMaxim 21:0b28b9d13164 568
CharlesMaxim 21:0b28b9d13164 569 /** Array Parameter DefinItions */
CharlesMaxim 21:0b28b9d13164 570 #define BMI160_SENSOR_TIME_LSB_BYTE UINT8_C(0)
CharlesMaxim 21:0b28b9d13164 571 #define BMI160_SENSOR_TIME_XLSB_BYTE UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 572 #define BMI160_SENSOR_TIME_MSB_BYTE UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 573
CharlesMaxim 21:0b28b9d13164 574
CharlesMaxim 21:0b28b9d13164 575 /** Interface settings */
CharlesMaxim 21:0b28b9d13164 576 #define BMI160_SPI_INTF UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 577 #define BMI160_I2C_INTF UINT8_C(0)
CharlesMaxim 21:0b28b9d13164 578 #define BMI160_SPI_RD_MASK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 579 #define BMI160_SPI_WR_MASK UINT8_C(0x7F)
CharlesMaxim 21:0b28b9d13164 580
CharlesMaxim 21:0b28b9d13164 581 /* Sensor & time select definition*/
CharlesMaxim 21:0b28b9d13164 582 #define BMI160_ACCEL_SEL UINT8_C(0x01)
CharlesMaxim 21:0b28b9d13164 583 #define BMI160_GYRO_SEL UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 584 #define BMI160_TIME_SEL UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 585
CharlesMaxim 21:0b28b9d13164 586 /* Sensor select mask*/
CharlesMaxim 21:0b28b9d13164 587 #define BMI160_SEN_SEL_MASK UINT8_C(0x07)
CharlesMaxim 21:0b28b9d13164 588
CharlesMaxim 21:0b28b9d13164 589 /* Error code mask */
CharlesMaxim 21:0b28b9d13164 590 #define BMI160_ERR_REG_MASK UINT8_C(0x0F)
CharlesMaxim 21:0b28b9d13164 591
CharlesMaxim 21:0b28b9d13164 592 /* BMI160 I2C address */
CharlesMaxim 21:0b28b9d13164 593 #define BMI160_I2C_ADDR UINT8_C(0x68)
CharlesMaxim 21:0b28b9d13164 594
CharlesMaxim 21:0b28b9d13164 595 /* BMI160 secondary IF address */
CharlesMaxim 21:0b28b9d13164 596 #define BMI160_AUX_BMM150_I2C_ADDR UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 597
CharlesMaxim 21:0b28b9d13164 598 /** BMI160 Length definitions */
CharlesMaxim 21:0b28b9d13164 599 #define BMI160_ONE UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 600 #define BMI160_TWO UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 601 #define BMI160_THREE UINT8_C(3)
CharlesMaxim 21:0b28b9d13164 602 #define BMI160_FOUR UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 603 #define BMI160_FIVE UINT8_C(5)
CharlesMaxim 21:0b28b9d13164 604
CharlesMaxim 21:0b28b9d13164 605 /** BMI160 fifo level Margin */
CharlesMaxim 21:0b28b9d13164 606 #define BMI160_FIFO_LEVEL_MARGIN UINT8_C(16)
CharlesMaxim 21:0b28b9d13164 607
CharlesMaxim 21:0b28b9d13164 608 /** BMI160 fifo flush Command */
CharlesMaxim 21:0b28b9d13164 609 #define BMI160_FIFO_FLUSH_VALUE UINT8_C(0xB0)
CharlesMaxim 21:0b28b9d13164 610
CharlesMaxim 21:0b28b9d13164 611 /** BMI160 offset values for xyz axes of accel */
CharlesMaxim 21:0b28b9d13164 612 #define BMI160_ACCEL_MIN_OFFSET INT8_C(-128)
CharlesMaxim 21:0b28b9d13164 613 #define BMI160_ACCEL_MAX_OFFSET INT8_C(127)
CharlesMaxim 21:0b28b9d13164 614
CharlesMaxim 21:0b28b9d13164 615 /** BMI160 offset values for xyz axes of gyro */
CharlesMaxim 21:0b28b9d13164 616 #define BMI160_GYRO_MIN_OFFSET INT16_C(-512)
CharlesMaxim 21:0b28b9d13164 617 #define BMI160_GYRO_MAX_OFFSET INT16_C(511)
CharlesMaxim 21:0b28b9d13164 618
CharlesMaxim 21:0b28b9d13164 619 /** BMI160 fifo full interrupt position and mask */
CharlesMaxim 21:0b28b9d13164 620 #define BMI160_FIFO_FULL_INT_POS UINT8_C(5)
CharlesMaxim 21:0b28b9d13164 621 #define BMI160_FIFO_FULL_INT_MSK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 622 #define BMI160_FIFO_WTM_INT_POS UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 623 #define BMI160_FIFO_WTM_INT_MSK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 624
CharlesMaxim 21:0b28b9d13164 625 #define BMI160_FIFO_FULL_INT_PIN1_POS UINT8_C(5)
CharlesMaxim 21:0b28b9d13164 626 #define BMI160_FIFO_FULL_INT_PIN1_MSK UINT8_C(0x20)
CharlesMaxim 21:0b28b9d13164 627 #define BMI160_FIFO_FULL_INT_PIN2_POS UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 628 #define BMI160_FIFO_FULL_INT_PIN2_MSK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 629
CharlesMaxim 21:0b28b9d13164 630 #define BMI160_FIFO_WTM_INT_PIN1_POS UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 631 #define BMI160_FIFO_WTM_INT_PIN1_MSK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 632 #define BMI160_FIFO_WTM_INT_PIN2_POS UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 633 #define BMI160_FIFO_WTM_INT_PIN2_MSK UINT8_C(0x04)
CharlesMaxim 21:0b28b9d13164 634
CharlesMaxim 21:0b28b9d13164 635 #define BMI160_MANUAL_MODE_EN_POS UINT8_C(7)
CharlesMaxim 21:0b28b9d13164 636 #define BMI160_MANUAL_MODE_EN_MSK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 637 #define BMI160_AUX_READ_BURST_POS UINT8_C(0)
CharlesMaxim 21:0b28b9d13164 638 #define BMI160_AUX_READ_BURST_MSK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 639
CharlesMaxim 21:0b28b9d13164 640 #define BMI160_GYRO_SELF_TEST_POS UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 641 #define BMI160_GYRO_SELF_TEST_MSK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 642 #define BMI160_GYRO_SELF_TEST_STATUS_POS UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 643 #define BMI160_GYRO_SELF_TEST_STATUS_MSK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 644
CharlesMaxim 21:0b28b9d13164 645 #define BMI160_GYRO_FOC_EN_POS UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 646 #define BMI160_GYRO_FOC_EN_MSK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 647
CharlesMaxim 21:0b28b9d13164 648 #define BMI160_ACCEL_FOC_X_CONF_POS UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 649 #define BMI160_ACCEL_FOC_X_CONF_MSK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 650
CharlesMaxim 21:0b28b9d13164 651 #define BMI160_ACCEL_FOC_Y_CONF_POS UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 652 #define BMI160_ACCEL_FOC_Y_CONF_MSK UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 653
CharlesMaxim 21:0b28b9d13164 654 #define BMI160_ACCEL_FOC_Z_CONF_MSK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 655
CharlesMaxim 21:0b28b9d13164 656 #define BMI160_FOC_STATUS_POS UINT8_C(3)
CharlesMaxim 21:0b28b9d13164 657 #define BMI160_FOC_STATUS_MSK UINT8_C(0x08)
CharlesMaxim 21:0b28b9d13164 658
CharlesMaxim 21:0b28b9d13164 659 #define BMI160_GYRO_OFFSET_X_MSK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 660
CharlesMaxim 21:0b28b9d13164 661 #define BMI160_GYRO_OFFSET_Y_POS UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 662 #define BMI160_GYRO_OFFSET_Y_MSK UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 663
CharlesMaxim 21:0b28b9d13164 664 #define BMI160_GYRO_OFFSET_Z_POS UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 665 #define BMI160_GYRO_OFFSET_Z_MSK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 666
CharlesMaxim 21:0b28b9d13164 667 #define BMI160_GYRO_OFFSET_EN_POS UINT8_C(7)
CharlesMaxim 21:0b28b9d13164 668 #define BMI160_GYRO_OFFSET_EN_MSK UINT8_C(0x80)
CharlesMaxim 21:0b28b9d13164 669
CharlesMaxim 21:0b28b9d13164 670 #define BMI160_ACCEL_OFFSET_EN_POS UINT8_C(6)
CharlesMaxim 21:0b28b9d13164 671 #define BMI160_ACCEL_OFFSET_EN_MSK UINT8_C(0x40)
CharlesMaxim 21:0b28b9d13164 672
CharlesMaxim 21:0b28b9d13164 673 #define BMI160_GYRO_OFFSET_POS UINT16_C(8)
CharlesMaxim 21:0b28b9d13164 674 #define BMI160_GYRO_OFFSET_MSK UINT16_C(0x0300)
CharlesMaxim 21:0b28b9d13164 675
CharlesMaxim 21:0b28b9d13164 676 #define BMI160_NVM_UPDATE_POS UINT8_C(1)
CharlesMaxim 21:0b28b9d13164 677 #define BMI160_NVM_UPDATE_MSK UINT8_C(0x02)
CharlesMaxim 21:0b28b9d13164 678
CharlesMaxim 21:0b28b9d13164 679 #define BMI160_NVM_STATUS_POS UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 680 #define BMI160_NVM_STATUS_MSK UINT8_C(0x10)
CharlesMaxim 21:0b28b9d13164 681
CharlesMaxim 21:0b28b9d13164 682 #define BMI160_MAG_POWER_MODE_MSK UINT8_C(0x03)
CharlesMaxim 21:0b28b9d13164 683
CharlesMaxim 21:0b28b9d13164 684 #define BMI160_ACCEL_POWER_MODE_MSK UINT8_C(0x30)
CharlesMaxim 21:0b28b9d13164 685 #define BMI160_ACCEL_POWER_MODE_POS UINT8_C(4)
CharlesMaxim 21:0b28b9d13164 686
CharlesMaxim 21:0b28b9d13164 687 #define BMI160_GYRO_POWER_MODE_MSK UINT8_C(0x0C)
CharlesMaxim 21:0b28b9d13164 688 #define BMI160_GYRO_POWER_MODE_POS UINT8_C(2)
CharlesMaxim 21:0b28b9d13164 689
CharlesMaxim 21:0b28b9d13164 690
CharlesMaxim 21:0b28b9d13164 691 /* BIT SLICE GET AND SET FUNCTIONS */
CharlesMaxim 21:0b28b9d13164 692 #define BMI160_GET_BITS(regvar, bitname)\
CharlesMaxim 21:0b28b9d13164 693 ((regvar & bitname##_MSK) >> bitname##_POS)
CharlesMaxim 21:0b28b9d13164 694 #define BMI160_SET_BITS(regvar, bitname, val)\
CharlesMaxim 21:0b28b9d13164 695 ((regvar & ~bitname##_MSK) | \
CharlesMaxim 21:0b28b9d13164 696 ((val<<bitname##_POS)&bitname##_MSK))
CharlesMaxim 21:0b28b9d13164 697
CharlesMaxim 21:0b28b9d13164 698 #define BMI160_SET_BITS_POS_0(reg_data, bitname, data) \
CharlesMaxim 21:0b28b9d13164 699 ((reg_data & ~(bitname##_MSK)) | \
CharlesMaxim 21:0b28b9d13164 700 (data & bitname##_MSK))
CharlesMaxim 21:0b28b9d13164 701
CharlesMaxim 21:0b28b9d13164 702 #define BMI160_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
CharlesMaxim 21:0b28b9d13164 703
CharlesMaxim 21:0b28b9d13164 704 /**\name UTILITY MACROS */
CharlesMaxim 21:0b28b9d13164 705 #define BMI160_SET_LOW_BYTE UINT16_C(0x00FF)
CharlesMaxim 21:0b28b9d13164 706 #define BMI160_SET_HIGH_BYTE UINT16_C(0xFF00)
CharlesMaxim 21:0b28b9d13164 707
CharlesMaxim 21:0b28b9d13164 708 #define BMI160_GET_LSB(var) (uint8_t)(var & BMI160_SET_LOW_BYTE)
CharlesMaxim 21:0b28b9d13164 709 #define BMI160_GET_MSB(var) (uint8_t)((var & BMI160_SET_HIGH_BYTE) >> 8)
CharlesMaxim 21:0b28b9d13164 710
CharlesMaxim 21:0b28b9d13164 711 /*****************************************************************************/
CharlesMaxim 21:0b28b9d13164 712 /* type definitions */
CharlesMaxim 21:0b28b9d13164 713 typedef int8_t (*bmi160_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr,
CharlesMaxim 21:0b28b9d13164 714 uint8_t *data, uint16_t len);
CharlesMaxim 21:0b28b9d13164 715
CharlesMaxim 21:0b28b9d13164 716 typedef void (*bmi160_delay_fptr_t)(uint32_t period);
CharlesMaxim 21:0b28b9d13164 717
CharlesMaxim 21:0b28b9d13164 718 /*************************** Data structures *********************************/
CharlesMaxim 21:0b28b9d13164 719
CharlesMaxim 21:0b28b9d13164 720 struct bmi160_pmu_status {
CharlesMaxim 21:0b28b9d13164 721 /*! Power mode status of Accel
CharlesMaxim 21:0b28b9d13164 722 * Possible values :
CharlesMaxim 21:0b28b9d13164 723 * - BMI160_ACCEL_PMU_SUSPEND
CharlesMaxim 21:0b28b9d13164 724 * - BMI160_ACCEL_PMU_NORMAL
CharlesMaxim 21:0b28b9d13164 725 * - BMI160_ACCEL_PMU_LOW_POWER
CharlesMaxim 21:0b28b9d13164 726 */
CharlesMaxim 21:0b28b9d13164 727 uint8_t accel_pmu_status;
CharlesMaxim 21:0b28b9d13164 728 /*! Power mode status of Gyro
CharlesMaxim 21:0b28b9d13164 729 * Possible values :
CharlesMaxim 21:0b28b9d13164 730 * - BMI160_GYRO_PMU_SUSPEND
CharlesMaxim 21:0b28b9d13164 731 * - BMI160_GYRO_PMU_NORMAL
CharlesMaxim 21:0b28b9d13164 732 * - BMI160_GYRO_PMU_FSU
CharlesMaxim 21:0b28b9d13164 733 */
CharlesMaxim 21:0b28b9d13164 734 uint8_t gyro_pmu_status;
CharlesMaxim 21:0b28b9d13164 735 /*! Power mode status of 'Auxiliary sensor interface' whereas the actual
CharlesMaxim 21:0b28b9d13164 736 * power mode of the aux. sensor should be configured
CharlesMaxim 21:0b28b9d13164 737 * according to the connected sensor specifications
CharlesMaxim 21:0b28b9d13164 738 * Possible values :
CharlesMaxim 21:0b28b9d13164 739 * - BMI160_AUX_PMU_SUSPEND
CharlesMaxim 21:0b28b9d13164 740 * - BMI160_AUX_PMU_NORMAL
CharlesMaxim 21:0b28b9d13164 741 * - BMI160_AUX_PMU_LOW_POWER
CharlesMaxim 21:0b28b9d13164 742 */
CharlesMaxim 21:0b28b9d13164 743 uint8_t aux_pmu_status;
CharlesMaxim 21:0b28b9d13164 744 };
CharlesMaxim 21:0b28b9d13164 745 /*!
CharlesMaxim 21:0b28b9d13164 746 * @brief bmi160 interrupt status selection enum.
CharlesMaxim 21:0b28b9d13164 747 */
CharlesMaxim 21:0b28b9d13164 748 enum bmi160_int_status_sel {
CharlesMaxim 21:0b28b9d13164 749 BMI160_INT_STATUS_0 = 1,
CharlesMaxim 21:0b28b9d13164 750 BMI160_INT_STATUS_1 = 2,
CharlesMaxim 21:0b28b9d13164 751 BMI160_INT_STATUS_2 = 4,
CharlesMaxim 21:0b28b9d13164 752 BMI160_INT_STATUS_3 = 8,
CharlesMaxim 21:0b28b9d13164 753 BMI160_INT_STATUS_ALL = 15
CharlesMaxim 21:0b28b9d13164 754 };
CharlesMaxim 21:0b28b9d13164 755
CharlesMaxim 21:0b28b9d13164 756 /*!
CharlesMaxim 21:0b28b9d13164 757 * @brief bmi160 interrupt status bits structure
CharlesMaxim 21:0b28b9d13164 758 */
CharlesMaxim 21:0b28b9d13164 759 struct bmi160_int_status_bits {
CharlesMaxim 21:0b28b9d13164 760 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 761 uint32_t step :1;
CharlesMaxim 21:0b28b9d13164 762 uint32_t sigmot :1;
CharlesMaxim 21:0b28b9d13164 763 uint32_t anym :1;
CharlesMaxim 21:0b28b9d13164 764 /* pmu trigger will be handled later */
CharlesMaxim 21:0b28b9d13164 765 uint32_t pmu_trigger_reserved :1;
CharlesMaxim 21:0b28b9d13164 766 uint32_t d_tap :1;
CharlesMaxim 21:0b28b9d13164 767 uint32_t s_tap :1;
CharlesMaxim 21:0b28b9d13164 768 uint32_t orient :1;
CharlesMaxim 21:0b28b9d13164 769 uint32_t flat_int :1;
CharlesMaxim 21:0b28b9d13164 770 uint32_t reserved :2;
CharlesMaxim 21:0b28b9d13164 771 uint32_t high_g :1;
CharlesMaxim 21:0b28b9d13164 772 uint32_t low_g :1;
CharlesMaxim 21:0b28b9d13164 773 uint32_t drdy :1;
CharlesMaxim 21:0b28b9d13164 774 uint32_t ffull :1;
CharlesMaxim 21:0b28b9d13164 775 uint32_t fwm :1;
CharlesMaxim 21:0b28b9d13164 776 uint32_t nomo :1;
CharlesMaxim 21:0b28b9d13164 777 uint32_t anym_first_x :1;
CharlesMaxim 21:0b28b9d13164 778 uint32_t anym_first_y :1;
CharlesMaxim 21:0b28b9d13164 779 uint32_t anym_first_z :1;
CharlesMaxim 21:0b28b9d13164 780 uint32_t anym_sign :1;
CharlesMaxim 21:0b28b9d13164 781 uint32_t tap_first_x :1;
CharlesMaxim 21:0b28b9d13164 782 uint32_t tap_first_y :1;
CharlesMaxim 21:0b28b9d13164 783 uint32_t tap_first_z :1;
CharlesMaxim 21:0b28b9d13164 784 uint32_t tap_sign :1;
CharlesMaxim 21:0b28b9d13164 785 uint32_t high_first_x :1;
CharlesMaxim 21:0b28b9d13164 786 uint32_t high_first_y :1;
CharlesMaxim 21:0b28b9d13164 787 uint32_t high_first_z :1;
CharlesMaxim 21:0b28b9d13164 788 uint32_t high_sign :1;
CharlesMaxim 21:0b28b9d13164 789 uint32_t orient_1_0 :2;
CharlesMaxim 21:0b28b9d13164 790 uint32_t orient_2 :1;
CharlesMaxim 21:0b28b9d13164 791 uint32_t flat :1;
CharlesMaxim 21:0b28b9d13164 792 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 793 uint32_t high_first_x :1;
CharlesMaxim 21:0b28b9d13164 794 uint32_t high_first_y :1;
CharlesMaxim 21:0b28b9d13164 795 uint32_t high_first_z :1;
CharlesMaxim 21:0b28b9d13164 796 uint32_t high_sign :1;
CharlesMaxim 21:0b28b9d13164 797 uint32_t orient_1_0 :2;
CharlesMaxim 21:0b28b9d13164 798 uint32_t orient_2 :1;
CharlesMaxim 21:0b28b9d13164 799 uint32_t flat :1;
CharlesMaxim 21:0b28b9d13164 800 uint32_t anym_first_x :1;
CharlesMaxim 21:0b28b9d13164 801 uint32_t anym_first_y :1;
CharlesMaxim 21:0b28b9d13164 802 uint32_t anym_first_z :1;
CharlesMaxim 21:0b28b9d13164 803 uint32_t anym_sign :1;
CharlesMaxim 21:0b28b9d13164 804 uint32_t tap_first_x :1;
CharlesMaxim 21:0b28b9d13164 805 uint32_t tap_first_y :1;
CharlesMaxim 21:0b28b9d13164 806 uint32_t tap_first_z :1;
CharlesMaxim 21:0b28b9d13164 807 uint32_t tap_sign :1;
CharlesMaxim 21:0b28b9d13164 808 uint32_t reserved :2;
CharlesMaxim 21:0b28b9d13164 809 uint32_t high_g :1;
CharlesMaxim 21:0b28b9d13164 810 uint32_t low_g :1;
CharlesMaxim 21:0b28b9d13164 811 uint32_t drdy :1;
CharlesMaxim 21:0b28b9d13164 812 uint32_t ffull :1;
CharlesMaxim 21:0b28b9d13164 813 uint32_t fwm :1;
CharlesMaxim 21:0b28b9d13164 814 uint32_t nomo :1;
CharlesMaxim 21:0b28b9d13164 815 uint32_t step :1;
CharlesMaxim 21:0b28b9d13164 816 uint32_t sigmot :1;
CharlesMaxim 21:0b28b9d13164 817 uint32_t anym :1;
CharlesMaxim 21:0b28b9d13164 818 /* pmu trigger will be handled later */
CharlesMaxim 21:0b28b9d13164 819 uint32_t pmu_trigger_reserved :1;
CharlesMaxim 21:0b28b9d13164 820 uint32_t d_tap :1;
CharlesMaxim 21:0b28b9d13164 821 uint32_t s_tap :1;
CharlesMaxim 21:0b28b9d13164 822 uint32_t orient :1;
CharlesMaxim 21:0b28b9d13164 823 uint32_t flat_int :1;
CharlesMaxim 21:0b28b9d13164 824 #endif
CharlesMaxim 21:0b28b9d13164 825 };
CharlesMaxim 21:0b28b9d13164 826
CharlesMaxim 21:0b28b9d13164 827 /*!
CharlesMaxim 21:0b28b9d13164 828 * @brief bmi160 interrupt status structure
CharlesMaxim 21:0b28b9d13164 829 */
CharlesMaxim 21:0b28b9d13164 830 union bmi160_int_status {
CharlesMaxim 21:0b28b9d13164 831 uint8_t data[4];
CharlesMaxim 21:0b28b9d13164 832 struct bmi160_int_status_bits bit;
CharlesMaxim 21:0b28b9d13164 833 };
CharlesMaxim 21:0b28b9d13164 834
CharlesMaxim 21:0b28b9d13164 835 /*!
CharlesMaxim 21:0b28b9d13164 836 * @brief bmi160 sensor data structure which comprises of accel data
CharlesMaxim 21:0b28b9d13164 837 */
CharlesMaxim 21:0b28b9d13164 838 struct bmi160_sensor_data {
CharlesMaxim 21:0b28b9d13164 839 /*! X-axis sensor data */
CharlesMaxim 21:0b28b9d13164 840 int16_t x;
CharlesMaxim 21:0b28b9d13164 841 /*! Y-axis sensor data */
CharlesMaxim 21:0b28b9d13164 842 int16_t y;
CharlesMaxim 21:0b28b9d13164 843 /*! Z-axis sensor data */
CharlesMaxim 21:0b28b9d13164 844 int16_t z;
CharlesMaxim 21:0b28b9d13164 845 /*! sensor time */
CharlesMaxim 21:0b28b9d13164 846 uint32_t sensortime;
CharlesMaxim 21:0b28b9d13164 847 };
CharlesMaxim 21:0b28b9d13164 848
CharlesMaxim 21:0b28b9d13164 849 /*!
CharlesMaxim 21:0b28b9d13164 850 * @brief bmi160 aux data structure which comprises of 8 bytes of accel data
CharlesMaxim 21:0b28b9d13164 851 */
CharlesMaxim 21:0b28b9d13164 852 struct bmi160_aux_data {
CharlesMaxim 21:0b28b9d13164 853 /*! Auxiliary data */
CharlesMaxim 21:0b28b9d13164 854 uint8_t data[8];
CharlesMaxim 21:0b28b9d13164 855 };
CharlesMaxim 21:0b28b9d13164 856
CharlesMaxim 21:0b28b9d13164 857 /*!
CharlesMaxim 21:0b28b9d13164 858 * @brief bmi160 FOC configuration structure
CharlesMaxim 21:0b28b9d13164 859 */
CharlesMaxim 21:0b28b9d13164 860 struct bmi160_foc_conf {
CharlesMaxim 21:0b28b9d13164 861 /*! Enabling FOC in gyro
CharlesMaxim 21:0b28b9d13164 862 * Assignable macros :
CharlesMaxim 21:0b28b9d13164 863 * - BMI160_ENABLE
CharlesMaxim 21:0b28b9d13164 864 * - BMI160_DISABLE
CharlesMaxim 21:0b28b9d13164 865 */
CharlesMaxim 21:0b28b9d13164 866 uint8_t foc_gyr_en;
CharlesMaxim 21:0b28b9d13164 867
CharlesMaxim 21:0b28b9d13164 868 /*! Accel FOC configurations
CharlesMaxim 21:0b28b9d13164 869 * Assignable macros :
CharlesMaxim 21:0b28b9d13164 870 * - BMI160_FOC_ACCEL_DISABLED
CharlesMaxim 21:0b28b9d13164 871 * - BMI160_FOC_ACCEL_POSITIVE_G
CharlesMaxim 21:0b28b9d13164 872 * - BMI160_FOC_ACCEL_NEGATIVE_G
CharlesMaxim 21:0b28b9d13164 873 * - BMI160_FOC_ACCEL_0G
CharlesMaxim 21:0b28b9d13164 874 */
CharlesMaxim 21:0b28b9d13164 875 uint8_t foc_acc_x;
CharlesMaxim 21:0b28b9d13164 876 uint8_t foc_acc_y;
CharlesMaxim 21:0b28b9d13164 877 uint8_t foc_acc_z;
CharlesMaxim 21:0b28b9d13164 878
CharlesMaxim 21:0b28b9d13164 879 /*! Enabling offset compensation for accel in data registers
CharlesMaxim 21:0b28b9d13164 880 * Assignable macros :
CharlesMaxim 21:0b28b9d13164 881 * - BMI160_ENABLE
CharlesMaxim 21:0b28b9d13164 882 * - BMI160_DISABLE
CharlesMaxim 21:0b28b9d13164 883 */
CharlesMaxim 21:0b28b9d13164 884 uint8_t acc_off_en;
CharlesMaxim 21:0b28b9d13164 885
CharlesMaxim 21:0b28b9d13164 886 /*! Enabling offset compensation for gyro in data registers
CharlesMaxim 21:0b28b9d13164 887 * Assignable macros :
CharlesMaxim 21:0b28b9d13164 888 * - BMI160_ENABLE
CharlesMaxim 21:0b28b9d13164 889 * - BMI160_DISABLE
CharlesMaxim 21:0b28b9d13164 890 */
CharlesMaxim 21:0b28b9d13164 891 uint8_t gyro_off_en;
CharlesMaxim 21:0b28b9d13164 892 };
CharlesMaxim 21:0b28b9d13164 893
CharlesMaxim 21:0b28b9d13164 894 /*!
CharlesMaxim 21:0b28b9d13164 895 * @brief bmi160 accel gyro offsets
CharlesMaxim 21:0b28b9d13164 896 */
CharlesMaxim 21:0b28b9d13164 897 struct bmi160_offsets {
CharlesMaxim 21:0b28b9d13164 898 /*! Accel offset for x axis */
CharlesMaxim 21:0b28b9d13164 899 int8_t off_acc_x;
CharlesMaxim 21:0b28b9d13164 900 /*! Accel offset for y axis */
CharlesMaxim 21:0b28b9d13164 901 int8_t off_acc_y;
CharlesMaxim 21:0b28b9d13164 902 /*! Accel offset for z axis */
CharlesMaxim 21:0b28b9d13164 903 int8_t off_acc_z;
CharlesMaxim 21:0b28b9d13164 904 /*! Gyro offset for x axis */
CharlesMaxim 21:0b28b9d13164 905 int16_t off_gyro_x;
CharlesMaxim 21:0b28b9d13164 906 /*! Gyro offset for y axis */
CharlesMaxim 21:0b28b9d13164 907 int16_t off_gyro_y;
CharlesMaxim 21:0b28b9d13164 908 /*! Gyro offset for z axis */
CharlesMaxim 21:0b28b9d13164 909 int16_t off_gyro_z;
CharlesMaxim 21:0b28b9d13164 910 };
CharlesMaxim 21:0b28b9d13164 911
CharlesMaxim 21:0b28b9d13164 912 /*!
CharlesMaxim 21:0b28b9d13164 913 * @brief FIFO aux. sensor data structure
CharlesMaxim 21:0b28b9d13164 914 */
CharlesMaxim 21:0b28b9d13164 915 struct bmi160_aux_fifo_data {
CharlesMaxim 21:0b28b9d13164 916 /*! The value of aux. sensor x LSB data */
CharlesMaxim 21:0b28b9d13164 917 uint8_t aux_x_lsb;
CharlesMaxim 21:0b28b9d13164 918 /*! The value of aux. sensor x MSB data */
CharlesMaxim 21:0b28b9d13164 919 uint8_t aux_x_msb;
CharlesMaxim 21:0b28b9d13164 920 /*! The value of aux. sensor y LSB data */
CharlesMaxim 21:0b28b9d13164 921 uint8_t aux_y_lsb;
CharlesMaxim 21:0b28b9d13164 922 /*! The value of aux. sensor y MSB data */
CharlesMaxim 21:0b28b9d13164 923 uint8_t aux_y_msb;
CharlesMaxim 21:0b28b9d13164 924 /*! The value of aux. sensor z LSB data */
CharlesMaxim 21:0b28b9d13164 925 uint8_t aux_z_lsb;
CharlesMaxim 21:0b28b9d13164 926 /*! The value of aux. sensor z MSB data */
CharlesMaxim 21:0b28b9d13164 927 uint8_t aux_z_msb;
CharlesMaxim 21:0b28b9d13164 928 /*! The value of aux. sensor r for BMM150 LSB data */
CharlesMaxim 21:0b28b9d13164 929 uint8_t aux_r_y2_lsb;
CharlesMaxim 21:0b28b9d13164 930 /*! The value of aux. sensor r for BMM150 MSB data */
CharlesMaxim 21:0b28b9d13164 931 uint8_t aux_r_y2_msb;
CharlesMaxim 21:0b28b9d13164 932 };
CharlesMaxim 21:0b28b9d13164 933
CharlesMaxim 21:0b28b9d13164 934 /*!
CharlesMaxim 21:0b28b9d13164 935 * @brief bmi160 sensor select structure
CharlesMaxim 21:0b28b9d13164 936 */
CharlesMaxim 21:0b28b9d13164 937 enum bmi160_select_sensor {
CharlesMaxim 21:0b28b9d13164 938 BMI160_ACCEL_ONLY = 1,
CharlesMaxim 21:0b28b9d13164 939 BMI160_GYRO_ONLY,
CharlesMaxim 21:0b28b9d13164 940 BMI160_BOTH_ACCEL_AND_GYRO
CharlesMaxim 21:0b28b9d13164 941 };
CharlesMaxim 21:0b28b9d13164 942
CharlesMaxim 21:0b28b9d13164 943 /*!
CharlesMaxim 21:0b28b9d13164 944 * @brief bmi160 sensor step detector mode structure
CharlesMaxim 21:0b28b9d13164 945 */
CharlesMaxim 21:0b28b9d13164 946 enum bmi160_step_detect_mode {
CharlesMaxim 21:0b28b9d13164 947 BMI160_STEP_DETECT_NORMAL,
CharlesMaxim 21:0b28b9d13164 948 BMI160_STEP_DETECT_SENSITIVE,
CharlesMaxim 21:0b28b9d13164 949 BMI160_STEP_DETECT_ROBUST,
CharlesMaxim 21:0b28b9d13164 950 /*! Non recommended User defined setting */
CharlesMaxim 21:0b28b9d13164 951 BMI160_STEP_DETECT_USER_DEFINE
CharlesMaxim 21:0b28b9d13164 952 };
CharlesMaxim 21:0b28b9d13164 953
CharlesMaxim 21:0b28b9d13164 954 /*!
CharlesMaxim 21:0b28b9d13164 955 * @brief enum for auxiliary burst read selection
CharlesMaxim 21:0b28b9d13164 956 */
CharlesMaxim 21:0b28b9d13164 957 enum bm160_aux_read_len {
CharlesMaxim 21:0b28b9d13164 958 BMI160_AUX_READ_LEN_0,
CharlesMaxim 21:0b28b9d13164 959 BMI160_AUX_READ_LEN_1,
CharlesMaxim 21:0b28b9d13164 960 BMI160_AUX_READ_LEN_2,
CharlesMaxim 21:0b28b9d13164 961 BMI160_AUX_READ_LEN_3
CharlesMaxim 21:0b28b9d13164 962 };
CharlesMaxim 21:0b28b9d13164 963 /*!
CharlesMaxim 21:0b28b9d13164 964 * @brief bmi160 sensor configuration structure
CharlesMaxim 21:0b28b9d13164 965 */
CharlesMaxim 21:0b28b9d13164 966 struct bmi160_cfg {
CharlesMaxim 21:0b28b9d13164 967 /*! power mode */
CharlesMaxim 21:0b28b9d13164 968 uint8_t power;
CharlesMaxim 21:0b28b9d13164 969 /*! output data rate */
CharlesMaxim 21:0b28b9d13164 970 uint8_t odr;
CharlesMaxim 21:0b28b9d13164 971 /*! range */
CharlesMaxim 21:0b28b9d13164 972 uint8_t range;
CharlesMaxim 21:0b28b9d13164 973 /*! bandwidth */
CharlesMaxim 21:0b28b9d13164 974 uint8_t bw;
CharlesMaxim 21:0b28b9d13164 975 };
CharlesMaxim 21:0b28b9d13164 976
CharlesMaxim 21:0b28b9d13164 977 /*!
CharlesMaxim 21:0b28b9d13164 978 * @brief Aux sensor configuration structure
CharlesMaxim 21:0b28b9d13164 979 */
CharlesMaxim 21:0b28b9d13164 980 struct bmi160_aux_cfg {
CharlesMaxim 21:0b28b9d13164 981 /*! Aux sensor, 1 - enable 0 - disable */
CharlesMaxim 21:0b28b9d13164 982 uint8_t aux_sensor_enable : 1;
CharlesMaxim 21:0b28b9d13164 983 /*! Aux manual/auto mode status */
CharlesMaxim 21:0b28b9d13164 984 uint8_t manual_enable : 1;
CharlesMaxim 21:0b28b9d13164 985 /*! Aux read burst length */
CharlesMaxim 21:0b28b9d13164 986 uint8_t aux_rd_burst_len : 2;
CharlesMaxim 21:0b28b9d13164 987 /*! output data rate */
CharlesMaxim 21:0b28b9d13164 988 uint8_t aux_odr :4;
CharlesMaxim 21:0b28b9d13164 989 /*! i2c addr of auxiliary sensor */
CharlesMaxim 21:0b28b9d13164 990 uint8_t aux_i2c_addr;
CharlesMaxim 21:0b28b9d13164 991 };
CharlesMaxim 21:0b28b9d13164 992
CharlesMaxim 21:0b28b9d13164 993 /*!
CharlesMaxim 21:0b28b9d13164 994 * @brief bmi160 interrupt channel selection structure
CharlesMaxim 21:0b28b9d13164 995 */
CharlesMaxim 21:0b28b9d13164 996 enum bmi160_int_channel {
CharlesMaxim 21:0b28b9d13164 997 /*! Un-map both channels */
CharlesMaxim 21:0b28b9d13164 998 BMI160_INT_CHANNEL_NONE,
CharlesMaxim 21:0b28b9d13164 999 /*! interrupt Channel 1 */
CharlesMaxim 21:0b28b9d13164 1000 BMI160_INT_CHANNEL_1,
CharlesMaxim 21:0b28b9d13164 1001 /*! interrupt Channel 2 */
CharlesMaxim 21:0b28b9d13164 1002 BMI160_INT_CHANNEL_2,
CharlesMaxim 21:0b28b9d13164 1003 /*! Map both channels */
CharlesMaxim 21:0b28b9d13164 1004 BMI160_INT_CHANNEL_BOTH
CharlesMaxim 21:0b28b9d13164 1005 };
CharlesMaxim 21:0b28b9d13164 1006
CharlesMaxim 21:0b28b9d13164 1007 enum bmi160_int_types {
CharlesMaxim 21:0b28b9d13164 1008 /*! Slope/Any-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1009 BMI160_ACC_ANY_MOTION_INT,
CharlesMaxim 21:0b28b9d13164 1010 /*! Significant motion interrupt */
CharlesMaxim 21:0b28b9d13164 1011 BMI160_ACC_SIG_MOTION_INT,
CharlesMaxim 21:0b28b9d13164 1012 /*! Step detector interrupt */
CharlesMaxim 21:0b28b9d13164 1013 BMI160_STEP_DETECT_INT,
CharlesMaxim 21:0b28b9d13164 1014 /*! double tap interrupt */
CharlesMaxim 21:0b28b9d13164 1015 BMI160_ACC_DOUBLE_TAP_INT,
CharlesMaxim 21:0b28b9d13164 1016 /*! single tap interrupt */
CharlesMaxim 21:0b28b9d13164 1017 BMI160_ACC_SINGLE_TAP_INT,
CharlesMaxim 21:0b28b9d13164 1018 /*! orientation interrupt */
CharlesMaxim 21:0b28b9d13164 1019 BMI160_ACC_ORIENT_INT,
CharlesMaxim 21:0b28b9d13164 1020 /*! flat interrupt */
CharlesMaxim 21:0b28b9d13164 1021 BMI160_ACC_FLAT_INT,
CharlesMaxim 21:0b28b9d13164 1022 /*! high-g interrupt */
CharlesMaxim 21:0b28b9d13164 1023 BMI160_ACC_HIGH_G_INT,
CharlesMaxim 21:0b28b9d13164 1024 /*! low-g interrupt */
CharlesMaxim 21:0b28b9d13164 1025 BMI160_ACC_LOW_G_INT,
CharlesMaxim 21:0b28b9d13164 1026 /*! slow/no-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1027 BMI160_ACC_SLOW_NO_MOTION_INT,
CharlesMaxim 21:0b28b9d13164 1028 /*! data ready interrupt */
CharlesMaxim 21:0b28b9d13164 1029 BMI160_ACC_GYRO_DATA_RDY_INT,
CharlesMaxim 21:0b28b9d13164 1030 /*! fifo full interrupt */
CharlesMaxim 21:0b28b9d13164 1031 BMI160_ACC_GYRO_FIFO_FULL_INT,
CharlesMaxim 21:0b28b9d13164 1032 /*! fifo watermark interrupt */
CharlesMaxim 21:0b28b9d13164 1033 BMI160_ACC_GYRO_FIFO_WATERMARK_INT,
CharlesMaxim 21:0b28b9d13164 1034 /*! fifo tagging feature support */
CharlesMaxim 21:0b28b9d13164 1035 BMI160_FIFO_TAG_INT_PIN
CharlesMaxim 21:0b28b9d13164 1036 };
CharlesMaxim 21:0b28b9d13164 1037
CharlesMaxim 21:0b28b9d13164 1038 /*!
CharlesMaxim 21:0b28b9d13164 1039 * @brief bmi160 active state of any & sig motion interrupt.
CharlesMaxim 21:0b28b9d13164 1040 */
CharlesMaxim 21:0b28b9d13164 1041 enum bmi160_any_sig_motion_active_interrupt_state {
CharlesMaxim 21:0b28b9d13164 1042 /*! Both any & sig motion are disabled */
CharlesMaxim 21:0b28b9d13164 1043 BMI160_BOTH_ANY_SIG_MOTION_DISABLED = -1,
CharlesMaxim 21:0b28b9d13164 1044 /*! Any-motion selected */
CharlesMaxim 21:0b28b9d13164 1045 BMI160_ANY_MOTION_ENABLED,
CharlesMaxim 21:0b28b9d13164 1046 /*! Sig-motion selected */
CharlesMaxim 21:0b28b9d13164 1047 BMI160_SIG_MOTION_ENABLED
CharlesMaxim 21:0b28b9d13164 1048 };
CharlesMaxim 21:0b28b9d13164 1049
CharlesMaxim 21:0b28b9d13164 1050 struct bmi160_acc_tap_int_cfg {
CharlesMaxim 21:0b28b9d13164 1051 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1052 /*! tap threshold */
CharlesMaxim 21:0b28b9d13164 1053 uint16_t tap_thr :5;
CharlesMaxim 21:0b28b9d13164 1054 /*! tap shock */
CharlesMaxim 21:0b28b9d13164 1055 uint16_t tap_shock :1;
CharlesMaxim 21:0b28b9d13164 1056 /*! tap quiet */
CharlesMaxim 21:0b28b9d13164 1057 uint16_t tap_quiet :1;
CharlesMaxim 21:0b28b9d13164 1058 /*! tap duration */
CharlesMaxim 21:0b28b9d13164 1059 uint16_t tap_dur :3;
CharlesMaxim 21:0b28b9d13164 1060 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1061 uint16_t tap_data_src :1;
CharlesMaxim 21:0b28b9d13164 1062 /*! tap enable, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1063 uint16_t tap_en :1;
CharlesMaxim 21:0b28b9d13164 1064 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1065 /*! tap enable, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1066 uint16_t tap_en :1;
CharlesMaxim 21:0b28b9d13164 1067 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1068 uint16_t tap_data_src :1;
CharlesMaxim 21:0b28b9d13164 1069 /*! tap duration */
CharlesMaxim 21:0b28b9d13164 1070 uint16_t tap_dur : 3;
CharlesMaxim 21:0b28b9d13164 1071 /*! tap quiet */
CharlesMaxim 21:0b28b9d13164 1072 uint16_t tap_quiet : 1;
CharlesMaxim 21:0b28b9d13164 1073 /*! tap shock */
CharlesMaxim 21:0b28b9d13164 1074 uint16_t tap_shock : 1;
CharlesMaxim 21:0b28b9d13164 1075 /*! tap threshold */
CharlesMaxim 21:0b28b9d13164 1076 uint16_t tap_thr : 5;
CharlesMaxim 21:0b28b9d13164 1077 #endif
CharlesMaxim 21:0b28b9d13164 1078 };
CharlesMaxim 21:0b28b9d13164 1079
CharlesMaxim 21:0b28b9d13164 1080 struct bmi160_acc_any_mot_int_cfg {
CharlesMaxim 21:0b28b9d13164 1081 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1082 /*! 1 any-motion enable, 0 - any-motion disable */
CharlesMaxim 21:0b28b9d13164 1083 uint8_t anymotion_en :1;
CharlesMaxim 21:0b28b9d13164 1084 /*! slope interrupt x, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1085 uint8_t anymotion_x :1;
CharlesMaxim 21:0b28b9d13164 1086 /*! slope interrupt y, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1087 uint8_t anymotion_y :1;
CharlesMaxim 21:0b28b9d13164 1088 /*! slope interrupt z, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1089 uint8_t anymotion_z :1;
CharlesMaxim 21:0b28b9d13164 1090 /*! slope duration */
CharlesMaxim 21:0b28b9d13164 1091 uint8_t anymotion_dur :2;
CharlesMaxim 21:0b28b9d13164 1092 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1093 uint8_t anymotion_data_src :1;
CharlesMaxim 21:0b28b9d13164 1094 /*! slope threshold */
CharlesMaxim 21:0b28b9d13164 1095 uint8_t anymotion_thr;
CharlesMaxim 21:0b28b9d13164 1096 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1097 /*! slope threshold */
CharlesMaxim 21:0b28b9d13164 1098 uint8_t anymotion_thr;
CharlesMaxim 21:0b28b9d13164 1099 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1100 uint8_t anymotion_data_src :1;
CharlesMaxim 21:0b28b9d13164 1101 /*! slope duration */
CharlesMaxim 21:0b28b9d13164 1102 uint8_t anymotion_dur : 2;
CharlesMaxim 21:0b28b9d13164 1103 /*! slope interrupt z, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1104 uint8_t anymotion_z : 1;
CharlesMaxim 21:0b28b9d13164 1105 /*! slope interrupt y, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1106 uint8_t anymotion_y : 1;
CharlesMaxim 21:0b28b9d13164 1107 /*! slope interrupt x, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1108 uint8_t anymotion_x : 1;
CharlesMaxim 21:0b28b9d13164 1109 /*! 1 any-motion enable, 0 - any-motion disable */
CharlesMaxim 21:0b28b9d13164 1110 uint8_t anymotion_en :1;
CharlesMaxim 21:0b28b9d13164 1111 #endif
CharlesMaxim 21:0b28b9d13164 1112 };
CharlesMaxim 21:0b28b9d13164 1113
CharlesMaxim 21:0b28b9d13164 1114 struct bmi160_acc_sig_mot_int_cfg {
CharlesMaxim 21:0b28b9d13164 1115 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1116 /*! skip time of sig-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1117 uint8_t sig_mot_skip :2;
CharlesMaxim 21:0b28b9d13164 1118 /*! proof time of sig-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1119 uint8_t sig_mot_proof :2;
CharlesMaxim 21:0b28b9d13164 1120 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1121 uint8_t sig_data_src :1;
CharlesMaxim 21:0b28b9d13164 1122 /*! 1 - enable sig, 0 - disable sig & enable anymotion */
CharlesMaxim 21:0b28b9d13164 1123 uint8_t sig_en :1;
CharlesMaxim 21:0b28b9d13164 1124 /*! sig-motion threshold */
CharlesMaxim 21:0b28b9d13164 1125 uint8_t sig_mot_thres;
CharlesMaxim 21:0b28b9d13164 1126 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1127 /*! sig-motion threshold */
CharlesMaxim 21:0b28b9d13164 1128 uint8_t sig_mot_thres;
CharlesMaxim 21:0b28b9d13164 1129 /*! 1 - enable sig, 0 - disable sig & enable anymotion */
CharlesMaxim 21:0b28b9d13164 1130 uint8_t sig_en :1;
CharlesMaxim 21:0b28b9d13164 1131 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1132 uint8_t sig_data_src :1;
CharlesMaxim 21:0b28b9d13164 1133 /*! proof time of sig-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1134 uint8_t sig_mot_proof : 2;
CharlesMaxim 21:0b28b9d13164 1135 /*! skip time of sig-motion interrupt */
CharlesMaxim 21:0b28b9d13164 1136 uint8_t sig_mot_skip : 2;
CharlesMaxim 21:0b28b9d13164 1137 #endif
CharlesMaxim 21:0b28b9d13164 1138 };
CharlesMaxim 21:0b28b9d13164 1139
CharlesMaxim 21:0b28b9d13164 1140 struct bmi160_acc_step_detect_int_cfg {
CharlesMaxim 21:0b28b9d13164 1141 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1142 /*! 1- step detector enable, 0- step detector disable */
CharlesMaxim 21:0b28b9d13164 1143 uint16_t step_detector_en :1;
CharlesMaxim 21:0b28b9d13164 1144 /*! minimum threshold */
CharlesMaxim 21:0b28b9d13164 1145 uint16_t min_threshold :2;
CharlesMaxim 21:0b28b9d13164 1146 /*! minimal detectable step time */
CharlesMaxim 21:0b28b9d13164 1147 uint16_t steptime_min :3;
CharlesMaxim 21:0b28b9d13164 1148 /*! enable step counter mode setting */
CharlesMaxim 21:0b28b9d13164 1149 uint16_t step_detector_mode :2;
CharlesMaxim 21:0b28b9d13164 1150 /*! minimum step buffer size*/
CharlesMaxim 21:0b28b9d13164 1151 uint16_t step_min_buf :3;
CharlesMaxim 21:0b28b9d13164 1152 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1153 /*! minimum step buffer size*/
CharlesMaxim 21:0b28b9d13164 1154 uint16_t step_min_buf :3;
CharlesMaxim 21:0b28b9d13164 1155 /*! enable step counter mode setting */
CharlesMaxim 21:0b28b9d13164 1156 uint16_t step_detector_mode : 2;
CharlesMaxim 21:0b28b9d13164 1157 /*! minimal detectable step time */
CharlesMaxim 21:0b28b9d13164 1158 uint16_t steptime_min : 3;
CharlesMaxim 21:0b28b9d13164 1159 /*! minimum threshold */
CharlesMaxim 21:0b28b9d13164 1160 uint16_t min_threshold : 2;
CharlesMaxim 21:0b28b9d13164 1161 /*! 1- step detector enable, 0- step detector disable */
CharlesMaxim 21:0b28b9d13164 1162 uint16_t step_detector_en :1;
CharlesMaxim 21:0b28b9d13164 1163 #endif
CharlesMaxim 21:0b28b9d13164 1164 };
CharlesMaxim 21:0b28b9d13164 1165
CharlesMaxim 21:0b28b9d13164 1166 struct bmi160_acc_no_motion_int_cfg {
CharlesMaxim 21:0b28b9d13164 1167 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1168 /*! no motion interrupt x */
CharlesMaxim 21:0b28b9d13164 1169 uint16_t no_motion_x :1;
CharlesMaxim 21:0b28b9d13164 1170 /*! no motion interrupt y */
CharlesMaxim 21:0b28b9d13164 1171 uint16_t no_motion_y :1;
CharlesMaxim 21:0b28b9d13164 1172 /*! no motion interrupt z */
CharlesMaxim 21:0b28b9d13164 1173 uint16_t no_motion_z :1;
CharlesMaxim 21:0b28b9d13164 1174 /*! no motion duration */
CharlesMaxim 21:0b28b9d13164 1175 uint16_t no_motion_dur :6;
CharlesMaxim 21:0b28b9d13164 1176 /*! no motion sel , 1 - enable no-motion ,0- enable slow-motion */
CharlesMaxim 21:0b28b9d13164 1177 uint16_t no_motion_sel :1;
CharlesMaxim 21:0b28b9d13164 1178 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1179 uint16_t no_motion_src :1;
CharlesMaxim 21:0b28b9d13164 1180 /*! no motion threshold */
CharlesMaxim 21:0b28b9d13164 1181 uint8_t no_motion_thres;
CharlesMaxim 21:0b28b9d13164 1182 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1183 /*! no motion threshold */
CharlesMaxim 21:0b28b9d13164 1184 uint8_t no_motion_thres;
CharlesMaxim 21:0b28b9d13164 1185 /*! data source 0- filter & 1 pre-filter*/
CharlesMaxim 21:0b28b9d13164 1186 uint16_t no_motion_src :1;
CharlesMaxim 21:0b28b9d13164 1187 /*! no motion sel , 1 - enable no-motion ,0- enable slow-motion */
CharlesMaxim 21:0b28b9d13164 1188 uint16_t no_motion_sel : 1;
CharlesMaxim 21:0b28b9d13164 1189 /*! no motion duration */
CharlesMaxim 21:0b28b9d13164 1190 uint16_t no_motion_dur : 6;
CharlesMaxim 21:0b28b9d13164 1191 /* no motion interrupt z */
CharlesMaxim 21:0b28b9d13164 1192 uint16_t no_motion_z :1;
CharlesMaxim 21:0b28b9d13164 1193 /*! no motion interrupt y */
CharlesMaxim 21:0b28b9d13164 1194 uint16_t no_motion_y :1;
CharlesMaxim 21:0b28b9d13164 1195 /*! no motion interrupt x */
CharlesMaxim 21:0b28b9d13164 1196 uint16_t no_motion_x :1;
CharlesMaxim 21:0b28b9d13164 1197 #endif
CharlesMaxim 21:0b28b9d13164 1198 };
CharlesMaxim 21:0b28b9d13164 1199
CharlesMaxim 21:0b28b9d13164 1200 struct bmi160_acc_orient_int_cfg {
CharlesMaxim 21:0b28b9d13164 1201 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1202 /*! thresholds for switching between the different orientations */
CharlesMaxim 21:0b28b9d13164 1203 uint16_t orient_mode :2;
CharlesMaxim 21:0b28b9d13164 1204 /*! blocking_mode */
CharlesMaxim 21:0b28b9d13164 1205 uint16_t orient_blocking :2;
CharlesMaxim 21:0b28b9d13164 1206 /*! Orientation interrupt hysteresis */
CharlesMaxim 21:0b28b9d13164 1207 uint16_t orient_hyst :4;
CharlesMaxim 21:0b28b9d13164 1208 /*! Orientation interrupt theta */
CharlesMaxim 21:0b28b9d13164 1209 uint16_t orient_theta :6;
CharlesMaxim 21:0b28b9d13164 1210 /*! Enable/disable Orientation interrupt */
CharlesMaxim 21:0b28b9d13164 1211 uint16_t orient_ud_en :1;
CharlesMaxim 21:0b28b9d13164 1212 /*! exchange x- and z-axis in algorithm ,0 - z, 1 - x */
CharlesMaxim 21:0b28b9d13164 1213 uint16_t axes_ex :1;
CharlesMaxim 21:0b28b9d13164 1214 /*! 1 - orient enable, 0 - orient disable */
CharlesMaxim 21:0b28b9d13164 1215 uint8_t orient_en :1;
CharlesMaxim 21:0b28b9d13164 1216 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1217 /*! 1 - orient enable, 0 - orient disable */
CharlesMaxim 21:0b28b9d13164 1218 uint8_t orient_en :1;
CharlesMaxim 21:0b28b9d13164 1219 /*! exchange x- and z-axis in algorithm ,0 - z, 1 - x */
CharlesMaxim 21:0b28b9d13164 1220 uint16_t axes_ex : 1;
CharlesMaxim 21:0b28b9d13164 1221 /*! Enable/disable Orientation interrupt */
CharlesMaxim 21:0b28b9d13164 1222 uint16_t orient_ud_en : 1;
CharlesMaxim 21:0b28b9d13164 1223 /*! Orientation interrupt theta */
CharlesMaxim 21:0b28b9d13164 1224 uint16_t orient_theta : 6;
CharlesMaxim 21:0b28b9d13164 1225 /*! Orientation interrupt hysteresis */
CharlesMaxim 21:0b28b9d13164 1226 uint16_t orient_hyst : 4;
CharlesMaxim 21:0b28b9d13164 1227 /*! blocking_mode */
CharlesMaxim 21:0b28b9d13164 1228 uint16_t orient_blocking : 2;
CharlesMaxim 21:0b28b9d13164 1229 /*! thresholds for switching between the different orientations */
CharlesMaxim 21:0b28b9d13164 1230 uint16_t orient_mode : 2;
CharlesMaxim 21:0b28b9d13164 1231 #endif
CharlesMaxim 21:0b28b9d13164 1232 };
CharlesMaxim 21:0b28b9d13164 1233
CharlesMaxim 21:0b28b9d13164 1234 struct bmi160_acc_flat_detect_int_cfg {
CharlesMaxim 21:0b28b9d13164 1235 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1236 /*! flat threshold */
CharlesMaxim 21:0b28b9d13164 1237 uint16_t flat_theta :6;
CharlesMaxim 21:0b28b9d13164 1238 /*! flat interrupt hysteresis */
CharlesMaxim 21:0b28b9d13164 1239 uint16_t flat_hy :3;
CharlesMaxim 21:0b28b9d13164 1240 /*! delay time for which the flat value must remain stable for the
CharlesMaxim 21:0b28b9d13164 1241 * flat interrupt to be generated */
CharlesMaxim 21:0b28b9d13164 1242 uint16_t flat_hold_time :2;
CharlesMaxim 21:0b28b9d13164 1243 /*! 1 - flat enable, 0 - flat disable */
CharlesMaxim 21:0b28b9d13164 1244 uint16_t flat_en :1;
CharlesMaxim 21:0b28b9d13164 1245 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1246 /*! 1 - flat enable, 0 - flat disable */
CharlesMaxim 21:0b28b9d13164 1247 uint16_t flat_en :1;
CharlesMaxim 21:0b28b9d13164 1248 /*! delay time for which the flat value must remain stable for the
CharlesMaxim 21:0b28b9d13164 1249 * flat interrupt to be generated */
CharlesMaxim 21:0b28b9d13164 1250 uint16_t flat_hold_time : 2;
CharlesMaxim 21:0b28b9d13164 1251 /*! flat interrupt hysteresis */
CharlesMaxim 21:0b28b9d13164 1252 uint16_t flat_hy : 3;
CharlesMaxim 21:0b28b9d13164 1253 /*! flat threshold */
CharlesMaxim 21:0b28b9d13164 1254 uint16_t flat_theta : 6;
CharlesMaxim 21:0b28b9d13164 1255 #endif
CharlesMaxim 21:0b28b9d13164 1256 };
CharlesMaxim 21:0b28b9d13164 1257
CharlesMaxim 21:0b28b9d13164 1258 struct bmi160_acc_low_g_int_cfg {
CharlesMaxim 21:0b28b9d13164 1259 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1260 /*! low-g interrupt trigger delay */
CharlesMaxim 21:0b28b9d13164 1261 uint8_t low_dur;
CharlesMaxim 21:0b28b9d13164 1262 /*! low-g interrupt trigger threshold */
CharlesMaxim 21:0b28b9d13164 1263 uint8_t low_thres;
CharlesMaxim 21:0b28b9d13164 1264 /*! hysteresis of low-g interrupt */
CharlesMaxim 21:0b28b9d13164 1265 uint8_t low_hyst :2;
CharlesMaxim 21:0b28b9d13164 1266 /*! 0 - single-axis mode ,1 - axis-summing mode */
CharlesMaxim 21:0b28b9d13164 1267 uint8_t low_mode :1;
CharlesMaxim 21:0b28b9d13164 1268 /*! data source 0- filter & 1 pre-filter */
CharlesMaxim 21:0b28b9d13164 1269 uint8_t low_data_src :1;
CharlesMaxim 21:0b28b9d13164 1270 /*! 1 - enable low-g, 0 - disable low-g */
CharlesMaxim 21:0b28b9d13164 1271 uint8_t low_en :1;
CharlesMaxim 21:0b28b9d13164 1272 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1273 /*! 1 - enable low-g, 0 - disable low-g */
CharlesMaxim 21:0b28b9d13164 1274 uint8_t low_en :1;
CharlesMaxim 21:0b28b9d13164 1275 /*! data source 0- filter & 1 pre-filter */
CharlesMaxim 21:0b28b9d13164 1276 uint8_t low_data_src :1;
CharlesMaxim 21:0b28b9d13164 1277 /*! 0 - single-axis mode ,1 - axis-summing mode */
CharlesMaxim 21:0b28b9d13164 1278 uint8_t low_mode : 1;
CharlesMaxim 21:0b28b9d13164 1279 /*! hysteresis of low-g interrupt */
CharlesMaxim 21:0b28b9d13164 1280 uint8_t low_hyst : 2;
CharlesMaxim 21:0b28b9d13164 1281 /*! low-g interrupt trigger threshold */
CharlesMaxim 21:0b28b9d13164 1282 uint8_t low_thres;
CharlesMaxim 21:0b28b9d13164 1283 /*! low-g interrupt trigger delay */
CharlesMaxim 21:0b28b9d13164 1284 uint8_t low_dur;
CharlesMaxim 21:0b28b9d13164 1285 #endif
CharlesMaxim 21:0b28b9d13164 1286 };
CharlesMaxim 21:0b28b9d13164 1287
CharlesMaxim 21:0b28b9d13164 1288 struct bmi160_acc_high_g_int_cfg {
CharlesMaxim 21:0b28b9d13164 1289 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1290 /*! High-g interrupt x, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1291 uint8_t high_g_x :1;
CharlesMaxim 21:0b28b9d13164 1292 /*! High-g interrupt y, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1293 uint8_t high_g_y :1;
CharlesMaxim 21:0b28b9d13164 1294 /*! High-g interrupt z, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1295 uint8_t high_g_z :1;
CharlesMaxim 21:0b28b9d13164 1296 /*! High-g hysteresis */
CharlesMaxim 21:0b28b9d13164 1297 uint8_t high_hy :2;
CharlesMaxim 21:0b28b9d13164 1298 /*! data source 0- filter & 1 pre-filter */
CharlesMaxim 21:0b28b9d13164 1299 uint8_t high_data_src :1;
CharlesMaxim 21:0b28b9d13164 1300 /*! High-g threshold */
CharlesMaxim 21:0b28b9d13164 1301 uint8_t high_thres;
CharlesMaxim 21:0b28b9d13164 1302 /*! High-g duration */
CharlesMaxim 21:0b28b9d13164 1303 uint8_t high_dur;
CharlesMaxim 21:0b28b9d13164 1304 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1305 /*! High-g duration */
CharlesMaxim 21:0b28b9d13164 1306 uint8_t high_dur;
CharlesMaxim 21:0b28b9d13164 1307 /*! High-g threshold */
CharlesMaxim 21:0b28b9d13164 1308 uint8_t high_thres;
CharlesMaxim 21:0b28b9d13164 1309 /*! data source 0- filter & 1 pre-filter */
CharlesMaxim 21:0b28b9d13164 1310 uint8_t high_data_src :1;
CharlesMaxim 21:0b28b9d13164 1311 /*! High-g hysteresis */
CharlesMaxim 21:0b28b9d13164 1312 uint8_t high_hy : 2;
CharlesMaxim 21:0b28b9d13164 1313 /*! High-g interrupt z, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1314 uint8_t high_g_z : 1;
CharlesMaxim 21:0b28b9d13164 1315 /*! High-g interrupt y, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1316 uint8_t high_g_y : 1;
CharlesMaxim 21:0b28b9d13164 1317 /*! High-g interrupt x, 1 - enable, 0 - disable */
CharlesMaxim 21:0b28b9d13164 1318 uint8_t high_g_x : 1;
CharlesMaxim 21:0b28b9d13164 1319 #endif
CharlesMaxim 21:0b28b9d13164 1320 };
CharlesMaxim 21:0b28b9d13164 1321
CharlesMaxim 21:0b28b9d13164 1322 struct bmi160_int_pin_settg {
CharlesMaxim 21:0b28b9d13164 1323 #if LITTLE_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1324 /*! To enable either INT1 or INT2 pin as output.
CharlesMaxim 21:0b28b9d13164 1325 * 0- output disabled ,1- output enabled */
CharlesMaxim 21:0b28b9d13164 1326 uint16_t output_en :1;
CharlesMaxim 21:0b28b9d13164 1327 /*! 0 - push-pull 1- open drain,only valid if output_en is set 1 */
CharlesMaxim 21:0b28b9d13164 1328 uint16_t output_mode :1;
CharlesMaxim 21:0b28b9d13164 1329 /*! 0 - active low , 1 - active high level.
CharlesMaxim 21:0b28b9d13164 1330 * if output_en is 1,this applies to interrupts,else PMU_trigger */
CharlesMaxim 21:0b28b9d13164 1331 uint16_t output_type :1;
CharlesMaxim 21:0b28b9d13164 1332 /*! 0 - level trigger , 1 - edge trigger */
CharlesMaxim 21:0b28b9d13164 1333 uint16_t edge_ctrl :1;
CharlesMaxim 21:0b28b9d13164 1334 /*! To enable either INT1 or INT2 pin as input.
CharlesMaxim 21:0b28b9d13164 1335 * 0 - input disabled ,1 - input enabled */
CharlesMaxim 21:0b28b9d13164 1336 uint16_t input_en :1;
CharlesMaxim 21:0b28b9d13164 1337 /*! latch duration*/
CharlesMaxim 21:0b28b9d13164 1338 uint16_t latch_dur :4;
CharlesMaxim 21:0b28b9d13164 1339 #elif BIG_ENDIAN == 1
CharlesMaxim 21:0b28b9d13164 1340 /*! latch duration*/
CharlesMaxim 21:0b28b9d13164 1341 uint16_t latch_dur : 4;
CharlesMaxim 21:0b28b9d13164 1342 /*! Latched,non-latched or temporary interrupt modes */
CharlesMaxim 21:0b28b9d13164 1343 uint16_t input_en : 1;
CharlesMaxim 21:0b28b9d13164 1344 /*! 1 - edge trigger, 0 - level trigger */
CharlesMaxim 21:0b28b9d13164 1345 uint16_t edge_ctrl : 1;
CharlesMaxim 21:0b28b9d13164 1346 /*! 0 - active low , 1 - active high level.
CharlesMaxim 21:0b28b9d13164 1347 * if output_en is 1,this applies to interrupts,else PMU_trigger */
CharlesMaxim 21:0b28b9d13164 1348 uint16_t output_type : 1;
CharlesMaxim 21:0b28b9d13164 1349 /*! 0 - push-pull , 1 - open drain,only valid if output_en is set 1 */
CharlesMaxim 21:0b28b9d13164 1350 uint16_t output_mode : 1;
CharlesMaxim 21:0b28b9d13164 1351 /*! To enable either INT1 or INT2 pin as output.
CharlesMaxim 21:0b28b9d13164 1352 * 0 - output disabled , 1 - output enabled */
CharlesMaxim 21:0b28b9d13164 1353 uint16_t output_en : 1;
CharlesMaxim 21:0b28b9d13164 1354 #endif
CharlesMaxim 21:0b28b9d13164 1355 };
CharlesMaxim 21:0b28b9d13164 1356
CharlesMaxim 21:0b28b9d13164 1357 union bmi160_int_type_cfg {
CharlesMaxim 21:0b28b9d13164 1358 /*! Tap interrupt structure */
CharlesMaxim 21:0b28b9d13164 1359 struct bmi160_acc_tap_int_cfg acc_tap_int;
CharlesMaxim 21:0b28b9d13164 1360 /*! Slope interrupt structure */
CharlesMaxim 21:0b28b9d13164 1361 struct bmi160_acc_any_mot_int_cfg acc_any_motion_int;
CharlesMaxim 21:0b28b9d13164 1362 /*! Significant motion interrupt structure */
CharlesMaxim 21:0b28b9d13164 1363 struct bmi160_acc_sig_mot_int_cfg acc_sig_motion_int;
CharlesMaxim 21:0b28b9d13164 1364 /*! Step detector interrupt structure */
CharlesMaxim 21:0b28b9d13164 1365 struct bmi160_acc_step_detect_int_cfg acc_step_detect_int;
CharlesMaxim 21:0b28b9d13164 1366 /*! No motion interrupt structure */
CharlesMaxim 21:0b28b9d13164 1367 struct bmi160_acc_no_motion_int_cfg acc_no_motion_int;
CharlesMaxim 21:0b28b9d13164 1368 /*! Orientation interrupt structure */
CharlesMaxim 21:0b28b9d13164 1369 struct bmi160_acc_orient_int_cfg acc_orient_int;
CharlesMaxim 21:0b28b9d13164 1370 /*! Flat interrupt structure */
CharlesMaxim 21:0b28b9d13164 1371 struct bmi160_acc_flat_detect_int_cfg acc_flat_int;
CharlesMaxim 21:0b28b9d13164 1372 /*! Low-g interrupt structure */
CharlesMaxim 21:0b28b9d13164 1373 struct bmi160_acc_low_g_int_cfg acc_low_g_int;
CharlesMaxim 21:0b28b9d13164 1374 /*! High-g interrupt structure */
CharlesMaxim 21:0b28b9d13164 1375 struct bmi160_acc_high_g_int_cfg acc_high_g_int;
CharlesMaxim 21:0b28b9d13164 1376 };
CharlesMaxim 21:0b28b9d13164 1377
CharlesMaxim 21:0b28b9d13164 1378 struct bmi160_int_settg {
CharlesMaxim 21:0b28b9d13164 1379 /*! Interrupt channel */
CharlesMaxim 21:0b28b9d13164 1380 enum bmi160_int_channel int_channel;
CharlesMaxim 21:0b28b9d13164 1381 /*! Select Interrupt */
CharlesMaxim 21:0b28b9d13164 1382 enum bmi160_int_types int_type;
CharlesMaxim 21:0b28b9d13164 1383 /*! Structure configuring Interrupt pins */
CharlesMaxim 21:0b28b9d13164 1384 struct bmi160_int_pin_settg int_pin_settg;
CharlesMaxim 21:0b28b9d13164 1385 /*! Union configures required interrupt */
CharlesMaxim 21:0b28b9d13164 1386 union bmi160_int_type_cfg int_type_cfg;
CharlesMaxim 21:0b28b9d13164 1387 /*! FIFO FULL INT 1-enable, 0-disable */
CharlesMaxim 21:0b28b9d13164 1388 uint8_t fifo_full_int_en :1;
CharlesMaxim 21:0b28b9d13164 1389 /*! FIFO WTM INT 1-enable, 0-disable */
CharlesMaxim 21:0b28b9d13164 1390 uint8_t fifo_WTM_int_en :1;
CharlesMaxim 21:0b28b9d13164 1391 };
CharlesMaxim 21:0b28b9d13164 1392
CharlesMaxim 21:0b28b9d13164 1393 /*!
CharlesMaxim 21:0b28b9d13164 1394 * @brief This structure holds the information for usage of
CharlesMaxim 21:0b28b9d13164 1395 * FIFO by the user.
CharlesMaxim 21:0b28b9d13164 1396 */
CharlesMaxim 21:0b28b9d13164 1397 struct bmi160_fifo_frame {
CharlesMaxim 21:0b28b9d13164 1398 /*! Data buffer of user defined length is to be mapped here */
CharlesMaxim 21:0b28b9d13164 1399 uint8_t *data;
CharlesMaxim 21:0b28b9d13164 1400 /*! While calling the API "bmi160_get_fifo_data" , length stores
CharlesMaxim 21:0b28b9d13164 1401 * number of bytes in FIFO to be read (specified by user as input)
CharlesMaxim 21:0b28b9d13164 1402 * and after execution of the API ,number of FIFO data bytes
CharlesMaxim 21:0b28b9d13164 1403 * available is provided as an output to user
CharlesMaxim 21:0b28b9d13164 1404 */
CharlesMaxim 21:0b28b9d13164 1405 uint16_t length;
CharlesMaxim 21:0b28b9d13164 1406 /*! FIFO time enable */
CharlesMaxim 21:0b28b9d13164 1407 uint8_t fifo_time_enable;
CharlesMaxim 21:0b28b9d13164 1408 /*! Enabling of the FIFO header to stream in header mode */
CharlesMaxim 21:0b28b9d13164 1409 uint8_t fifo_header_enable;
CharlesMaxim 21:0b28b9d13164 1410 /*! Streaming of the Accelerometer, Gyroscope
CharlesMaxim 21:0b28b9d13164 1411 sensor data or both in FIFO */
CharlesMaxim 21:0b28b9d13164 1412 uint8_t fifo_data_enable;
CharlesMaxim 21:0b28b9d13164 1413 /*! Will be equal to length when no more frames are there to parse */
CharlesMaxim 21:0b28b9d13164 1414 uint16_t accel_byte_start_idx;
CharlesMaxim 21:0b28b9d13164 1415 /*! Will be equal to length when no more frames are there to parse */
CharlesMaxim 21:0b28b9d13164 1416 uint16_t gyro_byte_start_idx;
CharlesMaxim 21:0b28b9d13164 1417 /*! Will be equal to length when no more frames are there to parse */
CharlesMaxim 21:0b28b9d13164 1418 uint16_t aux_byte_start_idx;
CharlesMaxim 21:0b28b9d13164 1419 /*! Value of FIFO sensor time time */
CharlesMaxim 21:0b28b9d13164 1420 uint32_t sensor_time;
CharlesMaxim 21:0b28b9d13164 1421 /*! Value of Skipped frame counts */
CharlesMaxim 21:0b28b9d13164 1422 uint8_t skipped_frame_count;
CharlesMaxim 21:0b28b9d13164 1423 };
CharlesMaxim 21:0b28b9d13164 1424
CharlesMaxim 21:0b28b9d13164 1425 struct bmi160_dev {
CharlesMaxim 21:0b28b9d13164 1426 /*! Chip Id */
CharlesMaxim 21:0b28b9d13164 1427 uint8_t chip_id;
CharlesMaxim 21:0b28b9d13164 1428 /*! Device Id */
CharlesMaxim 21:0b28b9d13164 1429 uint8_t id;
CharlesMaxim 21:0b28b9d13164 1430 /*! 0 - I2C , 1 - SPI Interface */
CharlesMaxim 21:0b28b9d13164 1431 uint8_t interface;
CharlesMaxim 21:0b28b9d13164 1432 /*! Hold active interrupts status for any and sig motion
CharlesMaxim 21:0b28b9d13164 1433 * 0 - Any-motion enable, 1 - Sig-motion enable,
CharlesMaxim 21:0b28b9d13164 1434 * -1 neither any-motion nor sig-motion selected */
CharlesMaxim 21:0b28b9d13164 1435 enum bmi160_any_sig_motion_active_interrupt_state any_sig_sel;
CharlesMaxim 21:0b28b9d13164 1436 /*! Structure to configure Accel sensor */
CharlesMaxim 21:0b28b9d13164 1437 struct bmi160_cfg accel_cfg;
CharlesMaxim 21:0b28b9d13164 1438 /*! Structure to hold previous/old accel config parameters.
CharlesMaxim 21:0b28b9d13164 1439 * This is used at driver level to prevent overwriting of same
CharlesMaxim 21:0b28b9d13164 1440 * data, hence user does not change it in the code */
CharlesMaxim 21:0b28b9d13164 1441 struct bmi160_cfg prev_accel_cfg;
CharlesMaxim 21:0b28b9d13164 1442 /*! Structure to configure Gyro sensor */
CharlesMaxim 21:0b28b9d13164 1443 struct bmi160_cfg gyro_cfg;
CharlesMaxim 21:0b28b9d13164 1444 /*! Structure to hold previous/old gyro config parameters.
CharlesMaxim 21:0b28b9d13164 1445 * This is used at driver level to prevent overwriting of same
CharlesMaxim 21:0b28b9d13164 1446 * data, hence user does not change it in the code */
CharlesMaxim 21:0b28b9d13164 1447 struct bmi160_cfg prev_gyro_cfg;
CharlesMaxim 21:0b28b9d13164 1448 /*! Structure to configure the auxiliary sensor */
CharlesMaxim 21:0b28b9d13164 1449 struct bmi160_aux_cfg aux_cfg;
CharlesMaxim 21:0b28b9d13164 1450 /*! Structure to hold previous/old aux config parameters.
CharlesMaxim 21:0b28b9d13164 1451 * This is used at driver level to prevent overwriting of same
CharlesMaxim 21:0b28b9d13164 1452 * data, hence user does not change it in the code */
CharlesMaxim 21:0b28b9d13164 1453 struct bmi160_aux_cfg prev_aux_cfg;
CharlesMaxim 21:0b28b9d13164 1454 /*! FIFO related configurations */
CharlesMaxim 21:0b28b9d13164 1455 struct bmi160_fifo_frame *fifo;
CharlesMaxim 21:0b28b9d13164 1456 /*! Read function pointer */
CharlesMaxim 21:0b28b9d13164 1457 bmi160_com_fptr_t read;
CharlesMaxim 21:0b28b9d13164 1458 /*! Write function pointer */
CharlesMaxim 21:0b28b9d13164 1459 bmi160_com_fptr_t write;
CharlesMaxim 21:0b28b9d13164 1460 /*! Delay function pointer */
CharlesMaxim 21:0b28b9d13164 1461 bmi160_delay_fptr_t delay_ms;
CharlesMaxim 21:0b28b9d13164 1462 };
CharlesMaxim 21:0b28b9d13164 1463
CharlesMaxim 21:0b28b9d13164 1464
CharlesMaxim 21:0b28b9d13164 1465 #endif /* BMI160_DEFS_H_ */