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

Dependents:   test_BMI160 TFT_test_MAX32630FTHR

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