BMI160 Initial

Dependents:   MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_IMU_HelloWorld MAX32630HSP3_Pitch_Charles Maxim_Squeeks

Revision:
8:a89b529b1d96
Parent:
7:9848196cb65e
Child:
9:ca6b5fecdd63
--- a/bmi160.h	Thu Dec 15 23:46:42 2016 +0000
+++ b/bmi160.h	Tue Dec 20 00:10:04 2016 +0000
@@ -64,6 +64,29 @@
         ACC      ///<g sensor
     };
     
+    ///Sensor Axis
+    enum SensorAxis
+    {
+        X_AXIS = 0,
+        Y_AXIS,
+        Z_AXIS   
+    };
+    
+    ///Structure for axis data
+    struct AxisData
+    {
+        int16_t raw;  ///<Axis raw data
+        float scaled; ///<Axis scaled data 
+    };
+    
+    ///Structure for holding sensor data
+    struct SensorData
+    {
+        AxisData xAxis; ///<Sensor X axis data
+        AxisData yAxis; ///<Sensor Y axis data
+        AxisData zAxis; ///<Sensor Z axis data
+    };
+    
     ///BMI160 registers
     enum Registers
     {
@@ -177,6 +200,7 @@
                          ///<softreset, NVM programming, etc.
     };
     
+    
     ///ERR_REG Bit Mask bit0
     static const uint8_t FATAL_ERR = 0x01;
     ///ERR_REG Bit Mask bits4:1
@@ -201,6 +225,60 @@
         PFD_USED_LPM         ///<Pre-filtered data are used in low power mode
     };
     
+    
+    ///ACC_CONF Bit Mask bits3:0
+    static const uint8_t ACC_ODR = 0x0F;
+    ///ACC_CONF Bit Mask bits6:4 
+    static const uint8_t ACC_BWP = 0x70;
+    ///ACC_CONF Bit Mask bit7
+    static const uint8_t ACC_US = 0x80;
+    
+    ///ACC_CONF bits3:0 codes
+    enum AccOutPutDataRate
+    {
+        ACC_ODR_1 = 1,  ///< 25/32Hz
+        ACC_ODR_2,      ///< 25/16Hz
+        ACC_ODR_3,      ///< 25/8Hz
+        ACC_ODR_4,      ///< 25/4Hz
+        ACC_ODR_5,      ///< 25/2Hz
+        ACC_ODR_6,      ///< 25Hz
+        ACC_ODR_7,      ///< 50Hz
+        ACC_ODR_8,      ///< 100Hz
+        ACC_ODR_9,      ///< 200Hz
+        ACC_ODR_10,     ///< 400Hz
+        ACC_ODR_11,     ///< 800Hz
+        ACC_ODR_12      ///< 1600Hz
+    };
+    
+    ///ACC_CONF bits6:4 codes
+    enum AccBandWidthParam
+    {
+        ACC_BWP_0 = 0, ///< Average 1 cycle
+        ACC_BWP_1,     ///< Average 2 cycles
+        ACC_BWP_2,     ///< Average 4 cycles, use this setting when acc_us = 0
+        ACC_BWP_3,     ///< Average 8 cycles
+        ACC_BWP_4,     ///< Average 16 cycles
+        ACC_BWP_5,     ///< Average 32 cycles
+        ACC_BWP_6,     ///< Average 64 cycles
+        ACC_BWP_7      ///< Average 128 cycles
+    };
+    
+    ///ACC_CONF bit7
+    enum AccUnderSampling
+    {
+        ACC_US_OFF = 0,
+        ACC_US_ON
+    };
+    
+    ///Accelerometer range values
+    enum AccRange
+    {
+        SENS_2G = 0,  ///<Accelerometer range +-2G
+        SENS_4G,      ///<Accelerometer range +-4G
+        SENS_8G,      ///<Accelerometer range +-8G
+        SENS_16G,     ///<Accelerometer range +-16G
+    };
+    
     ///BMI160 Power Modes
     enum PowerModes
     {
@@ -215,8 +293,8 @@
     {
         START_FOC = 0x03,        ///<Starts Fast Offset Calibrartion 
         ACC_SET_PMU_MODE = 0x10, ///<Sets acc power mode
-        GYR_SET_PMU_MODE = 0x14,        ///<Sets gyro power mode
-        MAG_SET_PMU_MODE = 0x18,        ///<Sets mag power mode
+        GYR_SET_PMU_MODE = 0x14, ///<Sets gyro power mode
+        MAG_SET_PMU_MODE = 0x18, ///<Sets mag power mode
         PROG_NVM = 0xA0,         ///<Writes NVM backed registers into NVM
         FIFO_FLUSH = 0xB0,       ///<Clears FIFO
         INT_RESET,               ///<Clears interrupt engine, INT_STATUS, and 
@@ -324,16 +402,53 @@
     int32_t getTemperature(float *temp);
     
     
-    ///@brief fx documentation template.\n
+    ///@brief Read data registers and sensortime.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - buffer at least 23 bytes long
+    ///
+    ///On Exit:
+    ///@param[out] data - holds raw sensor data on success
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getSensorDataAndTime(uint8_t *data);
+    
+    
+    ///@brief Get accelerometer axis as float.\n
     ///
     ///On Entry:
-    ///@param[in] none 
+    ///@param[in] axis - Sensor axis
+    ///@param[in] data - AxisData structure
+    ///
+    ///On Exit:
+    ///@param[out] data - Structure holds raw and scaled axis data
+    ///
+    ///@returns 0 on success, non 0 on failure
+    int32_t getAccAxis(SensorAxis axis, AxisData &data);
+    
+    
+    ///@brief Get accelerometer xyz axis as float.\n
+    ///
+    ///On Entry:
+    ///@param[in] data - SensorData structure
     ///
     ///On Exit:
-    ///@param[out] none
+    ///@param[out] data - Structure holds raw and scaled data for all three axis
     ///
-    ///@returns none
+    ///@returns 0 on success, non 0 on failure
+    int32_t getAccXYZ(SensorData &data);
+
+    
+protected:
 
+    struct AccConfig
+    {
+        AccRange range;
+        AccUnderSampling us;
+        AccBandWidthParam bwp;
+        AccOutPutDataRate odr;
+    };
+    
 };
 
 
@@ -410,3 +525,14 @@
 };
 
 #endif /* BMI160_H */
+
+
+///@brief fx documentation template.\n
+///
+///On Entry:
+///@param[in] none 
+///
+///On Exit:
+///@param[out] none
+///
+///@returns none