/******************** (C) COPYRIGHT 2012 STMicroelectronics ******************** * File Name : LIS3DH_driver.c * Author : MSH Application Team * Author : Fabio Tota * Version : $Revision:$ * Date : $Date:$ * Description : LIS3DH driver file * * HISTORY: * Date | Modification | Author * 24/06/2011 | Initial Revision | Fabio Tota * 11/06/2012 | Support for multiple drivers in the same program | Abhishek Anand ******************************************************************************** * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. * *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "lis3dh_driver.h" #include "stdlib.h" #include "math.h" #include "main.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ //int main(void) //{ // delay_init(); //ÑÓʱº¯Êý³õʼ»¯ // uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 // IIC2_Init(); // delay_ms(100); // while(1) // { // LIS3DH_Data_Init(); // delay_ms(1000); // } // //} void delay_us(uint32_t nTimer) { uint32_t i=0; for(i=0;i20) {g_com_map[IMU_THRES]=2;} LIS3DH_WriteReg(LIS3DH_INT1_THS, (uint8_t)g_com_map[IMU_THRES]); /* INT1_THS(32h): ?????? 0x10: 16*2(FS) 0x20: 32*16(FS) */ LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0x01); /* INT1_DURATION(33h): 1LSB=1/ODR ??ODR=100HZ ??1LSB=10ms ???? 1s,??100->0x64 */ /* Start sensor */ LIS3DH_WriteReg(0x20, 0x5f); /* CTRL_REG1(20h): Start sensor at ODR 100Hz Low-power mode */ // Read ID LIS3DH_GetWHO_AM_I(&lisidtemp); // lisid=(uint16_t)lisidtemp; // printf("LIS3DH ID: %x \r\n",lisid); //get Acceleration Raw data // response=LIS3DH_GetAccAxesRaw(&data); //print data values delay_us(10); // if(response==1) // { // // printf("´«¸ÐÆ÷ԭʼֵ:x=%d, y=%d, z=%d\r\n", lis2dhdata.AXIS_X, lis2dhdata.AXIS_Y, lis2dhdata.AXIS_Z); // printf( "´¦ÀíºóµÄ¼ÓËÙ¶ÈÖµAccel:[x]%dmg,[y]%dmg,[z]%dmg\r\n", // (int16_t)((float)lis2dhdata.AXIS_X*4/65536*1000), // (int16_t)((float)lis2dhdata.AXIS_Y*4/65536*1000), // (int16_t)((float)lis2dhdata.AXIS_Z*4/65536*1000)); // // } } void LIS3DH_ENTER_STY_Init() { //uint8_t buffer[26]; uint8_t lisid,response; uint8_t lisidtemp; //set ODR (turn ON device) LIS3DH_SetODR(LIS3DH_ODR_10Hz); //set PowerMode LIS3DH_SetMode(LIS3DH_POWER_DOWN); //set Fullscale LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2); LIS3DH_SetInt2Pin(LIS3DH_I1_INT2_ON_PIN_INT1_ENABLE); //LIS3DH_SetTriggerInt(LIS3DH_TRIG_INT2); // LIS3DH_WriteReg(0x34,0xff); // LIS3DH_WriteReg(0x35,0x7f); // LIS3DH_WriteReg(0x36,0x20); //set axis Enable LIS3DH_SetAxis(LIS3DH_X_DISABLE | LIS3DH_Y_DISABLE | LIS3DH_Y_DISABLE); // Read ID //LIS3DH_GetWHO_AM_I(&lisidtemp); // lisid=(uint16_t)lisidtemp; // printf("LIS3DH ID: %x \r\n",lisid); //get Acceleration Raw data // response=LIS3DH_GetAccAxesRaw(&data); //print data values HAL_Delay(100); // if(response==1) // { // // printf("´«¸ÐÆ÷ԭʼֵ:x=%d, y=%d, z=%d\r\n", lis2dhdata.AXIS_X, lis2dhdata.AXIS_Y, lis2dhdata.AXIS_Z); // printf( "´¦ÀíºóµÄ¼ÓËÙ¶ÈÖµAccel:[x]%dmg,[y]%dmg,[z]%dmg\r\n", // (int16_t)((float)lis2dhdata.AXIS_X*4/65536*1000), // (int16_t)((float)lis2dhdata.AXIS_Y*4/65536*1000), // (int16_t)((float)lis2dhdata.AXIS_Z*4/65536*1000)); // // } } //»ñÈ¡Êý¾Ý float drv_lis2dh12_get_angle(void) { float acc_x, acc_y, acc_z, acc_g; float angle_x, angle_y, angle_z, angle_xyz; int8_t data[6]; uint8_t i; uint8_t lisid,response; uint8_t lisidtemp; //set ODR (turn ON device) LIS3DH_SetODR(LIS3DH_ODR_100Hz); //set PowerMode LIS3DH_SetMode(LIS3DH_NORMAL); //set Fullscale LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2); //set axis Enable LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE); // Read ID LIS3DH_GetWHO_AM_I(&lisidtemp); lisid=(uint16_t)lisidtemp; // printf("LIS3DH ID: %x \r\n",lisid); //get Acceleration Raw data response=LIS3DH_GetAccAxesRaw(&lis2dhdata); //print data values delay_us(10); // LIS3DH_GetAccAxesRaw(&lis2dhdata); // for (i=0; i<6; i++) // drv_lis2dh12_iic_read_byte(0x28 + i, data+i); if(response==1) { /* x, y, z ???? */ acc_x = abs(lis2dhdata.AXIS_X); acc_y = abs(lis2dhdata.AXIS_Y); acc_z = abs(lis2dhdata.AXIS_Z); /* ????? */ acc_g = sqrt(pow(acc_x, 2) + pow(acc_y, 2) + pow(acc_z, 2)); if (acc_z > acc_g) acc_z = acc_g; /* angle_z/90 = asin(acc_z/acc_g)/p/2 */ angle_z = asin(acc_z/acc_g) * 2 / 3.14 * 90; angle_z = 90 - angle_z; if(angle_z < 0) angle_z = 0; } return acc_g; } //²úÉúIICÆðʼÐźŠvoid IIC2_Start(void) { // IIC2_SDA_OUT(); //sdaÏßÊä³ö SDA_1; // delay_us(10); SCL_1; // delay_us(10); SDA_0;//START:when CLK is high,DATA change form high to low delay_us(10); SCL_0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý } //²úÉúIICÍ£Ö¹ÐźŠvoid IIC2_Stop(void) { // IIC2_SDA_OUT();//sdaÏßÊä³ö SCL_0; // delay_us(10); SDA_0;//STOP:when CLK is high DATA change form low to high delay_us(10); SCL_1; // delay_us(10); SDA_1;//·¢ËÍI2C×ÜÏß½áÊøÐźŠdelay_us(10); } //µÈ´ýÓ¦´ðÐźŵ½À´ //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü // 0£¬½ÓÊÕÓ¦´ð³É¹¦ uint8_t IIC2_Wait_Ack(void) { uint8_t ucErrTime=0; // IIC2_SDA_IN(); //SDAÉèÖÃΪÊäÈë SDA_1; delay_us(6); SCL_1; delay_us(6); while(IIC2_READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC2_Stop(); return 1; } } SCL_0;//ʱÖÓÊä³ö0 return 0; } //²úÉúACKÓ¦´ð void IIC2_Ack(void) { SCL_0; // IIC2_SDA_OUT(); SDA_0; delay_us(10); SCL_1; delay_us(10); SCL_0; } //²»²úÉúACKÓ¦´ð void IIC2_NAck(void) { SCL_0; // IIC2_SDA_OUT(); SDA_1; delay_us(10); SCL_1; delay_us(10); SCL_0; } //IIC·¢ËÍÒ»¸ö×Ö½Ú,WRITE //·µ»Ø´Ó»úÓÐÎÞÓ¦´ð //1£¬ÓÐÓ¦´ð //0£¬ÎÞÓ¦´ð void IIC2_Send_Byte(uint8_t txd) { uint8_t t; // IIC2_SDA_OUT(); SCL_0;//À­µÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä for(t=0;t<8;t++) { if((txd&0x80)>>7) { SDA_1; } else { SDA_0; } txd <<= 1; delay_us(10); SCL_1; delay_us(10); SCL_0; delay_us(10); } } //¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK uint8_t IIC2_Read_Byte(unsigned char ack) { unsigned char i,receive=0; // IIC2_SDA_IN();//SDAÉèÖÃΪÊäÈë for(i=0;i<8;i++ ) { SCL_0; delay_us(10); SCL_1; receive<<=1; if(IIC2_READ_SDA)receive++; delay_us(5); } if (!ack) IIC2_NAck();//·¢ËÍnACK else IIC2_Ack(); //·¢ËÍACK return receive; } //ÔÚLIS3DHÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶ÁÒ»×Ö½ÚÊý¾Ý //ReadAddr :¶Á³öµÄµØÖ· //·µ»ØÖµ :¶Á³öµÄÊý¾Ý uint8_t LIS3DH_ReadOneByte(uint16_t ReadAddr) { uint8_t temp=0; IIC2_Start(); IIC2_Send_Byte(0X32); //·¢ËÍдÃüÁî IIC2_Wait_Ack(); IIC2_Send_Byte(ReadAddr); //·¢ËͶÁµØÖ· IIC2_Wait_Ack(); IIC2_Start(); IIC2_Send_Byte(0X33); //·¢ËͶÁÃüÁ½øÈë½ÓÊÕģʽ IIC2_Wait_Ack(); temp=IIC2_Read_Byte(0); IIC2_Stop(); //²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ return temp; } //ÔÚLIS3DHÖ¸¶¨µØÖ·Ð´ÈëÒ»¸öÊý¾Ý //WriteAddr :дÈëÊý¾ÝµÄÄ¿µÄµØÖ· //DataToWrite:ҪдÈëµÄÊý¾Ý void LIS3DH_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite) { IIC2_Start(); IIC2_Send_Byte(0X32); //·¢ËÍдÃüÁî IIC2_Wait_Ack(); IIC2_Send_Byte(WriteAddr); //·¢Ë͵ØÖ· IIC2_Wait_Ack(); IIC2_Send_Byte(DataToWrite); //·¢ËÍ×Ö½Ú IIC2_Wait_Ack(); IIC2_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ delay_us(10); } //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼Ð´È볤¶ÈΪLenµÄÊý¾Ý //¸Ãº¯ÊýÓÃÓÚдÈë16bit»òÕß32bitµÄÊý¾Ý. //WriteAddr :¿ªÊ¼Ð´ÈëµÄµØÖ· //DataToWrite:Êý¾ÝÊý×éÊ×µØÖ· //Len :ҪдÈëÊý¾ÝµÄ³¤¶È2,4 void LIS3DH_WriteLenByte(uint16_t WriteAddr,uint32_t DataToWrite,uint8_t Len) { uint8_t t; for(t=0;t>(8*t))&0xff); } } //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶Á³ö³¤¶ÈΪLenµÄÊý¾Ý //¸Ãº¯ÊýÓÃÓÚ¶Á³ö16bit»òÕß32bitµÄÊý¾Ý. //ReadAddr :¿ªÊ¼¶Á³öµÄµØÖ· //·µ»ØÖµ :Êý¾Ý //Len :Òª¶Á³öÊý¾ÝµÄ³¤¶È2,4 uint32_t LIS3DH_ReadLenByte(uint16_t ReadAddr,uint8_t Len) { uint8_t t; uint32_t temp=0; for(t=0;tAUX_1 = (uint16_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 = (uint16_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 = (uint16_t)( (valueH << 8) | valueL )/16; 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_GetTempRaw(int8_t* buff) { uint8_t valueL; uint8_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 = (int8_t)( valueH ); 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_SetMode(LIS3DH_Mode_t md) { uint8_t value; uint8_t value2; static uint8_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< 3) return MEMS_ERROR; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG2, &value) ) return MEMS_ERROR; value &= 0xCF; value |= (hpf<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_SetClickLIMIT(uint8_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_SetClickLATENCY(uint8_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_SetClickWINDOW(uint8_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_GetClickResponse(uint8_t* res) { uint8_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_Int1LatchEnable(State_t latch) { uint8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG5, &value) ) return MEMS_ERROR; value &= 0xF7; value |= latch< 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_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_FIFOModeEnable(LIS3DH_FifoMode_t fm) { uint8_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< 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_GetStatusReg(uint8_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_GetStatusBit(uint8_t statusBIT, uint8_t* val) { uint8_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_GetAccAxesRaw(AxesRaw_t* buff) { int16_t value; uint8_t *valueL = (uint8_t *)(&value); uint8_t *valueH = ((uint8_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_GetInt1Src(uint8_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_GetInt1SrcBit(uint8_t statusBIT, uint8_t* val) { uint8_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_GetFifoSourceReg(uint8_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_GetFifoSourceBit(uint8_t statusBIT, uint8_t* val){ uint8_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_GetFifoSourceFSS(uint8_t* val){ uint8_t value; if( !LIS3DH_ReadReg(LIS3DH_FIFO_SRC_REG, &value) ) return MEMS_ERROR; value &= 0x1F; *val = value; return MEMS_SUCCESS; } /******************************************************************************* * Function Name : LIS3DH_SetSPIInterface * Description : Set SPI mode: 3 Wire Interface OR 4 Wire Interface * Input : LIS3DH_SPI_3_WIRE, LIS3DH_SPI_4_WIRE * Output : None * Return : Status [MEMS_ERROR, MEMS_SUCCESS] *******************************************************************************/ status_t LIS3DH_SetSPIInterface(LIS3DH_SPIMode_t spi) { uint8_t value; if( !LIS3DH_ReadReg(LIS3DH_CTRL_REG4, &value) ) return MEMS_ERROR; value &= 0xFE; value |= spi<