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:
Tue Sep 12 00:34:16 2017 +0000
Parent:
2:4cc456503e9f
Child:
4:93f16677f730
Commit message:
started adding documents

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	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
--- a/BMI160.h	Mon Sep 11 23:53:22 2017 +0000
+++ b/BMI160.h	Tue Sep 12 00:34:16 2017 +0000
@@ -29,27 +29,56 @@
  * BMI160 destructor
  */
   ~BMI160() ;
-  
+
+/**
+ * setCMD set value to the CMD register (0x7E)
+ *
+ * @param cmd uint8_t value to write
+ * @returns none
+ */
   void setCMD(uint8_t cmd) ;
+  
+/**
+ * getStatus get value of the STATUS register (0x1B)
+ * @param none
+ * @returns the value of the STATUS register
+ */
   uint8_t getStatus(void) ;
+  
+/**
+ * getChipID get value of the CHIP_ID register (0x10)
+ * @param none
+ * @returns the chip ID (supposed to be 0xD1)
+ */
   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) ;
+  
+  int16_t getAccRawX(void) ;
+  int16_t getAccRawY(void) ;
+  int16_t getAccRawZ(void) ;
+  int16_t getGyrRawX(void) ;
+  int16_t getGyrRawY(void) ;
+  int16_t getGyrRawZ(void) ;
+  void getAccRaw(int16_t *value) ;
+  void getGyrRaw(int16_t *value) ;
   
-
+  float getAccX(void) ;
+  float getAccY(void) ;
+  float getAccZ(void) ;
+  float getGyrX(void) ;
+  float getGyrY(void) ;
+  float getGyrZ(void) ;
+  void getAcc(float *value) ;
+  void getGyr(float *value) ;
+  
 private:
   SPI *m_spi ;
   I2C *m_i2c ;
   DigitalOut *m_cs ;
   int m_addr ;
+  int acc_range ;
+  int gyr_range ;
   
   void init(void) ;
   void i2c_readRegs(int addr, uint8_t *data, int len) ;