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

Dependents:   test_BMI160 TFT_test_MAX32630FTHR

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Fri Aug 25 08:23:39 2017 +0000
Parent:
0:9aed6f5a35c0
Child:
2:4cc456503e9f
Commit message:
Minimum data acquisition functions are in place.; Still needs some more work though.

Changed in this revision

BMI160.cpp Show annotated file Show diff for this revision Revisions of this file
BMI160.h Show annotated file Show diff for this revision Revisions of this file
--- 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
--- a/BMI160.h	Fri Aug 25 05:07:26 2017 +0000
+++ b/BMI160.h	Fri Aug 25 08:23:39 2017 +0000
@@ -26,7 +26,20 @@
  */
   ~BMI160() ;
   
+  void setCMD(uint8_t cmd) ;
+  uint8_t getStatus(void) ;
   uint8_t getChipID(void) ;
+  uint8_t getAccRange(void) ;
+  int16_t getGyrRange(void) ;
+  int16_t getAccX(void) ;
+  int16_t getAccY(void) ;
+  int16_t getAccZ(void) ;
+  int16_t getGyrX(void) ;
+  int16_t getGyrY(void) ;
+  int16_t getGyrZ(void) ;
+  void getAcc(int16_t *value) ;
+  void getGyr(int16_t *value) ;
+  
 
 private:
   SPI *m_spi ;
@@ -43,4 +56,13 @@
   void writeRegs(uint8_t *data, int len) ;
 } ;
 
+#define ACC_PMU_SUSPEND  0x00
+#define ACC_PMU_NORMAL   0x01
+#define ACC_PMU_LOWPOWER 0x02
+#define GYR_PMU_SUSPEND  0x00
+#define GYR_PMU_NORMAL   0x01
+#define GYR_PMU_FASTSU   0x03
+#define MAG_PMU_SUSPEND  0x00
+#define MAG_PMU_NORMAL   0x01
+#define MAG_PMU_LOWPOWER 0x02
 #endif /* _BMI160_H_ */
\ No newline at end of file