|
@@ -0,0 +1,483 @@
|
|
|
+#include "sensor.h"
|
|
|
+
|
|
|
+
|
|
|
+/***************在线测试**********************/
|
|
|
+INT8 SL_SC7A20_Online_Test(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg=0xff;
|
|
|
+ GSENSOR_ReadReg(SC7A20_CHIP_ID_ADDRESS,1, &SL_Read_Reg);
|
|
|
+ //printf("SL_Read_Reg = %#x\r\n",SL_Read_Reg);
|
|
|
+ if(SL_Read_Reg==SC7A20_CHIP_ID_VALUE){
|
|
|
+ return 1;
|
|
|
+ } else {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/***************BOOT 重载内部寄存器值*********************/
|
|
|
+INT8 SL_SC7A20_BOOT(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg=0xff;
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_BOOT_ENABLE|SL_Read_Reg;
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/***************传感器量程设置**********************/
|
|
|
+INT8 SL_SC7A20_FS_Config(UINT8 Sc7a20_FS_Reg)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg=0xff,SL_Write_Reg;
|
|
|
+
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG4,1, &SL_Read_Reg);
|
|
|
+ SL_Write_Reg=0x80|Sc7a20_FS_Reg|SL_SC7A20_HR_ENABLE;
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG4, SL_Write_Reg);
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG4,1, &SL_Read_Reg);
|
|
|
+ if(SL_Read_Reg==SL_Write_Reg) {
|
|
|
+ return 1;
|
|
|
+ }else{
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#if SL_6D4D2D1D_SEL==1 //1D
|
|
|
+//AOI1_INT1 运动检测,运动触发中断 6D运动检测
|
|
|
+//AOI2_INT2 位置检测,检测是否离开X+位置 1D位置识别
|
|
|
+/***************中断设置*************/
|
|
|
+INT8 SL_SC7A20_INT_Config(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg;
|
|
|
+
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//AOI1 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //H_LACTIVE SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_INT_ACTIVE_LOWER_LEVEL|SL_Read_Reg;
|
|
|
+ //interrupt happen,int pin output lower level
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI1 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0x7F
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40;//方向运动识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x03;//X 轴高低事件 X轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x0C;//Y 轴高低事件 Y轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x30;//Z 轴高低事件 Z轴数据的绝对值大于阈值
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_THS, SL_SC7A20_INT_THS_10PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI1 TO INT1
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG3,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40; //AOI1 TO INT1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG3, SL_Read_Reg);
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+
|
|
|
+
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//AOI2 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //H_LACTIVE SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_INT_ACTIVE_LOWER_LEVEL|SL_Read_Reg;
|
|
|
+ //interrupt happen,int pin output lower level
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI2 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0xC2
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0xC0;//方向位置识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//X 轴高事件 X轴数据大于阈值 输出低电平,默认输出高电平
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg&0xFD;//NO HPF TO AOI2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_40PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI2 TO INT2
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20; //AOI2 TO INT2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+#elif SL_6D4D2D1D_SEL==2 //2D
|
|
|
+//AOI1_INT1 运动检测,运动触发中断 或事件 3D运动检测
|
|
|
+//AOI2_INT2 位置检测,检测X+ 和 X- 2D位置识别
|
|
|
+/***************中断设置*************/
|
|
|
+INT8 SL_SC7A20_INT_Config(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg;
|
|
|
+
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//AOI1 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI1 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0x2A 或事件
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//X 轴高事件 X轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//Y 轴高事件 Y轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20;//Z 轴高事件 Z轴数据的绝对值大于阈值
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_THS, SL_SC7A20_INT_THS_10PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI1 TO INT1
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG3,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40; //AOI1 TO INT1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG3, SL_Read_Reg);
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+
|
|
|
+
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//AOI2 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //H_LACTIVE SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_INT_ACTIVE_LOWER_LEVEL|SL_Read_Reg;
|
|
|
+ //interrupt happen,int pin output lower level
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI2 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0xC3
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0xC0;//方向位置识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x03;//X 轴高低事件 X轴数据的绝对值大于阈值 输出低电平,默认输出高电平
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg&0xFD;//NO HPF TO AOI2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_40PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI2 TO INT2
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20; //AOI2 TO INT2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+#elif SL_6D4D2D1D_SEL==4 //4D
|
|
|
+//AOI1_INT1 运动检测,运动触发中断 或事件 3D运动检测
|
|
|
+//AOI2_INT2 位置检测,检测X+ 和 X- Y+ 和 Y- 4D位置识别
|
|
|
+/***************中断设置*************/
|
|
|
+INT8 SL_SC7A20_INT_Config(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg;
|
|
|
+
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//AOI1 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI1 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0x2A 或事件
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//X 轴高事件 X轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//Y 轴高事件 Y轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20;//Z 轴高事件 Z轴数据的绝对值大于阈值
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_THS, SL_SC7A20_INT_THS_10PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI1 TO INT1
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG3,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40; //AOI1 TO INT1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG3, SL_Read_Reg);
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+
|
|
|
+
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//AOI2 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //H_LACTIVE SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_INT_ACTIVE_LOWER_LEVEL|SL_Read_Reg;
|
|
|
+ //interrupt happen,int pin output lower level
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI2 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0xCF
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0xC0;//方向位置识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x0F;//XY 轴高低事件 XY轴数据的绝对值大于阈值 输出低电平,默认输出高电平
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg&0xFD;//NO HPF TO AOI2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_40PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI2 TO INT2
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20; //AOI2 TO INT2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+#elif SL_6D4D2D1D_SEL==6 //6D
|
|
|
+//AOI1_INT1 运动检测,运动触发中断 6D运动检测
|
|
|
+//AOI2_INT2 位置检测,检测X+ 和 X- Y+ 和 Y- Z+ 和 Z- 6D位置识别
|
|
|
+/***************中断设置*************/
|
|
|
+INT8 SL_SC7A20_INT_Config(void)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg;
|
|
|
+
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x08;//AOI1 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI1 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0x7F 无LATCH功能
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40;//方向运动识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x03;//X 轴高低事件 X轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x0C;//Y 轴高低事件 Y轴数据的绝对值大于阈值
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x30;//Z 轴高低事件 Z轴数据的绝对值大于阈值
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x81;//Normal HP , HPF TO AOI1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_THS, SL_SC7A20_INT_THS_10PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI1 TO INT1
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG3,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x40; //AOI1 TO INT1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG3, SL_Read_Reg);
|
|
|
+ /*******************AOI1 IN INT1********************/
|
|
|
+
|
|
|
+
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG5,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x02;//AOI2 LATCH
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG5, SL_Read_Reg);
|
|
|
+
|
|
|
+ //H_LACTIVE SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_SC7A20_INT_ACTIVE_LOWER_LEVEL|SL_Read_Reg;
|
|
|
+ //interrupt happen,int pin output lower level
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+
|
|
|
+ //AOI2 CONFIG
|
|
|
+ SL_Read_Reg=0x00; //0xC2
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0xC0;//方向位置识别模式
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x3F;//XYZ 轴高事件 XYZ轴数据的绝对值大于阈值 输出低电平,默认输出高电平
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_CFG, SL_Read_Reg);
|
|
|
+
|
|
|
+ //HPF SET
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG2,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg&0xFD;//NO HPF TO AOI2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG2, SL_Read_Reg);
|
|
|
+
|
|
|
+ //中断阈值设置
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_THS, SL_SC7A20_INT_THS_40PERCENT);
|
|
|
+ //大于阈值多少时间触发中断
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_DURATION, SL_SC7A20_INT_DURATION_2CLK);
|
|
|
+
|
|
|
+ //AOI2 TO INT2
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG6,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|0x20; //AOI2 TO INT2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG6, SL_Read_Reg);
|
|
|
+ /*******************AOI2 IN INT2********************/
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/******外部中断处理函数中需要调用该函数*******/
|
|
|
+//retrun_value&0x20=0x20 ZH Z轴高事件
|
|
|
+//retrun_value&0x20=0x10 ZL Z轴低事件
|
|
|
+//retrun_value&0x20=0x08 YH Y轴高事件
|
|
|
+//retrun_value&0x20=0x04 YL Y轴低事件
|
|
|
+//retrun_value&0x20=0x02 XH X轴高事件
|
|
|
+//retrun_value&0x20=0x01 XL X轴低事件
|
|
|
+INT8 SL_SC7A20_INT_RESET(void)
|
|
|
+{
|
|
|
+
|
|
|
+ UINT8 SL_Read_Reg1;
|
|
|
+ UINT8 SL_Read_Reg2;
|
|
|
+
|
|
|
+ /*****为了避免读取数据过程中又产生中断,可以暂时关闭中断*****/
|
|
|
+
|
|
|
+ //SL_Read_Reg1 display the int1 type
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_INT1_SRC,1, &SL_Read_Reg1);
|
|
|
+ //SL_Read_Reg2 display the int2 type
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_INT2_SRC,1, &SL_Read_Reg2);
|
|
|
+
|
|
|
+ //close INT1
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT1_CFG, 0x00);
|
|
|
+ //close INT2
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_INT2_CFG, 0x00);
|
|
|
+
|
|
|
+ if((SL_Read_Reg2&0x02)==0x02)
|
|
|
+ {
|
|
|
+ //X+
|
|
|
+ }
|
|
|
+ if((SL_Read_Reg2&0x01)==0x01)
|
|
|
+ {
|
|
|
+ //X-
|
|
|
+ }
|
|
|
+ if((SL_Read_Reg2&0x08)==0x08)
|
|
|
+ {
|
|
|
+ //Y+
|
|
|
+ }
|
|
|
+ if((SL_Read_Reg2&0x04)==0x04)
|
|
|
+ {
|
|
|
+ //Y-
|
|
|
+ }
|
|
|
+ if((SL_Read_Reg2&0x20)==0x20)
|
|
|
+ {
|
|
|
+ //Z+
|
|
|
+ }
|
|
|
+ if((SL_Read_Reg2&0x10)==0x10)
|
|
|
+ {
|
|
|
+ //Z-
|
|
|
+ }
|
|
|
+
|
|
|
+ if(SL_Read_Reg1!=0||SL_Read_Reg2!=0)
|
|
|
+ {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/***************数据更新速率**加速度计使能**********/
|
|
|
+INT8 SL_SC7A20_Power_Config(UINT8 Power_Config_Reg)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Reg;
|
|
|
+
|
|
|
+#if SL_SC7A20_MTP_ENABLE==1
|
|
|
+ SL_Read_Reg = 0x00;
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_MTP_CFG, SL_SC7A20_MTP_VALUE);
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_SDOI2C_PU_CFG,1, &SL_Read_Reg);
|
|
|
+ SL_Read_Reg=SL_Read_Reg|SL_SC7A20_SDO_PU_MSK|SL_SC7A20_I2C_PU_MSK;
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_SDOI2C_PU_CFG, SL_Read_Reg);
|
|
|
+#endif
|
|
|
+ SL_Read_Reg = 0xff;
|
|
|
+ GSENSOR_WriteReg(SL_SC7A20_CTRL_REG1, Power_Config_Reg);
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_CTRL_REG1,1, &SL_Read_Reg);
|
|
|
+
|
|
|
+ if(SL_Read_Reg==Power_Config_Reg){
|
|
|
+ return 1;
|
|
|
+ }else{
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#if SL_SC7A20_16BIT_8BIT==0
|
|
|
+/***************加速度计数据读取*8bits*********/
|
|
|
+INT8 SL_SC7A20_Read_XYZ_Data(INT8 *SL_SC7A20_Data_XYZ_Buf)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Buf[7];
|
|
|
+
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
|
|
|
+
|
|
|
+ if((SL_Read_Buf[0]&0x0f)==0x0f)
|
|
|
+ {
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[0]=(INT8)SL_Read_Buf[2];
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[1]=(INT8)SL_Read_Buf[4];
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[2]=(INT8)SL_Read_Buf[6];
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+#elif SL_SC7A20_16BIT_8BIT==1
|
|
|
+/***************加速度计数据读取*16bits*********/
|
|
|
+INT8 SL_SC7A20_Read_XYZ_Data(INT16 *SL_SC7A20_Data_XYZ_Buf)
|
|
|
+{
|
|
|
+ UINT8 SL_Read_Buf[7];
|
|
|
+
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
|
|
|
+
|
|
|
+ if((SL_Read_Buf[0]&0x0f)==0x0f)
|
|
|
+ {
|
|
|
+ GSENSOR_ReadReg(SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
|
|
|
+
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[0]=(INT16)((SL_Read_Buf[2]<<8) + SL_Read_Buf[1]);
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[1]=(INT16)((SL_Read_Buf[4]<<8) + SL_Read_Buf[3]);
|
|
|
+ SL_SC7A20_Data_XYZ_Buf[2]=(INT16)((SL_Read_Buf[6]<<8) + SL_Read_Buf[5]);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+void GsensorInit(void)
|
|
|
+{
|
|
|
+ INT8 res = 0;
|
|
|
+ res = SL_SC7A20_Online_Test();
|
|
|
+ if(res==1){
|
|
|
+
|
|
|
+ SL_SC7A20_BOOT();
|
|
|
+ SL_SC7A20_FS_Config(SL_SC7A20_FS_4G);
|
|
|
+ SL_SC7A20_INT_Config();
|
|
|
+ SL_SC7A20_INT_RESET();
|
|
|
+ SL_SC7A20_Power_Config(SL_SC7A20_LOWER_POWER_ODR_400HZ);
|
|
|
+ }
|
|
|
+}
|