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

Dependents:   test_BMI160 TFT_test_MAX32630FTHR

Revision:
3:9d3079170b35
Parent:
1:d56df81c389b
--- a/BMI160.cpp	Mon Sep 11 23:53:22 2017 +0000
+++ b/BMI160.cpp	Tue Sep 12 00:34:16 2017 +0000
@@ -95,6 +95,8 @@
 #define REG_STEP_CONF_1   0x7B
 #define REG_CMD           0x7E
 
+#define FLOAT_MAX_16BIT   32768.0
+
 /* 0x00 CHIP_ID reset value = 0xD1 */
 /* 0x02 ERR_REG Reports sensor error flags. Flags are cleared when read.
  *      bit[7]   mag_drdy_err
@@ -552,8 +554,11 @@
 
 void BMI160::init(void)
 {
+    acc_range = getAccRange() ;
+    gyr_range = getGyrRange() ;
 }
 
+
 void BMI160::setCMD(uint8_t cmd) 
 {
     uint8_t data[2] ;
@@ -595,6 +600,7 @@
         printf("illegal Acc Range %X detected\n", data & 0x0F) ;
         break ;
     }
+    acc_range = range ;
     return(range) ;
 }
 
@@ -623,10 +629,11 @@
         printf("illegal Gyr Range %d detected\n", data & 0x07) ;
         break ;
     }
+    gyr_range = range ;
     return(range) ;
 }
 
-int16_t BMI160::getAccX(void) 
+int16_t BMI160::getAccRawX(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -635,7 +642,7 @@
     return( value ) ;
 }
 
-int16_t BMI160::getAccY(void) 
+int16_t BMI160::getAccRawY(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -644,7 +651,7 @@
     return( value ) ;
 }
 
-int16_t BMI160::getAccZ(void) 
+int16_t BMI160::getAccRawZ(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -653,7 +660,7 @@
     return( value ) ;
 }
 
-void BMI160::getAcc(int16_t *value)
+void BMI160::getAccRaw(int16_t *value)
 {
     uint8_t data[6] ;
     readRegs(REG_DATA_14, data, 6) ;
@@ -662,7 +669,7 @@
     value[2] = (data[5] << 8) | data[4] ;
 } 
 
-int16_t BMI160::getGyrX(void) 
+int16_t BMI160::getGyrRawX(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -671,7 +678,7 @@
     return( value ) ;
 }
 
-int16_t BMI160::getGyrY(void) 
+int16_t BMI160::getGyrRawY(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -680,7 +687,7 @@
     return( value ) ;
 }
 
-int16_t BMI160::getGyrZ(void) 
+int16_t BMI160::getGyrRawZ(void) 
 {
     uint8_t data[2] ;
     int16_t value = 0 ;
@@ -689,11 +696,71 @@
     return( value ) ;
 }
 
-void BMI160::getGyr(int16_t *value)
+void BMI160::getGyrRaw(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
+} 
+
+float BMI160::getAccX(void)
+{
+    float value ;
+    value = acc_range * getAccRawX() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+float BMI160::getAccY(void)
+{
+    float value ;
+    value = acc_range * getAccRawY() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+float BMI160::getAccZ(void)
+{
+    float value ;
+    value = acc_range * getAccRawZ() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+void BMI160::getAcc(float *value)
+{
+    int16_t data[3] ;
+    getAccRaw(data) ;
+    value[0] = acc_range * data[0] / FLOAT_MAX_16BIT ;
+    value[1] = acc_range * data[1] / FLOAT_MAX_16BIT ;
+    value[2] = acc_range * data[2] / FLOAT_MAX_16BIT ;
+}
+
+float BMI160::getGyrX(void)
+{
+    float value ;
+    value = gyr_range * getGyrRawX() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+float BMI160::getGyrY(void)
+{
+    float value ;
+    value = gyr_range * getGyrRawY() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+float BMI160::getGyrZ(void)
+{
+    float value ;
+    value = gyr_range * getGyrRawZ() / FLOAT_MAX_16BIT ;
+    return(value) ;
+}
+
+void BMI160::getGyr(float *value)
+{
+    int16_t data[3] ;
+    getGyrRaw(data) ;
+    value[0] = gyr_range * data[0] / FLOAT_MAX_16BIT ;
+    value[1] = gyr_range * data[1] / FLOAT_MAX_16BIT ;
+    value[2] = gyr_range * data[2] / FLOAT_MAX_16BIT ;
+}
\ No newline at end of file