My implementation of Bosh BMI160 Only I2C is tested so far.

Dependents:   test_BMI160 TFT_test_MAX32630FTHR

Committer:
Rhyme
Date:
Tue Sep 12 00:52:49 2017 +0000
Revision:
4:93f16677f730
Parent:
3:9d3079170b35
documents addded

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:9aed6f5a35c0 1 #include "mbed.h"
Rhyme 0:9aed6f5a35c0 2 #include "BMI160.h"
Rhyme 0:9aed6f5a35c0 3
Rhyme 0:9aed6f5a35c0 4 /* register address defintions */
Rhyme 0:9aed6f5a35c0 5 #define REG_CHIP_ID 0x00 /* chip id */
Rhyme 0:9aed6f5a35c0 6 #define REG_ERR_REG 0x02
Rhyme 0:9aed6f5a35c0 7 #define REG_PMU_STATUS 0x03
Rhyme 0:9aed6f5a35c0 8 #define REG_DATA_0 0x04 /* MAG_X_LSB */
Rhyme 0:9aed6f5a35c0 9 #define REG_DATA_1 0x05 /* MAG_X_MSB */
Rhyme 0:9aed6f5a35c0 10 #define REG_DATA_2 0x06 /* MAG_Y_LSB */
Rhyme 0:9aed6f5a35c0 11 #define REG_DATA_3 0x07 /* MAG_Y_MSB */
Rhyme 0:9aed6f5a35c0 12 #define REG_DATA_4 0x08 /* MAG_Z_LSB */
Rhyme 0:9aed6f5a35c0 13 #define REG_DATA_5 0x09 /* MAG_Z_MSB */
Rhyme 0:9aed6f5a35c0 14 #define REG_DATA_6 0x0A /* RHALL_LSB */
Rhyme 0:9aed6f5a35c0 15 #define REG_DATA_7 0x0B /* RHALL_MSB */
Rhyme 0:9aed6f5a35c0 16 #define REG_DATA_8 0x0C /* GRY_X_LSB */
Rhyme 0:9aed6f5a35c0 17 #define REG_DATA_9 0x0D /* GRY_X_MSB */
Rhyme 0:9aed6f5a35c0 18 #define REG_DATA_10 0x0E /* GRY_Y_LSB */
Rhyme 0:9aed6f5a35c0 19 #define REG_DATA_11 0x0F /* GRY_Y_MSB */
Rhyme 0:9aed6f5a35c0 20 #define REG_DATA_12 0x10 /* GRY_Z_LSB */
Rhyme 0:9aed6f5a35c0 21 #define REG_DATA_13 0x11 /* GRY_Z_MSB */
Rhyme 0:9aed6f5a35c0 22 #define REG_DATA_14 0x12 /* ACC_X_LSB */
Rhyme 0:9aed6f5a35c0 23 #define REG_DATA_15 0x13 /* ACC_X_MSB */
Rhyme 0:9aed6f5a35c0 24 #define REG_DATA_16 0x14 /* ACC_Y_LSB */
Rhyme 0:9aed6f5a35c0 25 #define REG_DATA_17 0x15 /* ACC_Y_MSB */
Rhyme 0:9aed6f5a35c0 26 #define REG_DATA_18 0x16 /* ACC_Z_LSB */
Rhyme 0:9aed6f5a35c0 27 #define REG_DATA_19 0x17 /* ACC_Z_MSB */
Rhyme 0:9aed6f5a35c0 28 #define REG_SENSORTIME_0 0x18 /* SENSOR_TIME_LSB */
Rhyme 0:9aed6f5a35c0 29 #define REG_SENSORTIME_1 0x19 /* SENSOR_TIME_CSB */
Rhyme 0:9aed6f5a35c0 30 #define REG_SENSORTIME_2 0x1A /* SENSOR_TIME_MSB */
Rhyme 0:9aed6f5a35c0 31 #define REG_STATUS 0x1B
Rhyme 0:9aed6f5a35c0 32 #define REG_INT_STATUS_0 0x1C
Rhyme 0:9aed6f5a35c0 33 #define REG_INT_STATUS_1 0x1D
Rhyme 0:9aed6f5a35c0 34 #define REG_INT_STATUS_2 0x1E
Rhyme 0:9aed6f5a35c0 35 #define REG_INT_STATUS_3 0x1F
Rhyme 0:9aed6f5a35c0 36 #define REG_TEMPERATURE_0 0x20
Rhyme 0:9aed6f5a35c0 37 #define REG_TEMPERATURE_1 0x21
Rhyme 0:9aed6f5a35c0 38 #define REG_FIFO_LENGTH_0 0x22
Rhyme 0:9aed6f5a35c0 39 #define REG_FIFO_LENGTH_1 0x23
Rhyme 0:9aed6f5a35c0 40 #define REG_FIFO_DATA 0x24
Rhyme 0:9aed6f5a35c0 41 #define REG_ACC_CONF 0x40
Rhyme 0:9aed6f5a35c0 42 #define REG_ACC_RANGE 0x41
Rhyme 0:9aed6f5a35c0 43 #define REG_GYR_CONF 0x42
Rhyme 0:9aed6f5a35c0 44 #define REG_GYR_RANGE 0x43
Rhyme 0:9aed6f5a35c0 45 #define REG_MAG_CONF 0x44
Rhyme 0:9aed6f5a35c0 46 #define REG_FIFO_DOWNS 0x45
Rhyme 0:9aed6f5a35c0 47 #define REG_FIFO_CONFIG_0 0x46
Rhyme 0:9aed6f5a35c0 48 #define REG_FIFO_CONFIG_1 0x47
Rhyme 0:9aed6f5a35c0 49 #define REG_MAG_IF_0 0x4B
Rhyme 0:9aed6f5a35c0 50 #define REG_MAG_IF_1 0x4C
Rhyme 0:9aed6f5a35c0 51 #define REG_MAG_IF_2 0x4D
Rhyme 0:9aed6f5a35c0 52 #define REG_MAG_IF_3 0x4E
Rhyme 0:9aed6f5a35c0 53 #define REG_MAG_IF_4 0x4F
Rhyme 0:9aed6f5a35c0 54 #define REG_INT_EN_0 0x50
Rhyme 0:9aed6f5a35c0 55 #define REG_INT_EN_1 0x51
Rhyme 0:9aed6f5a35c0 56 #define REG_INT_EN_2 0x52
Rhyme 0:9aed6f5a35c0 57 #define REG_INT_OUT_CTRL 0x53
Rhyme 0:9aed6f5a35c0 58 #define REG_INT_LATCH 0x54
Rhyme 0:9aed6f5a35c0 59 #define REG_INT_MAP_0 0x55
Rhyme 0:9aed6f5a35c0 60 #define REG_INT_MAP_1 0x56
Rhyme 0:9aed6f5a35c0 61 #define REG_INT_MAP_2 0x57
Rhyme 0:9aed6f5a35c0 62 #define REG_INT_DATA_0 0x58
Rhyme 0:9aed6f5a35c0 63 #define REG_INT_DATA_1 0x59
Rhyme 0:9aed6f5a35c0 64 #define REG_LOWHIGHT_0 0x5A
Rhyme 0:9aed6f5a35c0 65 #define REG_LOWHIGHT_1 0x5B
Rhyme 0:9aed6f5a35c0 66 #define REG_LOWHIGHT_2 0x5C
Rhyme 0:9aed6f5a35c0 67 #define REG_LOWHIGHT_3 0x5D
Rhyme 0:9aed6f5a35c0 68 #define REG_LOWHIGHT_4 0x5E
Rhyme 0:9aed6f5a35c0 69 #define REG_INT_MOTION_0 0x5F
Rhyme 0:9aed6f5a35c0 70 #define REG_INT_MOTION_1 0x60
Rhyme 0:9aed6f5a35c0 71 #define REG_INT_MOTION_2 0x61
Rhyme 0:9aed6f5a35c0 72 #define REG_INT_MOTION_3 0x62
Rhyme 0:9aed6f5a35c0 73 #define REG_INT_TAP_0 0x63
Rhyme 0:9aed6f5a35c0 74 #define REG_INT_TAP_1 0x64
Rhyme 0:9aed6f5a35c0 75 #define REG_INT_ORIENT_0 0x65
Rhyme 0:9aed6f5a35c0 76 #define REG_INT_ORIENT_1 0x66
Rhyme 0:9aed6f5a35c0 77 #define REG_INT_FLAT_0 0x67
Rhyme 0:9aed6f5a35c0 78 #define REG_INT_FLAT_1 0x68
Rhyme 0:9aed6f5a35c0 79 #define REG_FOC_CONF 0x69
Rhyme 0:9aed6f5a35c0 80 #define REG_CONF 0x6A
Rhyme 0:9aed6f5a35c0 81 #define REG_IF_CONF 0x6B
Rhyme 0:9aed6f5a35c0 82 #define REG_PMU_TRIGGER 0x6C
Rhyme 0:9aed6f5a35c0 83 #define REG_SELF_TEST 0x6D
Rhyme 0:9aed6f5a35c0 84 #define REG_NV_CONF 0x70
Rhyme 0:9aed6f5a35c0 85 #define REG_OFFSET_0 0x71
Rhyme 0:9aed6f5a35c0 86 #define REG_OFFSET_1 0x72
Rhyme 0:9aed6f5a35c0 87 #define REG_OFFSET_2 0x73
Rhyme 0:9aed6f5a35c0 88 #define REG_OFFSET_3 0x74
Rhyme 0:9aed6f5a35c0 89 #define REG_OFFSET_4 0x75
Rhyme 0:9aed6f5a35c0 90 #define REG_OFFSET_5 0x76
Rhyme 0:9aed6f5a35c0 91 #define REG_OFFSET_6 0x77
Rhyme 0:9aed6f5a35c0 92 #define REG_STEP_CNT_0 0x78
Rhyme 0:9aed6f5a35c0 93 #define REG_STEP_CNT_1 0x79
Rhyme 0:9aed6f5a35c0 94 #define REG_STEP_CONF_0 0x7A
Rhyme 0:9aed6f5a35c0 95 #define REG_STEP_CONF_1 0x7B
Rhyme 0:9aed6f5a35c0 96 #define REG_CMD 0x7E
Rhyme 0:9aed6f5a35c0 97
Rhyme 3:9d3079170b35 98 #define FLOAT_MAX_16BIT 32768.0
Rhyme 3:9d3079170b35 99
Rhyme 0:9aed6f5a35c0 100 /* 0x00 CHIP_ID reset value = 0xD1 */
Rhyme 1:d56df81c389b 101 /* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read.
Rhyme 0:9aed6f5a35c0 102 * bit[7] mag_drdy_err
Rhyme 1:d56df81c389b 103 * bit[6] drop_cmd_err Dropped command to Register
Rhyme 0:9aed6f5a35c0 104 * bit[5] i2c_fail_err
Rhyme 1:d56df81c389b 105 * bit[4:1] err_code error code
Rhyme 1:d56df81c389b 106 * 0000: no error
Rhyme 1:d56df81c389b 107 * 0001: error
Rhyme 1:d56df81c389b 108 * 0010: error
Rhyme 1:d56df81c389b 109 * 0011: low-power mode and interrupt uses pre-filtered data
Rhyme 1:d56df81c389b 110 * 0100-0101: reserved
Rhyme 1:d56df81c389b 111 * 0110: ODRs of enabled sensors in headerless mode do not match
Rhyme 1:d56df81c389b 112 * 0111: pre-filtered data are used in low power mode
Rhyme 1:d56df81c389b 113 * 1000-1111: reserved
Rhyme 1:d56df81c389b 114 * The first reported error will be shown in the error code
Rhyme 1:d56df81c389b 115 * bit[0] fatal_err : Chip not operatable
Rhyme 0:9aed6f5a35c0 116 */
Rhyme 0:9aed6f5a35c0 117 /* 0x03 PMU_STATUS
Rhyme 0:9aed6f5a35c0 118 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 119 * bit[5:4] acc_pmu_status
Rhyme 0:9aed6f5a35c0 120 * bit[3:2] gyr_pmu_status
Rhyme 0:9aed6f5a35c0 121 * bit[1:0] mag_pmu_status
Rhyme 0:9aed6f5a35c0 122 */
Rhyme 0:9aed6f5a35c0 123 /* 0x04 DATA_0 : MAG_X[7:0] */
Rhyme 0:9aed6f5a35c0 124 /* 0x05 DATA_1 : MAG_X[15:8] */
Rhyme 0:9aed6f5a35c0 125 /* 0x06 DATA_2 : MAG_Y[7:0] */
Rhyme 0:9aed6f5a35c0 126 /* 0x07 DATA_3 : MAG_Y[15:8] */
Rhyme 0:9aed6f5a35c0 127 /* 0x08 DATA_4 : MAG_Z[7:0] */
Rhyme 0:9aed6f5a35c0 128 /* 0x09 DATA_5 : MAG_Z[15:8] */
Rhyme 0:9aed6f5a35c0 129 /* 0x0A DATA_6 : RHALL[7:0] */
Rhyme 0:9aed6f5a35c0 130 /* 0x0B DATA_7 : RHALL[15:8] */
Rhyme 0:9aed6f5a35c0 131 /* 0x0C DATA_8 : GYR_X[7:0] */
Rhyme 0:9aed6f5a35c0 132 /* 0x0D DATA_9 : GYR_X[15:8] */
Rhyme 0:9aed6f5a35c0 133 /* 0x0E DATA_10 : GYR_Y[7:0] */
Rhyme 0:9aed6f5a35c0 134 /* 0x0F DATA_11 : GYR_Y[15:8] */
Rhyme 0:9aed6f5a35c0 135 /* 0x10 DATA_12 : GYR_Z[7:0] */
Rhyme 0:9aed6f5a35c0 136 /* 0x11 DATA_13 : GYR_Z[15:8] */
Rhyme 0:9aed6f5a35c0 137 /* 0x12 DATA_14 : ACC_X[7:0] */
Rhyme 0:9aed6f5a35c0 138 /* 0x13 DATA_15 : ACC_X[15:8] */
Rhyme 0:9aed6f5a35c0 139 /* 0x14 DATA_16 : ACC_Y[7:0] */
Rhyme 0:9aed6f5a35c0 140 /* 0x15 DATA_17 : ACC_Y[15:8] */
Rhyme 0:9aed6f5a35c0 141 /* 0x16 DATA_18 : ACC_Z[7:0] */
Rhyme 0:9aed6f5a35c0 142 /* 0x17 DATA_19 : ACC_Z[15:8] */
Rhyme 0:9aed6f5a35c0 143 /* 0x18 SENSORTIME_0 : sensor_time[7:0] */
Rhyme 0:9aed6f5a35c0 144 /* 0x19 SENSORTIME_1 : sensor_time[15:8] */
Rhyme 0:9aed6f5a35c0 145 /* 0x1A SENSORTIME_2 : sensor_time[23:16] */
Rhyme 0:9aed6f5a35c0 146 /* 0x1B STATUS
Rhyme 0:9aed6f5a35c0 147 * bit[7] drdy_acc
Rhyme 0:9aed6f5a35c0 148 * bit[6] drdy_gyr
Rhyme 0:9aed6f5a35c0 149 * bit[5] drfy_mag
Rhyme 0:9aed6f5a35c0 150 * bit[4] nvm_rdy
Rhyme 0:9aed6f5a35c0 151 * bit[3] foc_rdy
Rhyme 0:9aed6f5a35c0 152 * bit[2] mag_man_op
Rhyme 0:9aed6f5a35c0 153 * bit[1] gry_self_test_of
Rhyme 0:9aed6f5a35c0 154 * bit[0] (reserved)
Rhyme 0:9aed6f5a35c0 155 */
Rhyme 0:9aed6f5a35c0 156 /* 0x1C INT_STATUS_0
Rhyme 0:9aed6f5a35c0 157 * bit[7] flat_int
Rhyme 0:9aed6f5a35c0 158 * bit[6] orient_int
Rhyme 0:9aed6f5a35c0 159 * bit[5] s_tap_int
Rhyme 0:9aed6f5a35c0 160 * bit[4] d_tap_int
Rhyme 0:9aed6f5a35c0 161 * bit[3] pmu_trigger_int
Rhyme 0:9aed6f5a35c0 162 * bit[2] anym_int
Rhyme 0:9aed6f5a35c0 163 * bit[1] sigmot_int
Rhyme 0:9aed6f5a35c0 164 * bit[0] step_int
Rhyme 0:9aed6f5a35c0 165 */
Rhyme 0:9aed6f5a35c0 166 /* 0x1D INT_STATUS_1
Rhyme 0:9aed6f5a35c0 167 * bit[7] nomo_int
Rhyme 0:9aed6f5a35c0 168 * bit[6] fwm_int
Rhyme 0:9aed6f5a35c0 169 * bit[5] ffull_int
Rhyme 0:9aed6f5a35c0 170 * bit[4] drdy_int
Rhyme 0:9aed6f5a35c0 171 * bit[3] lowg_int
Rhyme 0:9aed6f5a35c0 172 * bit[2] highg_int
Rhyme 0:9aed6f5a35c0 173 * bit[1:0] (reserved)
Rhyme 0:9aed6f5a35c0 174 */
Rhyme 0:9aed6f5a35c0 175 /* 0x1E INT_STATUS_2
Rhyme 0:9aed6f5a35c0 176 * bit[7] tap_sign
Rhyme 0:9aed6f5a35c0 177 * bit[6] tap_first_z
Rhyme 0:9aed6f5a35c0 178 * bit[5] tap_first_y
Rhyme 0:9aed6f5a35c0 179 * bit[4] tap_first_x
Rhyme 0:9aed6f5a35c0 180 * bit[3] anym_sign
Rhyme 0:9aed6f5a35c0 181 * bit[2] anym_first_z
Rhyme 0:9aed6f5a35c0 182 * bit[1] anym_first_y
Rhyme 0:9aed6f5a35c0 183 * bit[0] anym_first_x
Rhyme 0:9aed6f5a35c0 184 */
Rhyme 0:9aed6f5a35c0 185 /* 0x1F INT_STATUS_3
Rhyme 0:9aed6f5a35c0 186 * bit[7] flat
Rhyme 0:9aed6f5a35c0 187 * bit[6] orient_2
Rhyme 0:9aed6f5a35c0 188 * bit[5] orient_1
Rhyme 0:9aed6f5a35c0 189 * bit[4] orient_0
Rhyme 0:9aed6f5a35c0 190 * bit[3] high_sign
Rhyme 0:9aed6f5a35c0 191 * bit[2] high_first_z
Rhyme 0:9aed6f5a35c0 192 * bit[1] high_first_y
Rhyme 0:9aed6f5a35c0 193 * bit[0] high_first_x
Rhyme 0:9aed6f5a35c0 194 */
Rhyme 0:9aed6f5a35c0 195 /* 0x20 TEMPERATURE_0 temperature[7:0] */
Rhyme 0:9aed6f5a35c0 196 /* 0x21 TEMPERATURE_1 reset value = 0x80 temperature[15:8] */
Rhyme 0:9aed6f5a35c0 197 /* 0x22 FIFO_LENGTH_0 fifo_byte_counter[7:0] */
Rhyme 0:9aed6f5a35c0 198 /* 0x23 FIFO_LENGTH_1
Rhyme 0:9aed6f5a35c0 199 * bit[7:3] (reserved)
Rhyme 0:9aed6f5a35c0 200 * bit[2:0] fifo_byte_counter[10:8]
Rhyme 0:9aed6f5a35c0 201 */
Rhyme 0:9aed6f5a35c0 202 /* 0x40 ACC_CONF reset value 0x28
Rhyme 0:9aed6f5a35c0 203 * bit[7] acc_us
Rhyme 0:9aed6f5a35c0 204 * bit[6:4] acc_bwp
Rhyme 0:9aed6f5a35c0 205 * bit[3:0] acc_odr
Rhyme 0:9aed6f5a35c0 206 */
Rhyme 0:9aed6f5a35c0 207 /* 0x41 ACC_RANGE reset value = 0x03
Rhyme 0:9aed6f5a35c0 208 * bit[7:4] (reserved)
Rhyme 0:9aed6f5a35c0 209 * bit[3:0] acc_range
Rhyme 0:9aed6f5a35c0 210 */
Rhyme 0:9aed6f5a35c0 211 /* 0x42 GYR_CONF reset value = 0x28
Rhyme 0:9aed6f5a35c0 212 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 213 * bit[5:4] gyr_bwp
Rhyme 0:9aed6f5a35c0 214 * bit[3:0] gyr_odr
Rhyme 0:9aed6f5a35c0 215 */
Rhyme 0:9aed6f5a35c0 216 /* 0x43 GYR_RANGE
Rhyme 0:9aed6f5a35c0 217 * bit[7:3] (reserved)
Rhyme 0:9aed6f5a35c0 218 * bit[2:0] gyr_range
Rhyme 0:9aed6f5a35c0 219 */
Rhyme 0:9aed6f5a35c0 220 /* 0x44 MAG_CONF reset value = 0x0B
Rhyme 0:9aed6f5a35c0 221 * bit[7:4] (reserved)
Rhyme 0:9aed6f5a35c0 222 * bit[3:0] mag_odr
Rhyme 0:9aed6f5a35c0 223 */
Rhyme 0:9aed6f5a35c0 224 /* 0x45 FIFO_DOWNS reset value = 0x88
Rhyme 0:9aed6f5a35c0 225 * bit[7] acc_fifo_filt_data
Rhyme 0:9aed6f5a35c0 226 * bit[6:4] acc_fifo_downs
Rhyme 0:9aed6f5a35c0 227 * bit[3] gyr_fifo_filt_data
Rhyme 0:9aed6f5a35c0 228 * bit[2:0] gyr_fifo_downs
Rhyme 0:9aed6f5a35c0 229 */
Rhyme 0:9aed6f5a35c0 230 /* 0x46 FIFO_CONFIG_0 reset value = 0x80
Rhyme 0:9aed6f5a35c0 231 * bit[7:0] fifo_water_mark
Rhyme 0:9aed6f5a35c0 232 */
Rhyme 0:9aed6f5a35c0 233 /* 0x47 FIFO_CONFIG_1 reset value = 0x10
Rhyme 0:9aed6f5a35c0 234 * bit[7] fifo_gyr_en
Rhyme 0:9aed6f5a35c0 235 * bit[6] fifo_acc_en
Rhyme 0:9aed6f5a35c0 236 * bit[5] fifo_mag_en
Rhyme 0:9aed6f5a35c0 237 * bit[4] fifo_header_en
Rhyme 0:9aed6f5a35c0 238 * bit[3] fifo_tag_int1_en
Rhyme 0:9aed6f5a35c0 239 * bit[2] fifo_tag_int2_en
Rhyme 0:9aed6f5a35c0 240 * bit[1] fifo_time_en
Rhyme 0:9aed6f5a35c0 241 * bit[0] (reserved)
Rhyme 0:9aed6f5a35c0 242 */
Rhyme 0:9aed6f5a35c0 243 /* 0x4B MAG_IF_0 reset value = 0x20
Rhyme 0:9aed6f5a35c0 244 * bit[7:1] i2c_device_addr
Rhyme 0:9aed6f5a35c0 245 */
Rhyme 0:9aed6f5a35c0 246 /* 0x4C MAG_IF_1 reset value = 0x80
Rhyme 0:9aed6f5a35c0 247 * bit[7] mag_manual_en
Rhyme 0:9aed6f5a35c0 248 * bit[6] (reserved)
Rhyme 0:9aed6f5a35c0 249 * bit[5:2] mag_offset
Rhyme 0:9aed6f5a35c0 250 * bit[1:0] mag_rd_burst
Rhyme 0:9aed6f5a35c0 251 */
Rhyme 0:9aed6f5a35c0 252 /* 0x4D MAG_IF_2 reset value = 0x42
Rhyme 0:9aed6f5a35c0 253 * bit[7:0] read_addr
Rhyme 0:9aed6f5a35c0 254 */
Rhyme 0:9aed6f5a35c0 255 /* 0x4E MAG_IF_3 reset value = 0x4C
Rhyme 0:9aed6f5a35c0 256 * bit[7:0] write_addr
Rhyme 0:9aed6f5a35c0 257 */
Rhyme 0:9aed6f5a35c0 258 /* 0x4F MAG_IF_4 bit[7:0] write data */
Rhyme 0:9aed6f5a35c0 259 /* 0x50 INT_EN_0
Rhyme 0:9aed6f5a35c0 260 * bit[7] int_flat_en
Rhyme 0:9aed6f5a35c0 261 * bit[6] int_orient_en
Rhyme 0:9aed6f5a35c0 262 * bit[5] int_s_tap_en
Rhyme 0:9aed6f5a35c0 263 * bit[4] int_d_tap_en
Rhyme 0:9aed6f5a35c0 264 * bit[3] (reserved)
Rhyme 0:9aed6f5a35c0 265 * bit[2] int_anymo_z_en
Rhyme 0:9aed6f5a35c0 266 * bit[1] int_anymo_y_en
Rhyme 0:9aed6f5a35c0 267 * bit[0] int_anymo_x_en
Rhyme 0:9aed6f5a35c0 268 */
Rhyme 0:9aed6f5a35c0 269 /* 0x51 INT_EN_1
Rhyme 0:9aed6f5a35c0 270 * bit[7] (reserved)
Rhyme 0:9aed6f5a35c0 271 * bit[6] int_fwm_en
Rhyme 0:9aed6f5a35c0 272 * bit[5] int_ffull_en
Rhyme 0:9aed6f5a35c0 273 * bit[4] int_drdy_en
Rhyme 0:9aed6f5a35c0 274 * bit[3] int_low_en
Rhyme 0:9aed6f5a35c0 275 * bit[2] int_highg_z_en
Rhyme 0:9aed6f5a35c0 276 * bit[1] int_highg_y_en
Rhyme 0:9aed6f5a35c0 277 * bit[0] int_highg_x_en
Rhyme 0:9aed6f5a35c0 278 */
Rhyme 0:9aed6f5a35c0 279 /* 0x52 INT_EN_2
Rhyme 0:9aed6f5a35c0 280 * bit[7:4] (reserved)
Rhyme 0:9aed6f5a35c0 281 * bit[3] int_step_det_en
Rhyme 0:9aed6f5a35c0 282 * bit[2] int_nomoz_en
Rhyme 0:9aed6f5a35c0 283 * bit[1] int_nomoy_en
Rhyme 0:9aed6f5a35c0 284 * bit[0] int_nomox_en
Rhyme 0:9aed6f5a35c0 285 */
Rhyme 0:9aed6f5a35c0 286 /* 0x53 INT_OUT_CTRL
Rhyme 0:9aed6f5a35c0 287 * bit[7] int2_output_en
Rhyme 0:9aed6f5a35c0 288 * bit[6] int2_od
Rhyme 0:9aed6f5a35c0 289 * bit[5] int2_lvl
Rhyme 0:9aed6f5a35c0 290 * bit[4] int2_edge_ctrl
Rhyme 0:9aed6f5a35c0 291 * bit[3] int1_output_en
Rhyme 0:9aed6f5a35c0 292 * bit[2] int1_od
Rhyme 0:9aed6f5a35c0 293 * bit[1] int1_lvl
Rhyme 0:9aed6f5a35c0 294 * bit[0] itn1_edge_ctrl
Rhyme 0:9aed6f5a35c0 295 */
Rhyme 0:9aed6f5a35c0 296 /* 0x54 INT_LATCH
Rhyme 0:9aed6f5a35c0 297 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 298 * bit[5] int2_input_en
Rhyme 0:9aed6f5a35c0 299 * bit[4] int1_input_en
Rhyme 0:9aed6f5a35c0 300 * bit[3:0] int_latch
Rhyme 0:9aed6f5a35c0 301 */
Rhyme 0:9aed6f5a35c0 302 /* 0x55 INT_MAP_0
Rhyme 0:9aed6f5a35c0 303 * bit[7] int1_flat
Rhyme 0:9aed6f5a35c0 304 * bit[6] int1_orient
Rhyme 0:9aed6f5a35c0 305 * bit[5] int1_s_tap
Rhyme 0:9aed6f5a35c0 306 * bit[4] int1_d_tap
Rhyme 0:9aed6f5a35c0 307 * bit[3] int1_nomotion
Rhyme 0:9aed6f5a35c0 308 * bit[2] int1_anymotion
Rhyme 0:9aed6f5a35c0 309 * bit[1] int1_highg
Rhyme 0:9aed6f5a35c0 310 * bit[0] int1_lowg_step
Rhyme 0:9aed6f5a35c0 311 */
Rhyme 0:9aed6f5a35c0 312 /* 0x56 INT_MAP_1
Rhyme 0:9aed6f5a35c0 313 * bit[7] int1_drdy
Rhyme 0:9aed6f5a35c0 314 * bit[6] int1_fwm
Rhyme 0:9aed6f5a35c0 315 * bit[5] int1_ffull
Rhyme 0:9aed6f5a35c0 316 * bit[4] int1_pmu_trig
Rhyme 0:9aed6f5a35c0 317 * bit[3] int2_drdy
Rhyme 0:9aed6f5a35c0 318 * bit[2] itn2_fwm
Rhyme 0:9aed6f5a35c0 319 * bit[1] int2_ffull
Rhyme 0:9aed6f5a35c0 320 * bit[0] int2_pmu_trig
Rhyme 0:9aed6f5a35c0 321 */
Rhyme 0:9aed6f5a35c0 322 /* 0x57 INT_MAP_2
Rhyme 0:9aed6f5a35c0 323 * bit[7] int2_flat
Rhyme 0:9aed6f5a35c0 324 * bit[6] int2_orient
Rhyme 0:9aed6f5a35c0 325 * bit[5] int2_s_tap
Rhyme 0:9aed6f5a35c0 326 * bit[4] int2_d_tap
Rhyme 0:9aed6f5a35c0 327 * bit[3] int2_nomotion
Rhyme 0:9aed6f5a35c0 328 * bit[2] int2_anymotion
Rhyme 0:9aed6f5a35c0 329 * bit[1] int2_highg
Rhyme 0:9aed6f5a35c0 330 * bit[0] int2_lowg_steop
Rhyme 0:9aed6f5a35c0 331 */
Rhyme 0:9aed6f5a35c0 332 /* 0x58 INT_DATA_0
Rhyme 0:9aed6f5a35c0 333 * bit[7] int_low_high_src
Rhyme 0:9aed6f5a35c0 334 * bit[6:4] (reserved)
Rhyme 0:9aed6f5a35c0 335 * bit[3] int_tap_src
Rhyme 0:9aed6f5a35c0 336 * bit[2:0] (reserved)
Rhyme 0:9aed6f5a35c0 337 */
Rhyme 0:9aed6f5a35c0 338 /* 0x59 INT_DATA_1
Rhyme 0:9aed6f5a35c0 339 * bit[7] int_motion_src
Rhyme 0:9aed6f5a35c0 340 * bit[6:0] (reseved)
Rhyme 0:9aed6f5a35c0 341 */
Rhyme 0:9aed6f5a35c0 342 /* 0x5A INT_LOWHIGH_0 reset value = 0x07
Rhyme 0:9aed6f5a35c0 343 * bit[7:0] int_low_dur
Rhyme 0:9aed6f5a35c0 344 */
Rhyme 0:9aed6f5a35c0 345 /* 0x5B INT_LOWHIGH_1 reset value = 0x30
Rhyme 0:9aed6f5a35c0 346 * bit[7:0] int_low_th
Rhyme 0:9aed6f5a35c0 347 */
Rhyme 0:9aed6f5a35c0 348 /* 0x5C INT_LOWHIGH_2 reset value = 0x81
Rhyme 0:9aed6f5a35c0 349 * bit[7:6] int_high_hy
Rhyme 0:9aed6f5a35c0 350 * bit[5:3] (reserved)
Rhyme 0:9aed6f5a35c0 351 * bit[2] int_low_mode
Rhyme 0:9aed6f5a35c0 352 * bit[1:0] int_low_hy
Rhyme 0:9aed6f5a35c0 353 */
Rhyme 0:9aed6f5a35c0 354 /* 0x5D INT_LOWHIGH_3 reset value = 0x0B
Rhyme 0:9aed6f5a35c0 355 * bit[7:0] int_high_dur
Rhyme 0:9aed6f5a35c0 356 */
Rhyme 0:9aed6f5a35c0 357 /* 0x5E INT_LOWHIGH_4 reset value = 0xC0
Rhyme 0:9aed6f5a35c0 358 * bit[7:0] int_high_th
Rhyme 0:9aed6f5a35c0 359 */
Rhyme 0:9aed6f5a35c0 360 /* 0x5F INT_MOTION_0
Rhyme 0:9aed6f5a35c0 361 * bit[7:2] int_slo_nomo_dur
Rhyme 0:9aed6f5a35c0 362 * bit[1:0] int_anym_dur
Rhyme 0:9aed6f5a35c0 363 */
Rhyme 0:9aed6f5a35c0 364 /* 0x60 INT_MOTION_1 reset value = 0x14
Rhyme 0:9aed6f5a35c0 365 * bit[7:0] int_anymo_th
Rhyme 0:9aed6f5a35c0 366 */
Rhyme 0:9aed6f5a35c0 367 /* 0x61 INT_MOTION_2 reset value = 0x14
Rhyme 0:9aed6f5a35c0 368 * bit[7:0] int_slo_nomo_th
Rhyme 0:9aed6f5a35c0 369 */
Rhyme 0:9aed6f5a35c0 370 /* 0x62 INT_MOTION_3 reset value = 0x24
Rhyme 0:9aed6f5a35c0 371 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 372 * bit[5:4] int_sig_mot_proof
Rhyme 0:9aed6f5a35c0 373 */
Rhyme 0:9aed6f5a35c0 374 /* 0x63 INT_TAP_0 reset value = 0x04
Rhyme 0:9aed6f5a35c0 375 * bit[7] int_tap_quiet
Rhyme 0:9aed6f5a35c0 376 * bit[6] int_tap_shock
Rhyme 0:9aed6f5a35c0 377 * bit[5:3] (reserved)
Rhyme 0:9aed6f5a35c0 378 * bit[2:0] int_tap_dur
Rhyme 0:9aed6f5a35c0 379 */
Rhyme 0:9aed6f5a35c0 380 /* 0x64 INT_TAP_1 reset value = 0x0A
Rhyme 0:9aed6f5a35c0 381 * bit[7:5] (reserved)
Rhyme 0:9aed6f5a35c0 382 * bit[4:0] int_tap_th
Rhyme 0:9aed6f5a35c0 383 */
Rhyme 0:9aed6f5a35c0 384 /* 0x65 INT_ORIENT_0 reset value = 0x18
Rhyme 0:9aed6f5a35c0 385 * bit[7:4] int_orient_hy
Rhyme 0:9aed6f5a35c0 386 * bit[3:2] int_orient_blocking
Rhyme 0:9aed6f5a35c0 387 * bit[1:0] int_orient_mode
Rhyme 0:9aed6f5a35c0 388 */
Rhyme 0:9aed6f5a35c0 389 /* 0x66 INT_ORIENT_1 reset value = 0x48
Rhyme 0:9aed6f5a35c0 390 * bit[7] int_orient_axes_ex
Rhyme 0:9aed6f5a35c0 391 * bit[6] int_orient_ud_en
Rhyme 0:9aed6f5a35c0 392 * bit[5:0] int_orient_theta
Rhyme 0:9aed6f5a35c0 393 */
Rhyme 0:9aed6f5a35c0 394 /* 0x67 INT_FLAT_0 reset value = 0x08
Rhyme 0:9aed6f5a35c0 395 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 396 * bit[5:0] int_flat_theta
Rhyme 0:9aed6f5a35c0 397 */
Rhyme 0:9aed6f5a35c0 398 /* 0x68 INT_FLAT_1 reset value = 0x11
Rhyme 0:9aed6f5a35c0 399 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 400 * bit[5:4] int_flat_hold
Rhyme 0:9aed6f5a35c0 401 * bit[3:0] int_flat_hy
Rhyme 0:9aed6f5a35c0 402 */
Rhyme 0:9aed6f5a35c0 403 /* 0x69 FOC_CONF
Rhyme 0:9aed6f5a35c0 404 * bit[7] (reserved)
Rhyme 0:9aed6f5a35c0 405 * bit[6] foc_gyr_en
Rhyme 0:9aed6f5a35c0 406 * bit[5:4] foc_acc_x
Rhyme 0:9aed6f5a35c0 407 * bit[3:2] foc_acc_y
Rhyme 0:9aed6f5a35c0 408 * bit[1:0] foc_acc_z
Rhyme 0:9aed6f5a35c0 409 */
Rhyme 0:9aed6f5a35c0 410 /* 0x6A CONF
Rhyme 0:9aed6f5a35c0 411 * bit[7:2] (reserved)
Rhyme 0:9aed6f5a35c0 412 * bit[1] nvm_prog_en
Rhyme 0:9aed6f5a35c0 413 * bit[0] (reserved)
Rhyme 0:9aed6f5a35c0 414 */
Rhyme 0:9aed6f5a35c0 415 /* 0x6B IF_CONF
Rhyme 0:9aed6f5a35c0 416 * bit[7:6] (reserved)
Rhyme 0:9aed6f5a35c0 417 * bit[5:4] if_mode
Rhyme 0:9aed6f5a35c0 418 * bit[3:1] (reserved)
Rhyme 0:9aed6f5a35c0 419 * bit[0] spi3
Rhyme 0:9aed6f5a35c0 420 */
Rhyme 0:9aed6f5a35c0 421 /* 0x6C PMU_TRIGGER
Rhyme 0:9aed6f5a35c0 422 * bit[7] (reserved)
Rhyme 0:9aed6f5a35c0 423 * bit[6] wakeup_int
Rhyme 0:9aed6f5a35c0 424 * bit[5] gyr_sleep_state
Rhyme 0:9aed6f5a35c0 425 * bit[4:3] gyr_wakeup_trigger
Rhyme 0:9aed6f5a35c0 426 * bit[2:0] gyr_sleep_trigger
Rhyme 0:9aed6f5a35c0 427 */
Rhyme 0:9aed6f5a35c0 428 /* 0x6D SELF_TEST
Rhyme 0:9aed6f5a35c0 429 * bit[7:5] (reserved)
Rhyme 0:9aed6f5a35c0 430 * bit[4] gyr_self_test_enable
Rhyme 0:9aed6f5a35c0 431 * bit[3] acc_self_test_amp
Rhyme 0:9aed6f5a35c0 432 * bit[2] acc_self_test_sign
Rhyme 0:9aed6f5a35c0 433 * bit[1:0] acc_self_test_enable
Rhyme 0:9aed6f5a35c0 434 */
Rhyme 0:9aed6f5a35c0 435 /* 0x70 NV_CONF
Rhyme 0:9aed6f5a35c0 436 * bit[7:4] (reserved)
Rhyme 0:9aed6f5a35c0 437 * bit[3] u_spare_0
Rhyme 0:9aed6f5a35c0 438 * bit[2] i2c_wdt_en
Rhyme 0:9aed6f5a35c0 439 * bit[1] i2c_wdt_sel
Rhyme 0:9aed6f5a35c0 440 * bit[0] i2c_spi_en
Rhyme 0:9aed6f5a35c0 441 */
Rhyme 0:9aed6f5a35c0 442 /* 0x71 OFFSET_0 bit[7:0] off_acc_x */
Rhyme 0:9aed6f5a35c0 443 /* 0x72 OFFSET_1 bit[7:0] off_acc_y */
Rhyme 0:9aed6f5a35c0 444 /* 0x73 OFFSET_2 bit[7:0] off_acc_z */
Rhyme 0:9aed6f5a35c0 445 /* 0x74 OFFSET_3 bit[7:0] off_gyr_x_7_0 */
Rhyme 0:9aed6f5a35c0 446 /* 0x75 OFFSET_4 bit[7:0] off_gyr_y_7_0 */
Rhyme 0:9aed6f5a35c0 447 /* 0x76 OFFSET_5 bit[7:0] off_gyr_z_7_0 */
Rhyme 0:9aed6f5a35c0 448 /* 0x77 OFFSET_6
Rhyme 0:9aed6f5a35c0 449 * bit[7] gyr_off_en
Rhyme 0:9aed6f5a35c0 450 * bit[6] acc_off_en
Rhyme 0:9aed6f5a35c0 451 * bit[5:4] off_gyr_Z_9_8
Rhyme 0:9aed6f5a35c0 452 * bit[3:2] off_gyr_y_9_8
Rhyme 0:9aed6f5a35c0 453 * bit[1:0] off_gyr_x_9_8
Rhyme 0:9aed6f5a35c0 454 */
Rhyme 0:9aed6f5a35c0 455 /* 0x78 STEP_CNT_0 bit[7:0] step_cnt_7_0 */
Rhyme 0:9aed6f5a35c0 456 /* 0x79 STEP_CNT_1 bit[7:0] step_cnt_15_8 */
Rhyme 0:9aed6f5a35c0 457 /* 0x7A STEP_CONF_0 reset value = 0x15
Rhyme 0:9aed6f5a35c0 458 * bit[7:5] (alpha)
Rhyme 0:9aed6f5a35c0 459 * bit[4:3] min_threshold
Rhyme 0:9aed6f5a35c0 460 * bit[2:0] steptime_min
Rhyme 0:9aed6f5a35c0 461 */
Rhyme 0:9aed6f5a35c0 462 /* 0x7B STEP_CONF_1 reset value = 0x03
Rhyme 0:9aed6f5a35c0 463 * bit[7:4] (reserved)
Rhyme 0:9aed6f5a35c0 464 * bit[3] step_cnt_en
Rhyme 0:9aed6f5a35c0 465 * bit[2:0] min_step_buf
Rhyme 0:9aed6f5a35c0 466 */
Rhyme 0:9aed6f5a35c0 467 /* 0x7E CMD bit[7:0] cmd */
Rhyme 0:9aed6f5a35c0 468
Rhyme 0:9aed6f5a35c0 469
Rhyme 0:9aed6f5a35c0 470
Rhyme 0:9aed6f5a35c0 471
Rhyme 0:9aed6f5a35c0 472 BMI160::BMI160(PinName sda, PinName scl, int addr)
Rhyme 0:9aed6f5a35c0 473 {
Rhyme 0:9aed6f5a35c0 474 m_i2c = new I2C(sda, scl) ;
Rhyme 0:9aed6f5a35c0 475 m_addr = (addr << 1) ;
Rhyme 0:9aed6f5a35c0 476 m_spi = 0 ;
Rhyme 0:9aed6f5a35c0 477 m_cs = 0 ;
Rhyme 0:9aed6f5a35c0 478 init() ;
Rhyme 0:9aed6f5a35c0 479 }
Rhyme 0:9aed6f5a35c0 480
Rhyme 0:9aed6f5a35c0 481 BMI160::BMI160(PinName sck, PinName miso, PinName mosi, PinName cs)
Rhyme 0:9aed6f5a35c0 482 {
Rhyme 0:9aed6f5a35c0 483 m_cs = new DigitalOut(cs, 1) ;
Rhyme 0:9aed6f5a35c0 484 m_spi = new SPI(mosi, miso, sck) ;
Rhyme 0:9aed6f5a35c0 485 m_spi->format(8, 3) ;
Rhyme 0:9aed6f5a35c0 486 m_i2c = 0 ;
Rhyme 0:9aed6f5a35c0 487 m_addr = 0 ;
Rhyme 0:9aed6f5a35c0 488 init() ;
Rhyme 0:9aed6f5a35c0 489 }
Rhyme 0:9aed6f5a35c0 490
Rhyme 0:9aed6f5a35c0 491 BMI160::~BMI160()
Rhyme 0:9aed6f5a35c0 492 {
Rhyme 0:9aed6f5a35c0 493 if (m_spi) {
Rhyme 0:9aed6f5a35c0 494 delete m_spi ;
Rhyme 0:9aed6f5a35c0 495 delete m_cs ;
Rhyme 0:9aed6f5a35c0 496 }
Rhyme 0:9aed6f5a35c0 497 if (m_i2c) {
Rhyme 0:9aed6f5a35c0 498 delete m_i2c ;
Rhyme 0:9aed6f5a35c0 499 m_addr = 0 ;
Rhyme 0:9aed6f5a35c0 500 }
Rhyme 0:9aed6f5a35c0 501 }
Rhyme 0:9aed6f5a35c0 502
Rhyme 0:9aed6f5a35c0 503 void BMI160::i2c_readRegs(int addr, uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 504 {
Rhyme 0:9aed6f5a35c0 505 char t[1] = {addr} ;
Rhyme 0:9aed6f5a35c0 506 m_i2c->write(m_addr, t, 1, true) ;
Rhyme 0:9aed6f5a35c0 507 m_i2c->read(m_addr, (char*)data, len) ;
Rhyme 0:9aed6f5a35c0 508 }
Rhyme 0:9aed6f5a35c0 509
Rhyme 0:9aed6f5a35c0 510 void BMI160::i2c_writeRegs(uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 511 {
Rhyme 0:9aed6f5a35c0 512 m_i2c->write(m_addr, (char *)data, len) ;
Rhyme 0:9aed6f5a35c0 513 }
Rhyme 0:9aed6f5a35c0 514
Rhyme 0:9aed6f5a35c0 515 void BMI160::spi_readRegs(int addr, uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 516 {
Rhyme 0:9aed6f5a35c0 517 *m_cs = 0 ;
Rhyme 0:9aed6f5a35c0 518 m_spi->write(addr | 0x80) ;
Rhyme 0:9aed6f5a35c0 519 for (int i = 0 ; i < len ; i++ ) {
Rhyme 0:9aed6f5a35c0 520 data[i] = m_spi->write((addr+i)|0x80) ;
Rhyme 0:9aed6f5a35c0 521 }
Rhyme 0:9aed6f5a35c0 522 m_spi->write(0x00) ; // to terminate read mode
Rhyme 0:9aed6f5a35c0 523 *m_cs = 1 ;
Rhyme 0:9aed6f5a35c0 524 }
Rhyme 0:9aed6f5a35c0 525
Rhyme 0:9aed6f5a35c0 526 void BMI160::spi_writeRegs(uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 527 {
Rhyme 0:9aed6f5a35c0 528 *m_cs = 0 ;
Rhyme 0:9aed6f5a35c0 529 for (int i = 0 ; i < len-1 ; i++ ) {
Rhyme 0:9aed6f5a35c0 530 m_spi->write((data[0]+i)^0x80) ; /* register address */
Rhyme 0:9aed6f5a35c0 531 m_spi->write(data[i+1]) ; /* data to write */
Rhyme 0:9aed6f5a35c0 532
Rhyme 0:9aed6f5a35c0 533 }
Rhyme 0:9aed6f5a35c0 534 *m_cs = 1 ;
Rhyme 0:9aed6f5a35c0 535 }
Rhyme 0:9aed6f5a35c0 536
Rhyme 0:9aed6f5a35c0 537 void BMI160::readRegs(int addr, uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 538 {
Rhyme 0:9aed6f5a35c0 539 if (m_spi) {
Rhyme 0:9aed6f5a35c0 540 spi_readRegs(addr, data, len) ;
Rhyme 0:9aed6f5a35c0 541 } else if (m_i2c) {
Rhyme 0:9aed6f5a35c0 542 i2c_readRegs(addr, data, len) ;
Rhyme 0:9aed6f5a35c0 543 }
Rhyme 0:9aed6f5a35c0 544 }
Rhyme 0:9aed6f5a35c0 545
Rhyme 0:9aed6f5a35c0 546 void BMI160::writeRegs(uint8_t *data, int len)
Rhyme 0:9aed6f5a35c0 547 {
Rhyme 0:9aed6f5a35c0 548 if (m_spi) {
Rhyme 0:9aed6f5a35c0 549 spi_writeRegs(data, len) ;
Rhyme 0:9aed6f5a35c0 550 } else if (m_i2c) {
Rhyme 0:9aed6f5a35c0 551 i2c_writeRegs(data, len) ;
Rhyme 0:9aed6f5a35c0 552 }
Rhyme 0:9aed6f5a35c0 553 }
Rhyme 0:9aed6f5a35c0 554
Rhyme 0:9aed6f5a35c0 555 void BMI160::init(void)
Rhyme 0:9aed6f5a35c0 556 {
Rhyme 3:9d3079170b35 557 acc_range = getAccRange() ;
Rhyme 3:9d3079170b35 558 gyr_range = getGyrRange() ;
Rhyme 0:9aed6f5a35c0 559 }
Rhyme 0:9aed6f5a35c0 560
Rhyme 3:9d3079170b35 561
Rhyme 1:d56df81c389b 562 void BMI160::setCMD(uint8_t cmd)
Rhyme 1:d56df81c389b 563 {
Rhyme 1:d56df81c389b 564 uint8_t data[2] ;
Rhyme 1:d56df81c389b 565 data[0] = REG_CMD ;
Rhyme 1:d56df81c389b 566 data[1] = cmd ;
Rhyme 1:d56df81c389b 567 writeRegs(data, 2) ;
Rhyme 1:d56df81c389b 568 }
Rhyme 1:d56df81c389b 569
Rhyme 1:d56df81c389b 570 uint8_t BMI160::getStatus(void)
Rhyme 1:d56df81c389b 571 {
Rhyme 1:d56df81c389b 572 uint8_t status ;
Rhyme 1:d56df81c389b 573 readRegs(REG_STATUS, &status, 1) ;
Rhyme 1:d56df81c389b 574 return(status) ;
Rhyme 1:d56df81c389b 575 }
Rhyme 1:d56df81c389b 576
Rhyme 0:9aed6f5a35c0 577 uint8_t BMI160::getChipID(void)
Rhyme 0:9aed6f5a35c0 578 {
Rhyme 0:9aed6f5a35c0 579 uint8_t data ;
Rhyme 0:9aed6f5a35c0 580 readRegs(REG_CHIP_ID, &data, 1) ;
Rhyme 0:9aed6f5a35c0 581 return( data ) ;
Rhyme 1:d56df81c389b 582 }
Rhyme 1:d56df81c389b 583
Rhyme 1:d56df81c389b 584 uint8_t BMI160::getAccRange(void)
Rhyme 1:d56df81c389b 585 {
Rhyme 1:d56df81c389b 586 uint8_t data = 0 ;
Rhyme 1:d56df81c389b 587 uint8_t range = 0 ;
Rhyme 1:d56df81c389b 588 readRegs(REG_ACC_RANGE, &data, 1) ;
Rhyme 1:d56df81c389b 589 switch(data & 0x0F) {
Rhyme 1:d56df81c389b 590 case 3: /* +/- 2g */
Rhyme 1:d56df81c389b 591 range = 2 ;
Rhyme 1:d56df81c389b 592 break ;
Rhyme 1:d56df81c389b 593 case 5: /* +/- 4g */
Rhyme 1:d56df81c389b 594 range = 4 ;
Rhyme 1:d56df81c389b 595 break ;
Rhyme 1:d56df81c389b 596 case 8: /* +/- 8g */
Rhyme 1:d56df81c389b 597 range = 8 ;
Rhyme 1:d56df81c389b 598 break ;
Rhyme 1:d56df81c389b 599 default:
Rhyme 1:d56df81c389b 600 printf("illegal Acc Range %X detected\n", data & 0x0F) ;
Rhyme 1:d56df81c389b 601 break ;
Rhyme 1:d56df81c389b 602 }
Rhyme 3:9d3079170b35 603 acc_range = range ;
Rhyme 1:d56df81c389b 604 return(range) ;
Rhyme 1:d56df81c389b 605 }
Rhyme 1:d56df81c389b 606
Rhyme 1:d56df81c389b 607 int16_t BMI160::getGyrRange(void)
Rhyme 1:d56df81c389b 608 {
Rhyme 1:d56df81c389b 609 uint8_t data = 0 ;
Rhyme 1:d56df81c389b 610 int16_t range = 0 ;
Rhyme 1:d56df81c389b 611 readRegs(REG_GYR_RANGE, &data, 1) ;
Rhyme 1:d56df81c389b 612 switch(data & 0x07) {
Rhyme 1:d56df81c389b 613 case 0:
Rhyme 1:d56df81c389b 614 range = 2000 ;
Rhyme 1:d56df81c389b 615 break ;
Rhyme 1:d56df81c389b 616 case 1:
Rhyme 1:d56df81c389b 617 range = 1000 ;
Rhyme 1:d56df81c389b 618 break ;
Rhyme 1:d56df81c389b 619 case 2:
Rhyme 1:d56df81c389b 620 range = 500 ;
Rhyme 1:d56df81c389b 621 break ;
Rhyme 1:d56df81c389b 622 case 3:
Rhyme 1:d56df81c389b 623 range = 250 ;
Rhyme 1:d56df81c389b 624 break ;
Rhyme 1:d56df81c389b 625 case 4:
Rhyme 1:d56df81c389b 626 range = 125 ;
Rhyme 1:d56df81c389b 627 break ;
Rhyme 1:d56df81c389b 628 default:
Rhyme 1:d56df81c389b 629 printf("illegal Gyr Range %d detected\n", data & 0x07) ;
Rhyme 1:d56df81c389b 630 break ;
Rhyme 1:d56df81c389b 631 }
Rhyme 3:9d3079170b35 632 gyr_range = range ;
Rhyme 1:d56df81c389b 633 return(range) ;
Rhyme 1:d56df81c389b 634 }
Rhyme 1:d56df81c389b 635
Rhyme 3:9d3079170b35 636 int16_t BMI160::getAccRawX(void)
Rhyme 1:d56df81c389b 637 {
Rhyme 1:d56df81c389b 638 uint8_t data[2] ;
Rhyme 1:d56df81c389b 639 int16_t value = 0 ;
Rhyme 1:d56df81c389b 640 readRegs(REG_DATA_14, data, 2) ;
Rhyme 1:d56df81c389b 641 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 642 return( value ) ;
Rhyme 1:d56df81c389b 643 }
Rhyme 1:d56df81c389b 644
Rhyme 3:9d3079170b35 645 int16_t BMI160::getAccRawY(void)
Rhyme 1:d56df81c389b 646 {
Rhyme 1:d56df81c389b 647 uint8_t data[2] ;
Rhyme 1:d56df81c389b 648 int16_t value = 0 ;
Rhyme 1:d56df81c389b 649 readRegs(REG_DATA_16, data, 2) ;
Rhyme 1:d56df81c389b 650 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 651 return( value ) ;
Rhyme 1:d56df81c389b 652 }
Rhyme 1:d56df81c389b 653
Rhyme 3:9d3079170b35 654 int16_t BMI160::getAccRawZ(void)
Rhyme 1:d56df81c389b 655 {
Rhyme 1:d56df81c389b 656 uint8_t data[2] ;
Rhyme 1:d56df81c389b 657 int16_t value = 0 ;
Rhyme 1:d56df81c389b 658 readRegs(REG_DATA_18, data, 2) ;
Rhyme 1:d56df81c389b 659 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 660 return( value ) ;
Rhyme 1:d56df81c389b 661 }
Rhyme 1:d56df81c389b 662
Rhyme 3:9d3079170b35 663 void BMI160::getAccRaw(int16_t *value)
Rhyme 1:d56df81c389b 664 {
Rhyme 1:d56df81c389b 665 uint8_t data[6] ;
Rhyme 1:d56df81c389b 666 readRegs(REG_DATA_14, data, 6) ;
Rhyme 1:d56df81c389b 667 value[0] = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 668 value[1] = (data[3] << 8) | data[2] ;
Rhyme 1:d56df81c389b 669 value[2] = (data[5] << 8) | data[4] ;
Rhyme 1:d56df81c389b 670 }
Rhyme 1:d56df81c389b 671
Rhyme 3:9d3079170b35 672 int16_t BMI160::getGyrRawX(void)
Rhyme 1:d56df81c389b 673 {
Rhyme 1:d56df81c389b 674 uint8_t data[2] ;
Rhyme 1:d56df81c389b 675 int16_t value = 0 ;
Rhyme 1:d56df81c389b 676 readRegs(REG_DATA_8, data, 2) ;
Rhyme 1:d56df81c389b 677 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 678 return( value ) ;
Rhyme 1:d56df81c389b 679 }
Rhyme 1:d56df81c389b 680
Rhyme 3:9d3079170b35 681 int16_t BMI160::getGyrRawY(void)
Rhyme 1:d56df81c389b 682 {
Rhyme 1:d56df81c389b 683 uint8_t data[2] ;
Rhyme 1:d56df81c389b 684 int16_t value = 0 ;
Rhyme 1:d56df81c389b 685 readRegs(REG_DATA_10, data, 2) ;
Rhyme 1:d56df81c389b 686 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 687 return( value ) ;
Rhyme 1:d56df81c389b 688 }
Rhyme 1:d56df81c389b 689
Rhyme 3:9d3079170b35 690 int16_t BMI160::getGyrRawZ(void)
Rhyme 1:d56df81c389b 691 {
Rhyme 1:d56df81c389b 692 uint8_t data[2] ;
Rhyme 1:d56df81c389b 693 int16_t value = 0 ;
Rhyme 1:d56df81c389b 694 readRegs(REG_DATA_12, data, 2) ;
Rhyme 1:d56df81c389b 695 value = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 696 return( value ) ;
Rhyme 1:d56df81c389b 697 }
Rhyme 1:d56df81c389b 698
Rhyme 3:9d3079170b35 699 void BMI160::getGyrRaw(int16_t *value)
Rhyme 1:d56df81c389b 700 {
Rhyme 1:d56df81c389b 701 uint8_t data[6] ;
Rhyme 1:d56df81c389b 702 readRegs(REG_DATA_8, data, 6) ;
Rhyme 1:d56df81c389b 703 value[0] = (data[1] << 8) | data[0] ;
Rhyme 1:d56df81c389b 704 value[1] = (data[3] << 8) | data[2] ;
Rhyme 1:d56df81c389b 705 value[2] = (data[5] << 8) | data[4] ;
Rhyme 3:9d3079170b35 706 }
Rhyme 3:9d3079170b35 707
Rhyme 3:9d3079170b35 708 float BMI160::getAccX(void)
Rhyme 3:9d3079170b35 709 {
Rhyme 3:9d3079170b35 710 float value ;
Rhyme 3:9d3079170b35 711 value = acc_range * getAccRawX() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 712 return(value) ;
Rhyme 3:9d3079170b35 713 }
Rhyme 3:9d3079170b35 714
Rhyme 3:9d3079170b35 715 float BMI160::getAccY(void)
Rhyme 3:9d3079170b35 716 {
Rhyme 3:9d3079170b35 717 float value ;
Rhyme 3:9d3079170b35 718 value = acc_range * getAccRawY() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 719 return(value) ;
Rhyme 3:9d3079170b35 720 }
Rhyme 3:9d3079170b35 721
Rhyme 3:9d3079170b35 722 float BMI160::getAccZ(void)
Rhyme 3:9d3079170b35 723 {
Rhyme 3:9d3079170b35 724 float value ;
Rhyme 3:9d3079170b35 725 value = acc_range * getAccRawZ() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 726 return(value) ;
Rhyme 3:9d3079170b35 727 }
Rhyme 3:9d3079170b35 728
Rhyme 3:9d3079170b35 729 void BMI160::getAcc(float *value)
Rhyme 3:9d3079170b35 730 {
Rhyme 3:9d3079170b35 731 int16_t data[3] ;
Rhyme 3:9d3079170b35 732 getAccRaw(data) ;
Rhyme 3:9d3079170b35 733 value[0] = acc_range * data[0] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 734 value[1] = acc_range * data[1] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 735 value[2] = acc_range * data[2] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 736 }
Rhyme 3:9d3079170b35 737
Rhyme 3:9d3079170b35 738 float BMI160::getGyrX(void)
Rhyme 3:9d3079170b35 739 {
Rhyme 3:9d3079170b35 740 float value ;
Rhyme 3:9d3079170b35 741 value = gyr_range * getGyrRawX() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 742 return(value) ;
Rhyme 3:9d3079170b35 743 }
Rhyme 3:9d3079170b35 744
Rhyme 3:9d3079170b35 745 float BMI160::getGyrY(void)
Rhyme 3:9d3079170b35 746 {
Rhyme 3:9d3079170b35 747 float value ;
Rhyme 3:9d3079170b35 748 value = gyr_range * getGyrRawY() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 749 return(value) ;
Rhyme 3:9d3079170b35 750 }
Rhyme 3:9d3079170b35 751
Rhyme 3:9d3079170b35 752 float BMI160::getGyrZ(void)
Rhyme 3:9d3079170b35 753 {
Rhyme 3:9d3079170b35 754 float value ;
Rhyme 3:9d3079170b35 755 value = gyr_range * getGyrRawZ() / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 756 return(value) ;
Rhyme 3:9d3079170b35 757 }
Rhyme 3:9d3079170b35 758
Rhyme 3:9d3079170b35 759 void BMI160::getGyr(float *value)
Rhyme 3:9d3079170b35 760 {
Rhyme 3:9d3079170b35 761 int16_t data[3] ;
Rhyme 3:9d3079170b35 762 getGyrRaw(data) ;
Rhyme 3:9d3079170b35 763 value[0] = gyr_range * data[0] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 764 value[1] = gyr_range * data[1] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 765 value[2] = gyr_range * data[2] / FLOAT_MAX_16BIT ;
Rhyme 3:9d3079170b35 766 }