From e54c70b2c45ca652ddd2808a95a057cb797eab58 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期六, 05 七月 2025 14:16:11 +0800
Subject: [PATCH] square天线NVM初始化问题解决调到和官方效果一致,初步移植完STS并能稳定一对一测距板本

---
 keil/include/drivers/lis3dh_driver.c | 2348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2,348 insertions(+), 0 deletions(-)

diff --git a/keil/include/drivers/lis3dh_driver.c b/keil/include/drivers/lis3dh_driver.c
new file mode 100644
index 0000000..b22121f
--- /dev/null
+++ b/keil/include/drivers/lis3dh_driver.c
@@ -0,0 +1,2348 @@
+/******************** (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 "stdint.h"
+#include "mk_io.h"
+#include "mk_gpio.h"
+#include "global_param.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);
+//	}
+//
+//}
+
+
+
+
+#define ARM_BIT_8               0
+
+#if ARM_BIT_8
+//如下数据类型是在8位机上定义的,在其它平台(比如32位)可能存在差别,需要根据实际情况修改 。
+typedef unsigned char    u8_m;                   /* 无符号8位整型变量*/
+typedef signed   char    s8_m;                   /* 有符号8位整型变量*/
+typedef unsigned int     u16_m;                  /* 无符号16位整型变量*/
+typedef signed   int     s16_m;                  /* 有符号16位整型变量*/
+typedef unsigned long    u32_m;                  /* 无符号32位整型变量*/
+typedef signed   long    s32_m;                  /* 有符号32位整型变量*/
+typedef float            fp32_m;                 /* 单精度浮点数(32位长度)*/
+typedef double           fp64_m;                 /* 双精度浮点数(64位长度)*/
+#else
+//如下数据类型是在32位机上定义的,在其它平台(比如8位)可能存在差别,需要根据实际情况修改 。
+typedef unsigned char    u8_m;                   /* 无符号8位整型变量*/
+typedef signed   char    s8_m;                   /* 有符号8位整型变量*/
+typedef unsigned short   u16_m;                  /* 无符号16位整型变量*/
+typedef signed   short   s16_m;                  /* 有符号16位整型变量*/
+typedef unsigned int     u32_m;                  /* 无符号32位整型变量*/
+typedef signed   int     s32_m;                  /* 有符号32位整型变量*/
+typedef float            fp32_m;                 /* 单精度浮点数(32位长度)*/
+typedef double           fp64_m;                 /* 双精度浮点数(64位长度)*/
+#endif
+
+/*******************************************************************************
+Macro definitions - Register define for Gsensor
+********************************************************************************/
+#define REG_SPI_CONFIG              0x00
+#define REG_CHIP_ID                 0x01
+#define REG_ACC_X_LSB               0x02
+#define REG_ACC_X_MSB               0x03
+#define REG_ACC_Y_LSB               0x04
+#define REG_ACC_Y_MSB               0x05
+#define REG_ACC_Z_LSB               0x06
+#define REG_ACC_Z_MSB               0x07
+#define REG_FIFO_STATUS             0x08
+#define REG_MOTION_FLAG             0x09
+#define REG_NEWDATA_FLAG            0x0A
+#define REG_TAP_ACTIVE_STATUS       0x0B
+#define REG_ORIENT_STATUS	        0x0C
+#define REG_STEPS_MSB               0x0D
+#define REG_STEPS_LSB               0x0E
+#define REG_RESOLUTION_RANGE        0x0F
+#define REG_ODR_AXIS                0x10
+#define REG_MODE_BW                 0x11
+#define REG_SWAP_POLARITY           0x12
+#define REG_FIFO_CTRL               0x14
+#define REG_INT_SET0                0x15
+#define REG_INT_SET1                0x16
+#define REG_INT_SET2                0x17
+#define REG_INT_MAP1                0x19
+#define REG_INT_MAP2                0x1a
+#define REG_INT_MAP3                0x1b
+#define REG_INT_CONFIG              0x20
+#define REG_INT_LATCH               0x21
+#define REG_FREEFALL_DUR            0x22
+#define REG_FREEFALL_THS            0x23
+#define REG_FREEFALL_HYST           0x24
+#define REG_ACTIVE_DUR              0x27
+#define REG_ACTIVE_THS              0x28
+#define REG_TAP_DUR                 0x2A
+#define REG_TAP_THS                 0x2B
+#define REG_ORIENT_HYST             0x2C
+#define REG_Z_BLOCK                 0x2D
+#define REG_RESET_STEP				0x2E
+#define REG_STEP_CONGIF1			0x2F
+#define REG_STEP_CONGIF2			0x30
+#define REG_STEP_CONGIF3			0x31
+#define REG_STEP_CONGIF4			0x32
+#define REG_STEP_FILTER             0x33
+#define	REG_SM_THRESHOLD            0x34
+
+#define DIFF_CALIBRATION 1
+
+
+u8_m i2c_addr = 0x27;
+
+s16_m offset_x=0, offset_y=0, offset_z=0;
+
+u16_m f_step=0;
+
+
+s8_m mir3da_register_read(u8_m ReadAddr, u8_m *data_m, u8_m Len)
+{
+
+    mir3da_ReadOneByte(ReadAddr);
+
+}
+
+s8_m mir3da_register_write(u8_m ReadAddr, u8_m data_m)
+{
+
+    mir3da_WriteOneByte(ReadAddr,data_m);
+
+}
+
+s8_m mir3da_register_mask_write(u8_m ReadAddr, u8_m mask, u8_m data)
+{
+    int res=0;
+    unsigned char tmp_data=0;
+
+    res = mir3da_register_read(ReadAddr, &tmp_data, 1);
+    tmp_data &= ~mask;
+    tmp_data |= data & mask;
+    res |= mir3da_register_write(ReadAddr, tmp_data);
+
+    return 0;
+}
+
+
+//void delay_us(uint32_t nTimer)
+//{
+//    uint32_t i=0;
+//    for(i=0;i<nTimer;i++){
+//        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
+//        __NOP();__NOP();__NOP();__NOP();
+//    }
+//}
+AxesRaw_t lis2dhdata;
+
+//OLED初始化IIC
+uint8_t t11;
+void IIC2_Init(void)
+{
+//	GPIO_InitTypeDef GPIO_InitStructure= {0};
+// __HAL_RCC_GPIOA_CLK_ENABLE();
+//
+//	GPIO_InitStructure.Pin = GPIO_PIN_2|GPIO_PIN_3;
+//	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD ;   //开漏输出
+//	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
+//	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
+//	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_SET); 	//PB6,PB7 输出高
+
+    //IIC引脚MK配置PIN10 SDA ,PIN11 SCL
+    io_pin_mux_set(SDA_PIN, IO_FUNC0);
+    io_pin_mux_set(SCL_PIN, IO_FUNC0);
+
+    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
+		//io_open_drain_set(SDA_PIN, 1);
+    io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态
+
+    gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1);
+    //io_open_drain_set(SCL_PIN, 1);//设置开漏输出
+    io_pull_set(SCL_PIN , IO_HIGH_Z, IO_PULL_UP_NONE);
+}
+
+uint8_t lisid;
+uint8_t lisidtemp;
+
+void Accelerometer_Init()
+{
+
+    LIS3DH_GetWHO_AM_I(&lisidtemp);
+    lisid=(uint16_t)lisidtemp;
+
+    if(lisid == 0x33)
+    {
+        LIS3DH_Data_Init();
+    }
+    else
+    {
+        g_com_map[IMU_ENABLE]=0;
+    }
+
+}
+
+void mir3da_init()
+{
+    u8_m data_m = 0;
+    int i;
+    int threshold = 0;
+
+
+    //softreset
+    mir3da_register_write(REG_SPI_CONFIG, 0x24);
+    delay_us(20000);
+
+    mir3da_register_write(REG_RESOLUTION_RANGE, 0x00);	//0x0F; +/-2G,14bit
+    mir3da_register_write(REG_ODR_AXIS, 0x05);			//0x10; ODR=31.25hz(step counter minimum ODR)
+    mir3da_register_write(REG_MODE_BW, 0x04);			//0x11; suspend mode, osr=1x, bw=1/10odr, autosleep disable
+
+    //load_offset_from_filesystem(offset_x, offset_y, offset_z);	//pseudo-code
+
+    //private register, just do it.
+    mir3da_register_write(0x7F, 0x83);
+    mir3da_register_write(0x7F, 0x69);
+    mir3da_register_write(0x7F, 0xBD);
+
+    //don't pull up sd0 pin
+    if(i2c_addr == 0x26) {
+        mir3da_register_mask_write(0x8C, 0x40, 0x00);
+    }
+
+    mir3da_set_active_interrupt_enable(1);
+
+    g_com_map[IMU_THRES]=0x14;
+//	LIS3DH_WriteReg(LIS3DH_INT1_THS, (uint8_t)g_com_map[IMU_THRES]);  	/* INT1_THS(32h): ?????? 0x10: 16*2(FS)  0x20: 32*16(FS) */
+    mir3da_register_write(REG_ACTIVE_THS,(uint8_t)g_com_map[IMU_THRES]);
+
+    delay_us(10);
+
+    mir3da_set_enable(1);
+
+    mir3da_set_step_counter_open(1);
+
+}
+
+
+void LIS3DH_Data_Init()
+{
+    //uint8_t buffer[26];
+
+    uint8_t response;
+//  uint8_t lisidtemp;
+
+    LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x37);	/* CTRL_REG1(20h): ??sensor,???????? ODR 25HZ */
+    LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x03);	/* CTRL_REG2(21h): IA1?IA2 ?????? bc */
+
+    LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x40);	/* CTRL_REG3(22h): 0x80 ???????INT_1 INT_2 */
+    LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x08);  /* CTRL_REG4(23h): ???,????,???+/-2G,?????? */
+    LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0xaa);  /* INT1_CFG(30h): ??,6D X/Y/Z???????? */
+    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;
+
+
+
+    //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 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);yuan
+    delay_us(100000);
+//	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));
+//
+//	}
+
+}
+
+
+//enable/disable the chip
+void mir3da_set_enable(int enable)     //开启使能
+{
+    if(enable)
+        mir3da_register_mask_write(REG_MODE_BW, 0x80, 0x00);	//power on
+    else
+        mir3da_register_mask_write(REG_MODE_BW, 0x80, 0x80);
+
+    delay_us(100000);
+}
+
+//Read three axis data, 2g range, counting 12bit, 1G=1000mg=1024lsb
+void mir3da_read_raw_data(short *x, short *y, short *z)
+{
+    u8_m tmp_data[6] = {0};
+
+    mir3da_register_read(REG_ACC_X_LSB, tmp_data, 6);
+
+    *x = ((short)(tmp_data[1] << 8 | tmp_data[0]))>> 4;
+    *y = ((short)(tmp_data[3] << 8 | tmp_data[2]))>> 4;
+    *z = ((short)(tmp_data[5] << 8 | tmp_data[4]))>> 4;
+}
+
+void mir3da_read_data(short *x, short *y, short *z)
+{
+    u8_m tmp_data[6] = {0};
+
+    mir3da_register_read(REG_ACC_X_LSB, tmp_data, 6);
+
+    *x = ((short)(tmp_data[1] << 8 | tmp_data[0])) >> 4 - offset_x;
+    *y = ((short)(tmp_data[3] << 8 | tmp_data[2])) >> 4 - offset_y;
+    *z = ((short)(tmp_data[5] << 8 | tmp_data[4])) >> 4 - offset_z;
+}
+
+//open active interrupt
+void mir3da_set_active_interrupt_enable(int enable)
+{
+    if(enable) {
+        mir3da_register_write(REG_ACTIVE_DUR, 0x00);    //持续时间
+//		mir3da_register_write(REG_ACTIVE_THS, 0x3);   //阈值
+        mir3da_register_write(REG_INT_MAP1, 0x04 );
+        mir3da_register_write(REG_INT_SET1, 0x87);
+    }
+    else {
+        mir3da_register_write(REG_INT_SET1,0x00 );
+        mir3da_register_write(REG_INT_MAP1,0x00 );
+    }
+}
+
+void mir3da_set_step_counter_open(int enable)       //开启步数计数
+{
+    if(enable) {
+        mir3da_register_write(REG_STEP_CONGIF1, 0x01);
+        mir3da_register_write(REG_STEP_CONGIF2, 0x62);
+        mir3da_register_write(REG_STEP_CONGIF3, 0x46);
+        mir3da_register_write(REG_STEP_CONGIF4, 0x32);
+        mir3da_register_write(REG_STEP_FILTER,  0xa2);
+    }
+    else {
+        mir3da_register_write(REG_STEP_FILTER,  0x22);
+    }
+}
+
+void mir3da_reset_step_counter(void)
+{
+    mir3da_register_mask_write(REG_RESET_STEP, 0x80, 0x80);
+}
+
+
+u16_m mir3da_get_step()    //获得运动步数
+{
+    u8_m tmp_data[2] = {0};
+
+    f_step = mir3da_ReadLenByte(REG_STEPS_MSB, 2);
+
+    return f_step;
+
+}
+
+//获取数据
+
+float  acc_g;
+
+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 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设置为输入
+    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_IN, 1);
+    SDA_1;
+    delay_us(6);
+    SCL_1;
+    delay_us(6);
+
+    while(IIC2_READ_SDA)
+    {
+        ucErrTime++;
+        if(ucErrTime>250)
+        {
+            IIC2_Stop();
+            return 1;
+        }
+    }
+    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 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<Len; t++)
+    {
+        LIS3DH_WriteOneByte(WriteAddr+t,(DataToWrite>>(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; t<Len; t++)
+    {
+        temp<<=8;
+        temp+=LIS3DH_ReadOneByte(ReadAddr+Len-t-1);
+    }
+    return temp;
+}
+
+//在mir3da里面的指定地址开始读一字节数据
+//ReadAddr   :读出的地址
+//返回值     :读出的数据
+uint8_t mir3da_ReadOneByte(uint16_t ReadAddr)
+{
+    uint8_t temp=0;
+    IIC2_Start();
+    IIC2_Send_Byte(0X4e);	     //发送写命令
+    IIC2_Wait_Ack();
+    IIC2_Send_Byte(ReadAddr);   //发送读地址
+    IIC2_Wait_Ack();
+    IIC2_Start();
+    IIC2_Send_Byte(0X4f);       //发送读命令,进入接收模式
+    IIC2_Wait_Ack();
+    temp=IIC2_Read_Byte(0);
+    IIC2_Stop();								//产生一个停止条件
+    return temp;
+}
+//在mir3da指定地址写入一个数据
+//WriteAddr  :写入数据的目的地址
+//DataToWrite:要写入的数据
+void mir3da_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
+{
+    IIC2_Start();
+    IIC2_Send_Byte(0X4e);	    //发送写命令
+    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 mir3da_WriteLenByte(uint16_t WriteAddr,uint32_t DataToWrite,uint8_t Len)
+{
+    uint8_t t;
+    for(t=0; t<Len; t++)
+    {
+        mir3da_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
+    }
+}
+
+//在AT24CXX里面的指定地址开始读出长度为Len的数据
+//该函数用于读出16bit或者32bit的数据.
+//ReadAddr   :开始读出的地址
+//返回值     :数据
+//Len        :要读出数据的长度2,4
+uint32_t bu=0;
+uint32_t mir3da_ReadLenByte(uint16_t ReadAddr,int Len)
+{
+    uint8_t t;
+    u8_m data[Len];
+    memset(data, 0, Len);
+    for(t=0; t<Len; t++)
+    {
+        data[t] = mir3da_ReadOneByte(ReadAddr+t);
+    }
+    bu = (data[0] << 8 | data[1])/2;
+
+    return bu;
+}
+
+
+/*******************************************************************************
+* 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
+*******************************************************************************/
+uint8_t LIS3DH_ReadReg(uint8_t Reg, uint8_t* Data) {
+
+    //To be completed with either I2c or SPI reading function
+    //i.e. *Data = SPI_Mems_Read_Reg( Reg );
+    *Data = LIS3DH_ReadOneByte(Reg);
+    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
+*******************************************************************************/
+uint8_t LIS3DH_WriteReg(uint8_t WriteAddr, uint8_t Data) {
+
+    //To be completed with either I2c or SPI writing function
+    //i.e. SPI_Mems_Write_Reg(WriteAddr, Data);
+    LIS3DH_WriteOneByte(WriteAddr,Data);
+
+    return 1;
+}
+
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+* 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_GetWHO_AM_I(uint8_t* val) {
+
+    if( !LIS3DH_ReadReg(LIS3DH_WHO_AM_I, val) )
+        return MEMS_ERROR;
+
+    return MEMS_SUCCESS;
+}
+
+/*******************************************************************************
+* 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_GetStatusAUX(uint8_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_GetStatusAUXBit(uint8_t statusBIT, uint8_t* val) {
+    uint8_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;
+}
+
+
+/*******************************************************************************
+* 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_SetODR(LIS3DH_ODR_t ov) {
+    uint8_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_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_SetTemperature(State_t state) {
+    uint8_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_SetADCAux(State_t state) {
+    uint8_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_GetAuxRaw(LIS3DH_Aux123Raw_t* buff) {
+    uint8_t valueL;
+    uint8_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 = (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<<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_SetAxis(LIS3DH_Axis_t axis) {
+    uint8_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_SetFullScale(LIS3DH_Fullscale_t fs) {
+    uint8_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_SetBDU(State_t bdu) {
+    uint8_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_SetBLE(LIS3DH_Endianess_t ble) {
+    uint8_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_SetSelfTest(LIS3DH_SelfTest_t st) {
+    uint8_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_HPFClickEnable(State_t hpfe) {
+    uint8_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_HPFAOI1Enable(State_t hpfe) {
+    uint8_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_HPFAOI2Enable(State_t hpfe) {
+    uint8_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_SetHPFMode(LIS3DH_HPFMode_t hpm) {
+    uint8_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_SetHPFCutOFF(LIS3DH_HPFCutOffFreq_t hpf) {
+    uint8_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_SetFilterDataSel(State_t state) {
+    uint8_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_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_SetInt1Pin(LIS3DH_IntPinConf_t pinConf) {
+    uint8_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_SetInt2Pin(LIS3DH_IntPinConf_t pinConf) {
+    uint8_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_SetClickCFG(uint8_t status) {
+    uint8_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_SetClickTHS(uint8_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_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<<LIS3DH_LIR_INT1;
+
+    if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG5, value) )
+        return MEMS_ERROR;
+
+    return MEMS_SUCCESS;
+}
+
+
+/*******************************************************************************
+* Function Name  : LIS3DH_ResetInt1Latch
+* Description    : Reset Interrupt 1 Latching function
+* Input          : None
+* Output         : None
+* Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
+*******************************************************************************/
+status_t LIS3DH_ResetInt1Latch(void) {
+    uint8_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_SetIntConfiguration(LIS3DH_Int1Conf_t ic) {
+    uint8_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_SetIntMode(LIS3DH_Int1Mode_t int_mode) {
+    uint8_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_SetInt6D4DConfiguration(LIS3DH_INT_6D_4D_t ic) {
+    uint8_t value;
+    uint8_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_Get6DPosition(uint8_t* val) {
+    uint8_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_SetInt1Threshold(uint8_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_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<<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_SetTriggerInt(LIS3DH_TrigInt_t tr) {
+    uint8_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_SetWaterMark(uint8_t wtm) {
+    uint8_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_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<<LIS3DH_SIM;
+
+    if( !LIS3DH_WriteReg(LIS3DH_CTRL_REG4, value) )
+        return MEMS_ERROR;
+
+    return MEMS_SUCCESS;
+}
+/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/
+

--
Gitblit v1.9.3