My implementation of Bosh BMI160 Only I2C is tested so far.
Dependents: test_BMI160 TFT_test_MAX32630FTHR
Diff: BMI160.cpp
- Revision:
- 1:d56df81c389b
- Parent:
- 0:9aed6f5a35c0
- Child:
- 3:9d3079170b35
--- a/BMI160.cpp Fri Aug 25 05:07:26 2017 +0000 +++ b/BMI160.cpp Fri Aug 25 08:23:39 2017 +0000 @@ -96,12 +96,21 @@ #define REG_CMD 0x7E /* 0x00 CHIP_ID reset value = 0xD1 */ -/* 0x02 ERR_REG +/* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read. * bit[7] mag_drdy_err - * bit[6] drop_cmd_err + * bit[6] drop_cmd_err Dropped command to Register * bit[5] i2c_fail_err - * bit[4:1] err_code - * bit[0] fatal_err + * bit[4:1] err_code error code + * 0000: no error + * 0001: error + * 0010: error + * 0011: low-power mode and interrupt uses pre-filtered data + * 0100-0101: reserved + * 0110: ODRs of enabled sensors in headerless mode do not match + * 0111: pre-filtered data are used in low power mode + * 1000-1111: reserved + * The first reported error will be shown in the error code + * bit[0] fatal_err : Chip not operatable */ /* 0x03 PMU_STATUS * bit[7:6] (reserved) @@ -545,9 +554,146 @@ { } +void BMI160::setCMD(uint8_t cmd) +{ + uint8_t data[2] ; + data[0] = REG_CMD ; + data[1] = cmd ; + writeRegs(data, 2) ; +} + +uint8_t BMI160::getStatus(void) +{ + uint8_t status ; + readRegs(REG_STATUS, &status, 1) ; + return(status) ; +} + uint8_t BMI160::getChipID(void) { uint8_t data ; readRegs(REG_CHIP_ID, &data, 1) ; return( data ) ; -} \ No newline at end of file +} + +uint8_t BMI160::getAccRange(void) +{ + uint8_t data = 0 ; + uint8_t range = 0 ; + readRegs(REG_ACC_RANGE, &data, 1) ; + switch(data & 0x0F) { + case 3: /* +/- 2g */ + range = 2 ; + break ; + case 5: /* +/- 4g */ + range = 4 ; + break ; + case 8: /* +/- 8g */ + range = 8 ; + break ; + default: + printf("illegal Acc Range %X detected\n", data & 0x0F) ; + break ; + } + return(range) ; +} + +int16_t BMI160::getGyrRange(void) +{ + uint8_t data = 0 ; + int16_t range = 0 ; + readRegs(REG_GYR_RANGE, &data, 1) ; + switch(data & 0x07) { + case 0: + range = 2000 ; + break ; + case 1: + range = 1000 ; + break ; + case 2: + range = 500 ; + break ; + case 3: + range = 250 ; + break ; + case 4: + range = 125 ; + break ; + default: + printf("illegal Gyr Range %d detected\n", data & 0x07) ; + break ; + } + return(range) ; +} + +int16_t BMI160::getAccX(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_14, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +int16_t BMI160::getAccY(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_16, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +int16_t BMI160::getAccZ(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_18, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +void BMI160::getAcc(int16_t *value) +{ + uint8_t data[6] ; + readRegs(REG_DATA_14, data, 6) ; + value[0] = (data[1] << 8) | data[0] ; + value[1] = (data[3] << 8) | data[2] ; + value[2] = (data[5] << 8) | data[4] ; +} + +int16_t BMI160::getGyrX(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_8, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +int16_t BMI160::getGyrY(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_10, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +int16_t BMI160::getGyrZ(void) +{ + uint8_t data[2] ; + int16_t value = 0 ; + readRegs(REG_DATA_12, data, 2) ; + value = (data[1] << 8) | data[0] ; + return( value ) ; +} + +void BMI160::getGyr(int16_t *value) +{ + uint8_t data[6] ; + readRegs(REG_DATA_8, data, 6) ; + value[0] = (data[1] << 8) | data[0] ; + value[1] = (data[3] << 8) | data[2] ; + value[2] = (data[5] << 8) | data[4] ; +} \ No newline at end of file