/*=============================================================================== Function : Get_XYZ_Rate(); Parameters : *Data ->Pointer to store the data Description : Gets 7 bytes of data from L3G4200D module and updates the buffer only if new data is available by reading status byte. Byte0 = Status Byte1 & 2 = X lsb & X msb Byte3 & 4 = Y lsb & Y msb Byte5 & 6 = Z lsb & Z msb Preconditions : uncomment GYROSCOPE definition in Hardwareprofile.h ===============================================================================*/ uint32_t Get_XYZ_Rate(uint8_t *Data) { uint8_t i=0; uint32_t Status=FALSE; I2CSlaveBuffer[L3G4200D_PORT][0] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][1] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][2] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][3] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][4] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][5] = 0x00; I2CSlaveBuffer[L3G4200D_PORT][6] = 0x00; if(L3G4200D_ReadReg(0x80 | STATUS_REG,7)==I2C_OK) { if((I2CSlaveBuffer[L3G4200D_PORT][0] & 0x08)==0x08) { for(i=0;i<6;i++) { Data[i] = I2CSlaveBuffer[L3G4200D_PORT][i+1]; } Status = TRUE; } } Delay(); return(Status); }
/******************************************************************************* * Function Name : L3G4200D_SetMode * Description : Sets L3G4200D Operating Mode * Input : Modality (NORMAL, SLEEP, POWER_DOWN) * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetMode(L3G4200D_Mode_t md) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG1, &value) ) return MEMS_ERROR; switch(md) { case L3G4200D_POWER_DOWN: value &= 0xF7; value |= (MEMS_RESET<<L3G4200D_PD); break; case L3G4200D_NORMAL: value &= 0xF7; value |= (MEMS_SET<<L3G4200D_PD); break; case L3G4200D_SLEEP: value &= 0xF0; value |= ( (MEMS_SET<<L3G4200D_PD) | (MEMS_RESET<<L3G4200D_ZEN) | (MEMS_RESET<<L3G4200D_YEN) | (MEMS_RESET<<L3G4200D_XEN) ); break; default: return MEMS_ERROR; } if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG1, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_GetInt1Src * Description : Reset Interrupt 1 Latching function * Input : None * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_GetInt1Src(u8_t* buff) { if( !L3G4200D_ReadReg(L3G4200D_INT1_SRC, buff) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_GetFifoSourceReg * Description : Read Fifo source Register * Input : None * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_GetFifoSourceReg(u8_t* buff) { if( !L3G4200D_ReadReg(L3G4200D_FIFO_SRC_REG, buff) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_ResetInt1Latch * Description : Reset Interrupt 1 Latching function * Input : None * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_ResetInt1Latch(void) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_INT1_SRC, &value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_GetAngRateRaw * Description : Read the Angular Rate Registers * Input : None * Output : Angular Rate Registers buffer * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_GetAngRateRaw(AxesRaw_t* buff) { u8_t valueL; u8_t valueH; if( !L3G4200D_ReadReg(L3G4200D_OUT_X_L, &valueL) ) return MEMS_ERROR; if( !L3G4200D_ReadReg(L3G4200D_OUT_X_H, &valueH) ) return MEMS_ERROR; buff->AXIS_X = (i16_t)( (valueH << 8) | valueL ); if( !L3G4200D_ReadReg(L3G4200D_OUT_Y_L, &valueL) ) return MEMS_ERROR; if( !L3G4200D_ReadReg(L3G4200D_OUT_Y_H, &valueH) ) return MEMS_ERROR; buff->AXIS_Y = (i16_t)( (valueH << 8) | valueL ); if( !L3G4200D_ReadReg(L3G4200D_OUT_Z_L, &valueL) ) return MEMS_ERROR; if( !L3G4200D_ReadReg(L3G4200D_OUT_Z_H, &valueH) ) return MEMS_ERROR; buff->AXIS_Z = (i16_t)( (valueH << 8) | valueL ); return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_FIFOModeEnable * Description : Sets Fifo Modality * Input : * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_FIFOModeEnable(L3G4200D_FifoMode_t fm) { u8_t value; if(fm == L3G4200D_FIFO_DISABLE) { if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG5, value) ) return MEMS_ERROR; } else { if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xBF; value |= MEMS_SET<<L3G4200D_FIFO_EN; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG5, value) ) return MEMS_ERROR; if( !L3G4200D_ReadReg(L3G4200D_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0x1f; value |= (fm<<L3G4200D_FM0); if( !L3G4200D_WriteReg(L3G4200D_FIFO_CTRL_REG, value) ) return MEMS_ERROR; } return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetFullScale * Description : Sets the L3G4200D FullScale * Input : FS_250/FS_500/FS_2000 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetFullScale(L3G4200D_Fullscale_t fs) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xCF; value |= (fs<<L3G4200D_FS); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_HPFEnable * Description : Enable/Disable High Pass Filter * Input : ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_HPFEnable(State_t hpf) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xEF; value |= (hpf<<L3G4200D_HPEN); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG5, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetODR * Description : Sets L3G4200D Output Data Rate * Input : Output Data Rate * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetODR(L3G4200D_ODR_t ov){ u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG1, &value) ) return MEMS_ERROR; value &= 0x0f; value |= ov<<4; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG1, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetBLE * Description : Set Endianess (MSB/LSB) * Input : BLE_LSB / BLE_MSB * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetBLE(L3G4200D_Endianess_t ble) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xBF; value |= (ble<<L3G4200D_BLE); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetBDU * Description : Enable/Disable Block Data Update Functionality * Input : ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetBDU(State_t bdu) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0x7F; value |= (bdu<<L3G4200D_BDU); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetHPFMode * Description : Set High Pass Filter Modality * Input : HPM_NORMAL_MODE_RES/HPM_REF_SIGNAL/HPM_NORMAL_MODE/HPM_AUTORESET_INT * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetHPFMode(L3G4200D_HPFMode_t hpf) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xCF; value |= (hpf<<L3G4200D_HPM); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetAxis * Description : Enable/Disable L3G4200D Axis * Input : X_ENABLE/X_DISABLE | Y_ENABLE/Y_DISABLE | Z_ENABLE/Z_DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetAxis(L3G4200D_Axis_t axis) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG1, &value) ) return MEMS_ERROR; value &= 0xf8; value |= axis; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG1, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_Int1LatchEnable * Description : Enable Interrupt 1 Latching function * Input : ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_Int1LatchEnable(State_t latch) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_INT1_CFG, &value) ) return MEMS_ERROR; value &= 0xBF; value |= latch<<L3G4200D_LIR; if( !L3G4200D_WriteReg(L3G4200D_INT1_CFG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetInt2Pin * Description : Set Interrupt2 pin Function * Input : L3G4200D_I2_DRDY_ON_INT2_ENABLE/DISABLE | L3G4200D_WTM_ON_INT2_ENABLE/DISABLE | L3G4200D_OVERRUN_ON_INT2_ENABLE/DISABLE | L3G4200D_EMPTY_ON_INT2_ENABLE/DISABLE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetInt2Pin(L3G4200D_Int2PinConf_t pinConf) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG3, &value) ) return MEMS_ERROR; value &= 0xF0; value |= pinConf; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG3, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetIntPinMode * Description : Set Interrupt Pin Modality (push pull or Open drain) * Input : PUSH_PULL/OPEN_DRAIN * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetIntPinMode(L3G4200D_IntPinMode_t pm) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG3, &value) ) return MEMS_ERROR; value &= 0xEF; value |= (pm<<L3G4200D_PP_OD); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG3, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetSPIInterface * Description : Set SPI mode: 3 Wire Interface OR 4 Wire Interface * Input : L3G4200D_SPI_3_WIRE, L3G4200D_SPI_4_WIRE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetSPIInterface(L3G4200D_SPIMode_t spi) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xFE; value |= spi<<L3G4200D_SIM; if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG4, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetHPFCutOFF * Description : Set High Pass CUT OFF Freq * Input : HPFCF_0,HPFCF_1,HPFCF_2... See Table 27 of the datasheet * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetHPFCutOFF(L3G4200D_HPFCutOffFreq_t hpf) { u8_t value; if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xF0; value |= (hpf<<L3G4200D_HPFC0); if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG2, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetWaterMark * Description : Sets Watermark Value * Input : Watermark = [0,31] * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetWaterMark(u8_t wtm) { u8_t value; if(wtm > 31) return MEMS_ERROR; if( !L3G4200D_ReadReg(L3G4200D_FIFO_CTRL_REG, &value) ) return MEMS_ERROR; value &= 0xE0; value |= wtm; if( !L3G4200D_WriteReg(L3G4200D_FIFO_CTRL_REG, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetInt1Filters * Description : ENABLE/DISABLE HIGH PASS and LOW PASS filters applied to Int1 circuitery * : See Table 9 of AN3393 for more details * Input : NONE, HPH, LPF2, HPFLPF2 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetInt1Filters(L3G4200D_HPF_LPF2_Enable hpf){ u8_t value; //HPF if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG5, &value) ) return MEMS_ERROR; switch(hpf) { case L3G4200D_NONE: value &= 0xf3; value |= 0x00<<L3G4200D_INT1_SEL0; //hpen = x, Int1_sel_1 = 0, Int1_sel_0 = 0 break; case L3G4200D_HPF: value &= 0xf3; value |= 0x01<<L3G4200D_INT1_SEL0; //hpen = x, Int1_sel_1 = 0, Int1_sel_0 = 1 break; case L3G4200D_LPF2: value &= 0xe7; value |= 0x02<<L3G4200D_INT1_SEL0; //hpen = 0, Int1_sel_1 = 1, Int1_sel_0 = x break; case L3G4200D_HPFLPF2: value &= 0xe7; value |= 0x01<<L3G4200D_HPEN; value |= 0x02<<L3G4200D_INT1_SEL0; //hpen = 1, Int1_sel_1 = 1, Int1_sel_0 = x break; } if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG5, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_SetOutputDataAndFifoFilters * Description : ENABLE/DISABLE HIGH PASS and LOW PASS filters applied to output and fifo registers * : See Table 8 of AN3393 for more details * Input : L3G4200D_NONE, L3G4200D_HPH, L3G4200D_LPF2, L3G4200D_HPFLPF2 * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_SetOutputDataAndFifoFilters(L3G4200D_HPF_LPF2_Enable hpf){ u8_t value; //HPF if( !L3G4200D_ReadReg(L3G4200D_CTRL_REG5, &value) ) return MEMS_ERROR; switch(hpf) { case L3G4200D_NONE: value &= 0xfc; value |= 0x00; //hpen = x, Out_sel_1 = 0, Out_sel_0 = 0 break; case L3G4200D_HPF: value &= 0xfc; value |= 0x01; //hpen = x, Out_sel_1 = 0, Out_sel_0 = 1 break; case L3G4200D_LPF2: value &= 0xed; value |= 0x02; //hpen = 0, Out_sel_1 = 1, Out_sel_0 = x break; case L3G4200D_HPFLPF2: value &= 0xed; value |= 0x12; //hpen = 1, Out_sel_1 = 1, Out_sel_0 = x break; } if( !L3G4200D_WriteReg(L3G4200D_CTRL_REG5, value) ) return MEMS_ERROR; return MEMS_SUCCESS; }
/******************************************************************************* * Function Name : L3G4200D_GetSatusReg * Description : Read the status register * Input : None * Output : status register buffer * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t L3G4200D_GetSatusReg(u8_t* buff) { if( !L3G4200D_ReadReg(L3G4200D_STATUS_REG, buff) ) return MEMS_ERROR; return MEMS_SUCCESS; }