LIS3DH & BLE broadcast example for VTT Node V3 & mbed
Dependencies: BLE_API TMP_nrf51 mbed nRF51822
LIS3DH.cpp
- Committer:
- jejuho
- Date:
- 2015-12-08
- Revision:
- 0:de3e4a57ebe0
File content as of revision 0:de3e4a57ebe0:
#include "LIS3DH.h" LIS3DH::LIS3DH(PinName mosi, PinName miso, PinName ss, PinName sck): _spi(mosi,miso,sck), _ss(ss){ // Make sure CS is high _ss = 1; // Setup the spi for 8 bit data, high steady state clock, // second edge capture, with a 1MHz clock rate _spi.format(8,3); _spi.frequency(8000000); } u8_t LIS3DH::InitLIS3DH(LIS3DH_Mode_t Mode, LIS3DH_ODR_t Odr, LIS3DH_Fullscale_t Grange) { uint8_t response; uint8_t Tmp; LIS3DH_GetWHO_AM_I(&Tmp); response = LIS3DH_SetODR(Odr); //set PowerMode response = LIS3DH_SetMode(Mode); //set Fullscale response = LIS3DH_SetFullScale(Grange); //set axis Enable response = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE); return response; } /******************************************************************************* * Function Name : LIS3DH_GetStatusAUX * Description : Read the AUX status register * Input : Char to empty by status register buffer * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetStatusAUX(u8_t* val) { if( !LIS3DH_ReadReg(LIS3DH_STATUS_AUX, val) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetStatusAUXBIT * Description : Read the AUX status register BIT * Input : LIS3DH_STATUS_AUX_321OR, LIS3DH_STATUS_AUX_3OR, LIS3DH_STATUS_AUX_2OR, LIS3DH_STATUS_AUX_1OR, LIS3DH_STATUS_AUX_321DA, LIS3DH_STATUS_AUX_3DA, LIS3DH_STATUS_AUX_2DA, LIS3DH_STATUS_AUX_1DA * Output : None * Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetStatusAUXBit(u8_t statusBIT, u8_t* val) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_STATUS_AUX, &value) ) return MEMS_ERROR; if(statusBIT == LIS3DH_STATUS_AUX_321OR){ if(value &= LIS3DH_STATUS_AUX_321OR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_3OR){ if(value &= LIS3DH_STATUS_AUX_3OR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_2OR){ if(value &= LIS3DH_STATUS_AUX_2OR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_1OR){ if(value &= LIS3DH_STATUS_AUX_1OR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_321DA){ if(value &= LIS3DH_STATUS_AUX_321DA) { *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_3DA){ if(value &= LIS3DH_STATUS_AUX_3DA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_2DA){ if(value &= LIS3DH_STATUS_AUX_2DA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_STATUS_AUX_1DA){ if(value &= LIS3DH_STATUS_AUX_1DA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } return MEMS_ERROR; } u8_t LIS3DH::SetLIS3DHActivityDetection(uint8_t Th, LIS3DH_Int1Mode_t Mode, uint8_t OnOff) { uint8_t response; response = LIS3DH_SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_DISABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE | LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE | LIS3DH_I1_DRDY1_ON_INT1_DISABLE | LIS3DH_I1_DRDY2_ON_INT1_DISABLE | LIS3DH_WTM_ON_INT1_DISABLE | LIS3DH_INT1_OVERRUN_DISABLE ); //set Interrupt Threshold response = LIS3DH_SetInt1Threshold(Th); //set Interrupt configuration (all enabled) if(OnOff) { response = LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_ENABLE | LIS3DH_INT1_ZLIE_ENABLE | LIS3DH_INT1_YHIE_ENABLE | LIS3DH_INT1_YLIE_ENABLE | LIS3DH_INT1_XHIE_ENABLE | LIS3DH_INT1_XLIE_ENABLE ); } else { response = LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_DISABLE | LIS3DH_INT1_ZLIE_DISABLE | LIS3DH_INT1_YHIE_DISABLE | LIS3DH_INT1_YLIE_DISABLE | LIS3DH_INT1_XHIE_DISABLE | LIS3DH_INT1_XLIE_DISABLE ); } //set Interrupt Mode response = LIS3DH_SetIntMode(Mode); return response; } /******************************************************************************* * Function Name : LIS3DH_SetODR * Description : Sets LIS3DH Output Data Rate * Input : Output Data Rate * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetODR(LIS3DH_ODR_t ov){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) ) return MEMS_ERROR; value &= 0x0f; value |= ov<<LIS3DH_ODR_BIT; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetMode * Description : Sets LIS3DH Operating Mode * Input : Modality (LIS3DH_NORMAL, LIS3DH_LOW_POWER, LIS3DH_POWER_DOWN) * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetMode(LIS3DH_Mode_t md) { u8_t value; u8_t value2; static u8_t ODR_old_value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value2) ) return MEMS_ERROR; if((value & 0xF0)==0) value = value | (ODR_old_value & 0xF0); //if it comes from POWERDOWN switch(md) { case LIS3DH_POWER_DOWN: ODR_old_value = value; value &= 0x0F; break; case LIS3DH_NORMAL: value &= 0xF7; value |= (MEMS_RESET<<LIS3DH_LPEN); value2 &= 0xF7; value2 |= (MEMS_SET<<LIS3DH_HR); //set HighResolution_BIT break; case LIS3DH_LOW_POWER: value &= 0xF7; value |= (MEMS_SET<<LIS3DH_LPEN); value2 &= 0xF7; value2 |= (MEMS_RESET<<LIS3DH_HR); //reset HighResolution_BIT break; default: return MEMS_ERROR; } if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) ) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value2) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetAxis * Description : Enable/Disable LIS3DH Axis * Input : LIS3DH_X_ENABLE/DISABLE | LIS3DH_Y_ENABLE/DISABLE | LIS3DH_Z_ENABLE/DISABLE * Output : None * Note : You MUST use all input variable in the argument, as example * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetAxis(LIS3DH_Axis_t axis) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG1, &value) ) return MEMS_ERROR; value &= 0xF8; value |= (0x07 & axis); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG1, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetFullScale * Description : Sets the LIS3DH FullScale * Input : LIS3DH_FULLSCALE_2/LIS3DH_FULLSCALE_4/LIS3DH_FULLSCALE_8/LIS3DH_FULLSCALE_16 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetFullScale(LIS3DH_Fullscale_t fs) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xCF; value |= (fs<<LIS3DH_FS); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetBDU * Description : Enable/Disable Block Data Update Functionality * Input : ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetBDU(State_t bdu) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0x7F; value |= (bdu<<LIS3DH_BDU); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetBLE * Description : Set Endianess (MSB/LSB) * Input : BLE_LSB / BLE_MSB * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetBLE(LIS3DH_Endianess_t ble) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xBF; value |= (ble<<LIS3DH_BLE); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetSelfTest * Description : Set Self Test Modality * Input : LIS3DH_SELF_TEST_DISABLE/ST_0/ST_1 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetSelfTest(LIS3DH_SelfTest_t st) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xF9; value |= (st<<LIS3DH_ST); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_HPFClick * Description : Enable/Disable High Pass Filter for click * Input : MEMS_ENABLE/MEMS_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_HPFClickEnable(State_t hpfe) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xFB; value |= (hpfe<<LIS3DH_HPCLICK); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_HPFAOI1 * Description : Enable/Disable High Pass Filter for AOI on INT_1 * Input : MEMS_ENABLE/MEMS_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_HPFAOI1Enable(State_t hpfe) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xFE; value |= (hpfe<<LIS3DH_HPIS1); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_HPFAOI2 * Description : Enable/Disable High Pass Filter for AOI on INT_2 * Input : MEMS_ENABLE/MEMS_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_HPFAOI2Enable(State_t hpfe) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xFD; value |= (hpfe<<LIS3DH_HPIS2); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetHPFMode * Description : Set High Pass Filter Modality * Input : LIS3DH_HPM_NORMAL_MODE_RES/LIS3DH_HPM_REF_SIGNAL/ LIS3DH_HPM_NORMAL_MODE/LIS3DH_HPM_AUTORESET_INT * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetHPFMode(LIS3DH_HPFMode_t hpm) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0x3F; value |= (hpm<<LIS3DH_HPM); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetHPFCutOFF * Description : Set High Pass CUT OFF Freq * Input : HPFCF [0,3] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetHPFCutOFF(LIS3DH_HPFCutOffFreq_t hpf) { u8_t value; if (hpf > 3) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xCF; value |= (hpf<<LIS3DH_HPCF); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetFilterDataSel * Description : Set Filter Data Selection bypassed or sent to FIFO OUT register * Input : MEMS_SET, MEMS_RESET * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetFilterDataSel(State_t state) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xF7; value |= (state<<LIS3DH_FDS); if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetTemperature * Description : Sets LIS3DH Output Temperature * Input : MEMS_ENABLE, MEMS_DISABLE * Output : None * Note : For Read Temperature by LIS3DH_OUT_AUX_3, LIS3DH_SetADCAux and LIS3DH_SetBDU functions must be ENABLE * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetTemperature(State_t state){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_TEMP_CFG_REG, &value) ) return MEMS_ERROR; value &= 0xBF; value |= state<<LIS3DH_TEMP_EN; if( !LIS3DH_WriteReg(LIS3DH_TEMP_CFG_REG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetADCAux * Description : Sets LIS3DH Output ADC * Input : MEMS_ENABLE, MEMS_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetADCAux(State_t state){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_TEMP_CFG_REG, &value) ) return MEMS_ERROR; value &= 0x7F; value |= state<<LIS3DH_ADC_PD; if( !LIS3DH_WriteReg(LIS3DH_TEMP_CFG_REG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetAuxRaw * Description : Read the Aux Values Output Registers * Input : Buffer to empty * Output : Aux Values Registers buffer * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetAuxRaw(LIS3DH_Aux123Raw_t* buff) { u8_t valueL; u8_t valueH; if( !LIS3DH_ReadReg(LIS3DH_OUT_1_L, &valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_1_H, &valueH) ) return MEMS_ERROR; buff->AUX_1 = (u16_t)( (valueH << 8) | valueL )/16; if( !LIS3DH_ReadReg(LIS3DH_OUT_2_L, &valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_2_H, &valueH) ) return MEMS_ERROR; buff->AUX_2 = (u16_t)( (valueH << 8) | valueL )/16; if( !LIS3DH_ReadReg(LIS3DH_OUT_3_L, &valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_3_H, &valueH) ) return MEMS_ERROR; buff->AUX_3 = (u16_t)( (valueH << 8) | valueL )/16; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetInt1Pin * Description : Set Interrupt1 pin Function * Input : LIS3DH_CLICK_ON_PIN_INT1_ENABLE/DISABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE/DISABLE | LIS3DH_I1_INT2_ON_PIN_INT1_ENABLE/DISABLE | LIS3DH_I1_DRDY1_ON_INT1_ENABLE/DISABLE | LIS3DH_I1_DRDY2_ON_INT1_ENABLE/DISABLE | LIS3DH_WTM_ON_INT1_ENABLE/DISABLE | LIS3DH_INT1_OVERRUN_ENABLE/DISABLE * example : SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_ENABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE | LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE | LIS3DH_I1_DRDY1_ON_INT1_ENABLE | LIS3DH_I1_DRDY2_ON_INT1_ENABLE | LIS3DH_WTM_ON_INT1_DISABLE | LIS3DH_INT1_OVERRUN_DISABLE ) * Note : To enable Interrupt signals on INT1 Pad (You MUST use all input variable in the argument, as example) * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetInt1Pin(LIS3DH_IntPinConf_t pinConf) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG3, &value) ) return MEMS_ERROR; value &= 0x00; value |= pinConf; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG3, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetInt2Pin * Description : Set Interrupt2 pin Function * Input : LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE | LIS3DH_INT_ACTIVE_HIGH/LOW * example : LIS3DH_SetInt2Pin(LIS3DH_CLICK_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT1_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_INT2_ON_PIN_INT2_ENABLE/DISABLE | LIS3DH_I2_BOOT_ON_INT2_ENABLE/DISABLE | LIS3DH_INT_ACTIVE_HIGH/LOW) * Note : To enable Interrupt signals on INT2 Pad (You MUST use all input variable in the argument, as example) * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetInt2Pin(LIS3DH_IntPinConf_t pinConf) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG6, &value) ) return MEMS_ERROR; value &= 0x00; value |= pinConf; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG6, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetClickCFG * Description : Set Click Interrupt config Function * Input : LIS3DH_ZD_ENABLE/DISABLE | LIS3DH_ZS_ENABLE/DISABLE | LIS3DH_YD_ENABLE/DISABLE | LIS3DH_YS_ENABLE/DISABLE | LIS3DH_XD_ENABLE/DISABLE | LIS3DH_XS_ENABLE/DISABLE * example : LIS3DH_SetClickCFG( LIS3DH_ZD_ENABLE | LIS3DH_ZS_DISABLE | LIS3DH_YD_ENABLE | LIS3DH_YS_DISABLE | LIS3DH_XD_ENABLE | LIS3DH_XS_ENABLE) * Note : You MUST use all input variable in the argument, as example * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetClickCFG(u8_t status) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CLICK_CFG, &value) ) return MEMS_ERROR; value &= 0xC0; value |= status; if( !LIS3DH_WriteReg(LIS3DH_CLICK_CFG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetClickTHS * Description : Set Click Interrupt threshold * Input : Click-click Threshold value [0-127] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetClickTHS(u8_t ths) { if(ths>127) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_CLICK_THS, ths) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetClickLIMIT * Description : Set Click Interrupt Time Limit * Input : Click-click Time Limit value [0-127] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetClickLIMIT(u8_t t_limit) { if(t_limit>127) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_TIME_LIMIT, t_limit) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetClickLATENCY * Description : Set Click Interrupt Time Latency * Input : Click-click Time Latency value [0-255] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetClickLATENCY(u8_t t_latency) { if( !LIS3DH_WriteReg(LIS3DH_TIME_LATENCY, t_latency) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetClickWINDOW * Description : Set Click Interrupt Time Window * Input : Click-click Time Window value [0-255] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetClickWINDOW(u8_t t_window) { if( !LIS3DH_WriteReg(LIS3DH_TIME_WINDOW, t_window) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetClickResponse * Description : Get Click Interrupt Response by CLICK_SRC REGISTER * Input : char to empty by Click Response Typedef * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetClickResponse(u8_t* res) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CLICK_SRC, &value) ) return MEMS_ERROR; value &= 0x7F; if((value & LIS3DH_IA)==0) { *res = LIS3DH_NO_CLICK; return MEMS_SUCCESS; } else { if (value & LIS3DH_DCLICK){ if (value & LIS3DH_CLICK_SIGN){ if (value & LIS3DH_CLICK_Z) { *res = LIS3DH_DCLICK_Z_N; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_Y) { *res = LIS3DH_DCLICK_Y_N; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_X) { *res = LIS3DH_DCLICK_X_N; return MEMS_SUCCESS; } } else{ if (value & LIS3DH_CLICK_Z) { *res = LIS3DH_DCLICK_Z_P; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_Y) { *res = LIS3DH_DCLICK_Y_P; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_X) { *res = LIS3DH_DCLICK_X_P; return MEMS_SUCCESS; } } } else{ if (value & LIS3DH_CLICK_SIGN){ if (value & LIS3DH_CLICK_Z) { *res = LIS3DH_SCLICK_Z_N; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_Y) { *res = LIS3DH_SCLICK_Y_N; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_X) { *res = LIS3DH_SCLICK_X_N; return MEMS_SUCCESS; } } else{ if (value & LIS3DH_CLICK_Z) { *res = LIS3DH_SCLICK_Z_P; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_Y) { *res = LIS3DH_SCLICK_Y_P; return MEMS_SUCCESS; } if (value & LIS3DH_CLICK_X) { *res = LIS3DH_SCLICK_X_P; return MEMS_SUCCESS; } } } } return MEMS_ERROR; } /******************************************************************************* * Function Name : LIS3DH_Int1LatchEnable * Description : Enable Interrupt 1 Latching function * Input : ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_Int1LatchEnable(State_t latch) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xF7; value |= latch<<LIS3DH_LIR_INT1; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } status_t LIS3DH::LIS3DH_ResetInt1Latch(void) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetIntConfiguration * Description : Interrupt 1 Configuration (without LIS3DH_6D_INT) * Input : LIS3DH_INT1_AND/OR | LIS3DH_INT1_ZHIE_ENABLE/DISABLE | LIS3DH_INT1_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 LIS3DH::LIS3DH_SetIntConfiguration(LIS3DH_Int1Conf_t ic) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) ) return MEMS_ERROR; value &= 0x40; value |= ic; if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetIntMode * Description : Interrupt 1 Configuration mode (OR, 6D Movement, AND, 6D Position) * Input : LIS3DH_INT_MODE_OR, LIS3DH_INT_MODE_6D_MOVEMENT, LIS3DH_INT_MODE_AND, LIS3DH_INT_MODE_6D_POSITION * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetIntMode(LIS3DH_Int1Mode_t int_mode) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) ) return MEMS_ERROR; value &= 0x3F; value |= (int_mode<<LIS3DH_INT_6D); if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetInt6D4DConfiguration * Description : 6D, 4D Interrupt Configuration * Input : LIS3DH_INT1_6D_ENABLE, LIS3DH_INT1_4D_ENABLE, LIS3DH_INT1_6D_4D_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetInt6D4DConfiguration(LIS3DH_INT_6D_4D_t ic) { u8_t value; u8_t value2; if( !LIS3DH_ReadReg(LIS3DH_INT1_CFG, &value) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value2) ) return MEMS_ERROR; if(ic == LIS3DH_INT1_6D_ENABLE){ value &= 0xBF; value |= (MEMS_ENABLE<<LIS3DH_INT_6D); value2 &= 0xFB; value2 |= (MEMS_DISABLE<<LIS3DH_D4D_INT1); } if(ic == LIS3DH_INT1_4D_ENABLE){ value &= 0xBF; value |= (MEMS_ENABLE<<LIS3DH_INT_6D); value2 &= 0xFB; value2 |= (MEMS_ENABLE<<LIS3DH_D4D_INT1); } if(ic == LIS3DH_INT1_6D_4D_DISABLE){ value &= 0xBF; value |= (MEMS_DISABLE<<LIS3DH_INT_6D); value2 &= 0xFB; value2 |= (MEMS_DISABLE<<LIS3DH_D4D_INT1); } if( !LIS3DH_WriteReg(LIS3DH_INT1_CFG, value) ) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value2) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_Get6DPosition * Description : 6D, 4D Interrupt Position Detect * Input : Byte to empty by POSITION_6D_t Typedef * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_Get6DPosition(u8_t* val){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) ) return MEMS_ERROR; value &= 0x7F; switch (value){ case LIS3DH_UP_SX: *val = LIS3DH_UP_SX; break; case LIS3DH_UP_DX: *val = LIS3DH_UP_DX; break; case LIS3DH_DW_SX: *val = LIS3DH_DW_SX; break; case LIS3DH_DW_DX: *val = LIS3DH_DW_DX; break; case LIS3DH_TOP: *val = LIS3DH_TOP; break; case LIS3DH_BOTTOM: *val = LIS3DH_BOTTOM; break; } return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetInt1Threshold * Description : Sets Interrupt 1 Threshold * Input : Threshold = [0,31] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetInt1Threshold(u8_t ths) { if (ths > 127) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_INT1_THS, ths) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetInt1Duration * Description : Sets Interrupt 1 Duration * Input : Duration value * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetInt1Duration(LIS3DH_Int1Conf_t id) { if (id > 127) return MEMS_ERROR; if( !LIS3DH_WriteReg(LIS3DH_INT1_DURATION, id) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_FIFOModeEnable * Description : Sets Fifo Modality * Input : LIS3DH_FIFO_DISABLE, LIS3DH_FIFO_BYPASS_MODE, LIS3DH_FIFO_MODE, LIS3DH_FIFO_STREAM_MODE, LIS3DH_FIFO_TRIGGER_MODE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_FIFOModeEnable(LIS3DH_FifoMode_t fm) { u8_t value; if(fm == LIS3DH_FIFO_DISABLE) { if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1F; value |= (LIS3DH_FIFO_BYPASS_MODE<<LIS3DH_FM); if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) //fifo mode bypass return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) //fifo disable return MEMS_ERROR; } if(fm == LIS3DH_FIFO_BYPASS_MODE) { if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; value |= MEMS_SET<<LIS3DH_FIFO_EN; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) //fifo enable return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1f; value |= (fm<<LIS3DH_FM); //fifo mode configuration if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; } if(fm == LIS3DH_FIFO_MODE) { if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; value |= MEMS_SET<<LIS3DH_FIFO_EN; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) //fifo enable return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1f; value |= (fm<<LIS3DH_FM); //fifo mode configuration if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; } if(fm == LIS3DH_FIFO_STREAM_MODE) { if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; value |= MEMS_SET<<LIS3DH_FIFO_EN; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) //fifo enable return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1f; value |= (fm<<LIS3DH_FM); //fifo mode configuration if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; } if(fm == LIS3DH_FIFO_TRIGGER_MODE) { if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; value |= MEMS_SET<<LIS3DH_FIFO_EN; if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) ) //fifo enable return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1f; value |= (fm<<LIS3DH_FM); //fifo mode configuration if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; } return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetTriggerInt * Description : Trigger event liked to trigger signal INT1/INT2 * Input : LIS3DH_TRIG_INT1/LIS3DH_TRIG_INT2 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetTriggerInt(LIS3DH_TrigInt_t tr) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0xDF; value |= (tr<<LIS3DH_TR); if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetWaterMark * Description : Sets Watermark Value * Input : Watermark = [0,31] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_SetWaterMark(u8_t wtm) { u8_t value; if(wtm > 31) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0xE0; value |= wtm; if( !LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetStatusReg * Description : Read the status register * Input : char to empty by Status Reg Value * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetStatusReg(u8_t* val) { if( !LIS3DH_ReadReg(LIS3DH_STATUS_REG, val) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetStatusBIT * Description : Read the status register BIT * Input : LIS3DH_STATUS_REG_ZYXOR, LIS3DH_STATUS_REG_ZOR, LIS3DH_STATUS_REG_YOR, LIS3DH_STATUS_REG_XOR, LIS3DH_STATUS_REG_ZYXDA, LIS3DH_STATUS_REG_ZDA, LIS3DH_STATUS_REG_YDA, LIS3DH_STATUS_REG_XDA, LIS3DH_DATAREADY_BIT val: Byte to be filled with the status bit * Output : status register BIT * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetStatusBit(u8_t statusBIT, u8_t* val) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_STATUS_REG, &value) ) return MEMS_ERROR; switch (statusBIT){ case LIS3DH_STATUS_REG_ZYXOR: if(value &= LIS3DH_STATUS_REG_ZYXOR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_ZOR: if(value &= LIS3DH_STATUS_REG_ZOR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_YOR: if(value &= LIS3DH_STATUS_REG_YOR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_XOR: if(value &= LIS3DH_STATUS_REG_XOR){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_ZYXDA: if(value &= LIS3DH_STATUS_REG_ZYXDA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_ZDA: if(value &= LIS3DH_STATUS_REG_ZDA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_YDA: if(value &= LIS3DH_STATUS_REG_YDA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } case LIS3DH_STATUS_REG_XDA: if(value &= LIS3DH_STATUS_REG_XDA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } return MEMS_ERROR; } /******************************************************************************* * Function Name : LIS3DH_GetAccAxesRaw * Description : Read the Acceleration Values Output Registers * Input : buffer to empity by AxesRaw_t Typedef * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetAccAxesRaw(AxesRaw_t* buff) { i16_t value; u8_t *valueL = (u8_t *)(&value); u8_t *valueH = ((u8_t *)(&value)+1); if( !LIS3DH_ReadReg(LIS3DH_OUT_X_L, valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_X_H, valueH) ) return MEMS_ERROR; buff->AXIS_X = value; if( !LIS3DH_ReadReg(LIS3DH_OUT_Y_L, valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_Y_H, valueH) ) return MEMS_ERROR; buff->AXIS_Y = value; if( !LIS3DH_ReadReg(LIS3DH_OUT_Z_L, valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_Z_H, valueH) ) return MEMS_ERROR; buff->AXIS_Z = value; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetInt1Src * Description : Reset Interrupt 1 Latching function * Input : Char to empty by Int1 source value * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetInt1Src(u8_t* val) { if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, val) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetInt1SrcBit * Description : Reset Interrupt 1 Latching function * Input : statusBIT: LIS3DH_INT_SRC_IA, LIS3DH_INT_SRC_ZH, LIS3DH_INT_SRC_ZL..... * val: Byte to be filled with the status bit * Output : None * Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetInt1SrcBit(u8_t statusBIT, u8_t* val) { u8_t value; if( !LIS3DH_ReadReg(LIS3DH_INT1_SRC, &value) ) return MEMS_ERROR; if(statusBIT == LIS3DH_INT1_SRC_IA){ if(value &= LIS3DH_INT1_SRC_IA){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_ZH){ if(value &= LIS3DH_INT1_SRC_ZH){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_ZL){ if(value &= LIS3DH_INT1_SRC_ZL){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_YH){ if(value &= LIS3DH_INT1_SRC_YH){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_YL){ if(value &= LIS3DH_INT1_SRC_YL){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_XH){ if(value &= LIS3DH_INT1_SRC_XH){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_INT1_SRC_XL){ if(value &= LIS3DH_INT1_SRC_XL){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } return MEMS_ERROR; } /******************************************************************************* * Function Name : LIS3DH_GetFifoSourceReg * Description : Read Fifo source Register * Input : Byte to empty by FIFO source register value * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetFifoSourceReg(u8_t* val) { if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, val) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetFifoSourceBit * Description : Read Fifo WaterMark source bit * Input : statusBIT: LIS3DH_FIFO_SRC_WTM, LIS3DH_FIFO_SRC_OVRUN, LIS3DH_FIFO_SRC_EMPTY * val: Byte to fill with the bit value * Output : None * Return : Status of BIT [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetFifoSourceBit(u8_t statusBIT, u8_t* val){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, &value) ) return MEMS_ERROR; if(statusBIT == LIS3DH_FIFO_SRC_WTM){ if(value &= LIS3DH_FIFO_SRC_WTM){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_FIFO_SRC_OVRUN){ if(value &= LIS3DH_FIFO_SRC_OVRUN){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } if(statusBIT == LIS3DH_FIFO_SRC_EMPTY){ if(value &= statusBIT == LIS3DH_FIFO_SRC_EMPTY){ *val = MEMS_SET; return MEMS_SUCCESS; } else{ *val = MEMS_RESET; return MEMS_SUCCESS; } } return MEMS_ERROR; } /******************************************************************************* * Function Name : LIS3DH_GetFifoSourceFSS * Description : Read current number of unread samples stored in FIFO * Input : Byte to empty by FIFO unread sample value * Output : None * Return : Status [value of FSS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetFifoSourceFSS(u8_t* val){ u8_t value; if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, &value) ) return MEMS_ERROR; value &= 0x1F; *val = value; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetTempRaw * Description : Read the Temperature Values by AUX Output Registers OUT_3_H * Input : Buffer to empty * Output : Temperature Values Registers buffer * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetTempRaw(i8_t* buff) { u8_t valueL; u8_t valueH; if( !LIS3DH_ReadReg(LIS3DH_OUT_3_L, &valueL) ) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_OUT_3_H, &valueH) ) return MEMS_ERROR; *buff = (i8_t)( valueH ); return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_GetWHO_AM_I * Description : Read identification code by WHO_AM_I register * Input : Char to empty by Device identification Value * Output : None * Return : Status [value of FSS] *******************************************************************************/ status_t LIS3DH::LIS3DH_GetWHO_AM_I(u8_t* val){ if( !LIS3DH_ReadReg(LIS3DH_WHO_AM_I, val) ) return MEMS_ERROR; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_ReadReg * Description : Generic Reading function. It must be fullfilled with either * : I2C or SPI reading functions * Input : Register Address * Output : Data REad * Return : None *******************************************************************************/ u8_t LIS3DH::LIS3DH_ReadReg(u8_t Reg, u8_t* Data) { //To be completed with either I2c or SPI reading function //i.e. *Data = SPI_Mems_Read_Reg( Reg ); _ss = 0; _spi.write(0x80 | Reg); signed char raw = _spi.write(0x00); _ss = 1; *Data=raw; return 1; } /******************************************************************************* * Function Name : LIS3DH_WriteReg * Description : Generic Writing function. It must be fullfilled with either * : I2C or SPI writing function * Input : Register Address, Data to be written * Output : None * Return : None *******************************************************************************/ u8_t LIS3DH::LIS3DH_WriteReg(u8_t WriteAddr, u8_t Data) { //To be completed with either I2c or SPI writing function //i.e. SPI_Mems_Write_Reg(WriteAddr, Data); _ss = 0; _spi.write(0x00 | WriteAddr); _spi.write (Data); _ss = 1; return 1; } LIS3DH::~LIS3DH(){};