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