|
|
@@ -0,0 +1,1289 @@
|
|
|
+#include "H3LIS331DL.h"
|
|
|
+#include <Wire.h>
|
|
|
+
|
|
|
+void H3LIS331DL::init(H3LIS331DL_ODR_t odr,H3LIS331DL_Mode_t mode,H3LIS331DL_Fullscale_t fullScale){
|
|
|
+
|
|
|
+ Wire.begin();
|
|
|
+ //set output data rate
|
|
|
+ setODR(odr);
|
|
|
+ //set PowerMode
|
|
|
+ setMode( mode);
|
|
|
+ //set Fullscale
|
|
|
+ setFullScale( fullScale);
|
|
|
+ //set axis Enable
|
|
|
+ setAxis( H3LIS331DL_X_ENABLE | H3LIS331DL_Y_ENABLE | H3LIS331DL_Z_ENABLE);
|
|
|
+}
|
|
|
+
|
|
|
+void H3LIS331DL::importPara(int16_t val_x, int16_t val_y, int16_t val_z)
|
|
|
+{
|
|
|
+ _adjVal[0] = val_x;
|
|
|
+ _adjVal[1] = val_y;
|
|
|
+ _adjVal[2] = val_z;
|
|
|
+}
|
|
|
+void H3LIS331DL::readXYZ(int16_t* x, int16_t* y, int16_t* z)
|
|
|
+{
|
|
|
+ //get Acceleration Raw data
|
|
|
+ AxesRaw_t data;
|
|
|
+ status_t response = getAccAxesRaw(&data);
|
|
|
+ if(MEMS_SUCCESS == response){
|
|
|
+ *x = (data.AXIS_X - _adjVal[0]);
|
|
|
+ *y = (data.AXIS_Y - _adjVal[1]);
|
|
|
+ *z = (data.AXIS_Z - _adjVal[2]);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void H3LIS331DL::getAcceleration(double* xyz)
|
|
|
+{
|
|
|
+ AxesRaw_t data;
|
|
|
+ double gains = 0.003;
|
|
|
+ getAccAxesRaw(&data);
|
|
|
+
|
|
|
+ xyz[0] = (data.AXIS_X - _adjVal[0]) * gains;
|
|
|
+ xyz[1] = (data.AXIS_Y - _adjVal[1]) * gains;
|
|
|
+ xyz[2] = (data.AXIS_Z - _adjVal[2]) * gains;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getWHO_AM_I
|
|
|
+* Description : Read identification code from H3LIS331DL::WHO_AM_I register
|
|
|
+* Input : char to be filled with the Device identification Value
|
|
|
+* Output : None
|
|
|
+* Return : Status [value of FSS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getWHO_AM_I(byte* val){
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_WHO_AM_I, val) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setODR
|
|
|
+* Description : Sets H3LIS331DL Accelerometer Output Data Rate
|
|
|
+* Input : Output Data Rate
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setODR(H3LIS331DL_ODR_t dr){
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xE7;
|
|
|
+ value |= dr<<H3LIS331DL_DR;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setMode
|
|
|
+* Description : Sets H3LIS331DLH Accelerometer Operating Mode
|
|
|
+* Input : Modality (H3LIS331DL_LOW_POWER, H3LIS331DL_NORMAL, H3LIS331DL_POWER_DOWN...)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setMode(H3LIS331DL_Mode_t pm) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x1F;
|
|
|
+ value |= (pm<<H3LIS331DL_PM);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setAxis
|
|
|
+* Description : Enable/Disable LIS331DLH Axis
|
|
|
+* Input : H3LIS331DL_X_ENABLE/H3LIS331DL_X_DISABLE | H3LIS331DL_Y_ENABLE/H3LIS331DL_Y_DISABLE
|
|
|
+ | H3LIS331DL_Z_ENABLE/H3LIS331DL_Z_DISABLE
|
|
|
+* Output : None
|
|
|
+* Note : You MUST use all input variable in the argument, as example
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setAxis(H3LIS331DL_Axis_t axis) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xF8;
|
|
|
+ value |= (0x07 & axis);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG1, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setFullScale
|
|
|
+* Description : Sets the LIS331DLH FullScale
|
|
|
+* Input : H3LIS331DL_FULLSCALE_2/H3LIS331DL_FULLSCALE_4/H3LIS331DL_FULLSCALE_8
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setFullScale(H3LIS331DL_Fullscale_t fs) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xCF;
|
|
|
+ value |= (fs<<H3LIS331DL_FS);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setBDU
|
|
|
+* Description : Enable/Disable Block Data Update Functionality
|
|
|
+* Input : MEMS_ENABLE/MEMS_DISABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setBDU(State_t bdu) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x7F;
|
|
|
+ value |= (bdu<<H3LIS331DL_BDU);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setBLE
|
|
|
+* Description : Set Endianess (MSB/LSB)
|
|
|
+* Input : H3LIS331DL_BLE_LSB / H3LIS331DL_BLE_MSB
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setBLE(H3LIS331DL_Endianess_t ble) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xBF;
|
|
|
+ value |= (ble<<H3LIS331DL_BLE);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setFDS
|
|
|
+* Description : Set Filter Data Selection
|
|
|
+* Input : MEMS_ENABLE/MEMS_DISABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setFDS(State_t fds) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xEF;
|
|
|
+ value |= (fds<<H3LIS331DL_FDS);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setBOOT
|
|
|
+* Description : Rebot memory content
|
|
|
+* Input : MEMS_ENABLE/MEMS_DISABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setBOOT(State_t boot) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x7F;
|
|
|
+ value |= (boot<<H3LIS331DL_BOOT);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setSelfTest
|
|
|
+* Description : Set Self Test Modality
|
|
|
+* Input : MEMS_DISABLE/MEMS_ENABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setSelfTest(State_t st) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFD;
|
|
|
+ value |= (st<<H3LIS331DL_ST);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setSelfTestSign
|
|
|
+* Description : Set Self Test Sign (Disable = st_plus, Enable = st_minus)
|
|
|
+* Input : MEMS_DISABLE/MEMS_ENABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setSelfTestSign(State_t st_sign) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xF7;
|
|
|
+ value |= (st_sign<<H3LIS331DL_ST_SIGN);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setIntHighLow
|
|
|
+* Description : Set Interrupt active state (Disable = active high, Enable = active low)
|
|
|
+* Input : MEMS_DISABLE/MEMS_ENABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setIntHighLow(State_t ihl) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x7F;
|
|
|
+ value |= (ihl<<H3LIS331DL_IHL);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setIntPPOD
|
|
|
+* Description : Set Interrupt Push-Pull/OpenDrain Pad (Disable = Push-Pull, Enable = OpenDrain)
|
|
|
+* Input : MEMS_DISABLE/MEMS_ENABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setIntPPOD(State_t pp_od) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xBF;
|
|
|
+ value |= (pp_od<<H3LIS331DL_PP_OD);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1DataSign
|
|
|
+* Description : Set Data signal Interrupt 1 pad
|
|
|
+* Input : Modality by H3LIS331DL_INT_Conf_t Typedef
|
|
|
+ (H3LIS331DL_INT_SOURCE, H3LIS331DL_INT_1OR2_SOURCE, H3LIS331DL_DATA_READY, H3LIS331DL_BOOT_RUNNING)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1DataSign(H3LIS331DL_INT_Conf_t i_cfg) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFC;
|
|
|
+ value |= (i_cfg<<H3LIS331DL_I1_CFG);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2DataSign
|
|
|
+* Description : Set Data signal Interrupt 2 pad
|
|
|
+* Input : Modality by H3LIS331DL_INT_Conf_t Typedef
|
|
|
+ (H3LIS331DL_INT_SOURCE, H3LIS331DL_INT_1OR2_SOURCE, H3LIS331DL_DATA_READY, H3LIS331DL_BOOT_RUNNING)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2DataSign(H3LIS331DL_INT_Conf_t i_cfg) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xE7;
|
|
|
+ value |= (i_cfg<<H3LIS331DL_I2_CFG);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setSPI34Wire
|
|
|
+* Description : Set SPI mode
|
|
|
+* Input : Modality by H3LIS331DL_SPIMode_t Typedef (H3LIS331DL_SPI_4_WIRE, H3LIS331DL_SPI_3_WIRE)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setSPI34Wire(H3LIS331DL_SPIMode_t sim) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFE;
|
|
|
+ value |= (sim<<H3LIS331DL_SIM);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG4, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : turnONEnable
|
|
|
+* Description : TurnON Mode selection for sleep to wake function
|
|
|
+* Input : H3LIS331DL_SLEEP_TO_WAKE_DIS/H3LIS331DL_SLEEP_TO_WAKE_ENA
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::turnONEnable(H3LIS331DL_Sleep_To_Wake_Conf_t stw) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG5, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x00;
|
|
|
+ value |= (stw<<H3LIS331DL_TURN_ON);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG5, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+#if 0
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : HPFilterReset
|
|
|
+* Description : Reading register for reset the content of internal HP filter
|
|
|
+* Input : None
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::HPFilterReset(void) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_HP_FILTER_RESET, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setReference
|
|
|
+* Description : Sets Reference register acceleration value as a reference for HP filter
|
|
|
+* Input : Value of reference acceleration value (0-255)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setReference(int8_t ref) {
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_REFERENCE_REG, ref) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setHPFMode
|
|
|
+* Description : Set High Pass Filter Modality
|
|
|
+* Input : H3LIS331DL_HPM_NORMAL_MODE_RES/H3LIS331DL_HPM_REF_SIGNAL/H3LIS331DL_HPM_NORMAL_MODE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setHPFMode(H3LIS331DL_HPFMode_t hpm) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x9F;
|
|
|
+ value |= (hpm<<H3LIS331DL_HPM);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setHPFCutOFF
|
|
|
+* Description : Set High Pass CUT OFF Freq
|
|
|
+* Input : H3LIS331DL_HPFCF [0,3]
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setHPFCutOFF(H3LIS331DL_HPFCutOffFreq_t hpf) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFC;
|
|
|
+ value |= (hpf<<H3LIS331DL_HPCF);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2HPEnable
|
|
|
+* Description : Set Interrupt2 hp filter enable/disable
|
|
|
+* Input : MEMS_ENABLE/MEMS_DISABLE
|
|
|
+* example : H3LIS331DL_SetInt2HPEnable(MEMS_ENABLE)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2HPEnable(State_t stat) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xF7;
|
|
|
+ value |= stat<<H3LIS331DL_HPEN2 ;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1HPEnable
|
|
|
+* Description : Set Interrupt1 hp filter enable/disable
|
|
|
+* Input : MEMS_ENABLE/MEMS_DISABLE
|
|
|
+* example : H3LIS331DL_SetInt1HPEnable(MEMS_ENABLE)
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1HPEnable(State_t stat) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFB;
|
|
|
+ value |= stat<<H3LIS331DL_HPEN1 ;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG2, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : int1LatchEnable
|
|
|
+* Description : Enable Interrupt 1 Latching function
|
|
|
+* Input : ENABLE/DISABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::int1LatchEnable(State_t latch) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xFB;
|
|
|
+ value |= latch<<H3LIS331DL_LIR1;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : int2LatchEnable
|
|
|
+* Description : Enable Interrupt 2 Latching function
|
|
|
+* Input : ENABLE/DISABLE
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::int2LatchEnable(State_t latch) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0xDF;
|
|
|
+ value |= latch<<H3LIS331DL_LIR2;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_CTRL_REG3, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : resetInt1Latch
|
|
|
+* Description : Reset Interrupt 1 Latching function
|
|
|
+* Input : None
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::resetInt1Latch(void) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : resetInt2Latch
|
|
|
+* Description : Reset Interrupt 2 Latching function
|
|
|
+* Input : None
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::resetInt2Latch(void) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1Configuration
|
|
|
+* Description : Interrupt 1 Configuration (without 6D_INT)
|
|
|
+* Input : H3LIS331DL_INT_AND/OR | H3LIS331DL_INT_ZHIE_ENABLE/DISABLE | H3LIS331DL_INT_ZLIE_ENABLE/DISABLE...
|
|
|
+* Output : None
|
|
|
+* Note : You MUST use ALL input variable in the argument, as in example above
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1Configuration(H3LIS331DL_IntConf_t ic) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x40;
|
|
|
+ value |= ic;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2Configuration
|
|
|
+* Description : Interrupt 2 Configuration (without 6D_INT)
|
|
|
+* Input : H3LIS331DL_INT_AND/OR | H3LIS331DL_INT_ZHIE_ENABLE/DISABLE | H3LIS331DL_INT_ZLIE_ENABLE/DISABLE...
|
|
|
+* Output : None
|
|
|
+* Note : You MUST use all input variable in the argument, as example
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2Configuration(H3LIS331DL_IntConf_t ic) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x40;
|
|
|
+ value |= ic;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1Mode
|
|
|
+* Description : Interrupt 1 Configuration mode (OR, 6D Movement, AND, 6D Position)
|
|
|
+* Input : H3LIS331DL_INT_MODE_OR, H3LIS331DL_INT_MODE_6D_MOVEMENT, H3LIS331DL_INT_MODE_AND, H3LIS331DL_INT_MODE_6D_POSITION
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1Mode(H3LIS331DL_IntMode_t int_mode) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x3F;
|
|
|
+ value |= (int_mode<<H3LIS331DL_INT_6D);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_CFG, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2Mode
|
|
|
+* Description : Interrupt 2 Configuration mode (OR, 6D Movement, AND, 6D Position)
|
|
|
+* Input : H3LIS331DL_INT_MODE_OR, H3LIS331DL_INT_MODE_6D_MOVEMENT, H3LIS331DL_INT_MODE_AND, H3LIS331DL_INT_MODE_6D_POSITION
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2Mode(H3LIS331DL_IntMode_t int_mode) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x3F;
|
|
|
+ value |= (int_mode<<H3LIS331DL_INT_6D);
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_CFG, value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : get6DPositionInt1
|
|
|
+* Description : 6D Interrupt 1 Position Detect
|
|
|
+* Input : Byte to be filled with H3LIS331DL_POSITION_6D_t Typedef
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::get6DPositionInt1(byte* val){
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x7F;
|
|
|
+
|
|
|
+ switch (value){
|
|
|
+ case H3LIS331DL_UP_SX:
|
|
|
+ *val = H3LIS331DL_UP_SX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_UP_DX:
|
|
|
+ *val = H3LIS331DL_UP_DX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_DW_SX:
|
|
|
+ *val = H3LIS331DL_DW_SX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_DW_DX:
|
|
|
+ *val = H3LIS331DL_DW_DX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_TOP:
|
|
|
+ *val = H3LIS331DL_TOP;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_BOTTOM:
|
|
|
+ *val = H3LIS331DL_BOTTOM;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : get6DPositionInt2
|
|
|
+* Description : 6D Interrupt 2 Position Detect
|
|
|
+* Input : Byte to be filled with H3LIS331DL_POSITION_6D_t Typedef
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::get6DPositionInt2(byte* val){
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ value &= 0x7F;
|
|
|
+
|
|
|
+ switch (value){
|
|
|
+ case H3LIS331DL_UP_SX:
|
|
|
+ *val = H3LIS331DL_UP_SX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_UP_DX:
|
|
|
+ *val = H3LIS331DL_UP_DX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_DW_SX:
|
|
|
+ *val = H3LIS331DL_DW_SX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_DW_DX:
|
|
|
+ *val = H3LIS331DL_DW_DX;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_TOP:
|
|
|
+ *val = H3LIS331DL_TOP;
|
|
|
+ break;
|
|
|
+ case H3LIS331DL_BOTTOM:
|
|
|
+ *val = H3LIS331DL_BOTTOM;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1Threshold
|
|
|
+* Description : Sets Interrupt 1 Threshold
|
|
|
+* Input : Threshold = [0,127]
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1Threshold(byte ths) {
|
|
|
+ if (ths > 127)
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_THS, ths) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt1Duration
|
|
|
+* Description : Sets Interrupt 1 Duration
|
|
|
+* Input : Duration = [0,127]
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt1Duration(byte id) {
|
|
|
+ if (id > 127)
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_DURATION, id) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2Threshold
|
|
|
+* Description : Sets Interrupt 2 Threshold
|
|
|
+* Input : Threshold = [0,127]
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2Threshold(byte ths) {
|
|
|
+ if (ths > 127)
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_THS, ths) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : setInt2Duration
|
|
|
+* Description : Sets Interrupt 2 Duration
|
|
|
+* Input : Duration = [0,127]
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::setInt2Duration(byte id) {
|
|
|
+ if (id > 127)
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if( !writeReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_DURATION, id) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getStatusReg
|
|
|
+* Description : Read the status register
|
|
|
+* Input : char to empty by Status Reg Value
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getStatusReg(byte* val) {
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_STATUS_REG, val) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getStatusBIT
|
|
|
+* Description : Read the status register BIT
|
|
|
+* Input : H3LIS331DL_STATUS_REG_ZYXOR, H3LIS331DL_STATUS_REG_ZOR, H3LIS331DL_STATUS_REG_YOR, H3LIS331DL_STATUS_REG_XOR,
|
|
|
+ H3LIS331DL_STATUS_REG_ZYXDA, H3LIS331DL_STATUS_REG_ZDA, H3LIS331DL_STATUS_REG_YDA, H3LIS331DL_STATUS_REG_XDA,
|
|
|
+ H3LIS331DL_DATAREADY_BIT
|
|
|
+* Output : status register BIT
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getStatusBit(byte statusBIT, byte *val) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_STATUS_REG, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ switch (statusBIT){
|
|
|
+ case H3LIS331DL_STATUS_REG_ZYXOR:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_ZYXOR){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_ZOR:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_ZOR){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_YOR:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_YOR){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_XOR:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_XOR){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_ZYXDA:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_ZYXDA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_ZDA:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_ZDA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_YDA:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_YDA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ case H3LIS331DL_STATUS_REG_XDA:
|
|
|
+ if(value &= H3LIS331DL_STATUS_REG_XDA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return MEMS_ERROR;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getAccAxesRaw
|
|
|
+* Description : Read the Acceleration Values Output Registers
|
|
|
+* Input : buffer to empty by AccAxesRaw_t Typedef
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getAccAxesRaw(AxesRaw_t* buff) {
|
|
|
+ byte valueL = 0,valueH = 0;
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_X_L, &valueL);
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_X_H, &valueH);
|
|
|
+ buff->AXIS_X = (valueH<<8)|valueL;
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Y_L, &valueL);
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Y_H, &valueH);
|
|
|
+ buff->AXIS_Y = (valueH<<8)|valueL;
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Z_L, &valueL);
|
|
|
+ readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_OUT_Z_H, &valueH);
|
|
|
+ buff->AXIS_Z = (valueH<<8)|valueL;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getInt1Src
|
|
|
+* Description : Reset Interrupt 1 Latching function
|
|
|
+* Input : buffer to empty by Int1 Source Value
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getInt1Src(byte* val) {
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, val) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getInt2Src
|
|
|
+* Description : Reset Interrupt 2 Latching function
|
|
|
+* Input : buffer to empty by Int2 Source Value
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getInt2Src(byte* val) {
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, val) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getInt1SrcBit
|
|
|
+* Description : Reset Interrupt 1 Latching function
|
|
|
+* Input : H3LIS331DL_INT1_SRC_IA, H3LIS331DL_INT1_SRC_ZH, H3LIS331DL_INT1_SRC_ZL .....
|
|
|
+* Output : None
|
|
|
+* Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getInt1SrcBit(byte statusBIT, byte *val) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT1_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_IA){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_IA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_ZH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_ZH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_ZL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_ZL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_YH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_YH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_YL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_YL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_XH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_XH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_XL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_XL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return MEMS_ERROR;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : getInt2SrcBit
|
|
|
+* Description : Reset Interrupt 2 Latching function
|
|
|
+* Input : H3LIS331DL_INT_SRC_IA, H3LIS331DL_INT_SRC_ZH, H3LIS331DL_INT_SRC_ZL .....
|
|
|
+* Output : None
|
|
|
+* Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+status_t H3LIS331DL::getInt2SrcBit(byte statusBIT, byte *val) {
|
|
|
+ byte value;
|
|
|
+
|
|
|
+ if( !readReg(H3LIS331DL_MEMS_I2C_ADDRESS, H3LIS331DL_INT2_SRC, &value) )
|
|
|
+ return MEMS_ERROR;
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_IA){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_IA){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_ZH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_ZH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_ZL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_ZL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_YH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_YH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_YL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_YL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_XH){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_XH){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(statusBIT == H3LIS331DL_INT_SRC_XL){
|
|
|
+ if(value &= H3LIS331DL_INT_SRC_XL){
|
|
|
+ *val = MEMS_SET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *val = MEMS_RESET;
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return MEMS_ERROR;
|
|
|
+}
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : readReg
|
|
|
+* Description : Generic Reading function. It must be full filled with either
|
|
|
+* : I2C or SPI reading functions
|
|
|
+* Input : Register Address
|
|
|
+* Output : Data Read
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+uint8_t H3LIS331DL::readReg(byte deviceAddr, byte Reg, byte* Data) {
|
|
|
+
|
|
|
+ //To be completed with either I2c or SPI reading function
|
|
|
+ // i.e. *Data = SPI_Mems_Read_Reg( Reg );
|
|
|
+ // i.e. if(!I2C_BufferRead(Data, deviceAddr, Reg, 1))
|
|
|
+ // return MEMS_ERROR;
|
|
|
+ // else
|
|
|
+ // return MEMS_SUCCESS;
|
|
|
+// Reads num bytes starting from address register on device in to _buff array
|
|
|
+ byte num = 1;
|
|
|
+ Wire.beginTransmission(deviceAddr); // start transmission to device
|
|
|
+ Wire.write(Reg); // sends address to read from
|
|
|
+ Wire.endTransmission(); // end transmission
|
|
|
+
|
|
|
+ Wire.beginTransmission(deviceAddr); // start transmission to device
|
|
|
+ Wire.requestFrom(deviceAddr,num); // request 6 bytes from device
|
|
|
+
|
|
|
+ if(Wire.available()){
|
|
|
+ *Data = Wire.read(); // receive a byte
|
|
|
+ Wire.endTransmission(); // end transmission
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+ }else{
|
|
|
+ Wire.endTransmission();
|
|
|
+ return MEMS_ERROR;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*******************************************************************************
|
|
|
+* Function Name : writeReg
|
|
|
+* Description : Generic Writing function. It must be full filled with either
|
|
|
+* : I2C or SPI writing function
|
|
|
+* Input : Register Address, Data to be written
|
|
|
+* Output : None
|
|
|
+* Return : Status [MEMS_ERROR, MEMS_SUCCESS]
|
|
|
+*******************************************************************************/
|
|
|
+uint8_t H3LIS331DL::writeReg(byte deviceAddress, byte WriteAddr, byte Data) {
|
|
|
+
|
|
|
+ //To be completed with either I2c or SPI writing function
|
|
|
+ // i.e. SPI_Mems_Write_Reg(Reg, Data);
|
|
|
+ // i.e. I2C_ByteWrite(&Data, deviceAddress, WriteAddr);
|
|
|
+ // return MEMS_SUCCESS;
|
|
|
+ // Writes val to address register on device
|
|
|
+ Wire.beginTransmission(deviceAddress); // start transmission to device
|
|
|
+ Wire.write(WriteAddr); // send register address
|
|
|
+ Wire.write(Data); // send value to write
|
|
|
+ Wire.endTransmission(); // end transmission
|
|
|
+ return MEMS_SUCCESS;
|
|
|
+}
|