You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
912 lines
31 KiB
912 lines
31 KiB
1 year ago
|
#include "bsp_sca720.h"
|
||
|
#include "c_lib.h"
|
||
|
#include "debug_drv.h"
|
||
|
|
||
|
#include "TTSS_task.h"
|
||
|
///u8 SC7A20_Msg = 8;
|
||
|
u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80};
|
||
|
/// /// 0 1 2 3 4 5 6 7 8 9
|
||
|
|
||
|
TS_sca720_ ts_gs7=
|
||
|
{
|
||
|
///u8 reg[33];//0x1e
|
||
|
0x05,///00 #define D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000
|
||
|
0x00,///01 #define D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output
|
||
|
0x2f,///02 #define D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111
|
||
|
0x04,///03 #define D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000
|
||
|
0x80,///04 #define D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000
|
||
|
0x08,///05 #define D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000
|
||
|
0x00,///06 #define D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000
|
||
|
0x02,///07 #define D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000
|
||
|
0x00,///08 #define D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000
|
||
|
0x00,///09 #define D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000
|
||
|
0x00,///10 #define D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output
|
||
|
0x00,///11 #define D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output
|
||
|
0x00,///12 #define D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output
|
||
|
0x00,///13 #define D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output
|
||
|
0x00,///14 #define D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output
|
||
|
0x00,///15 #define D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output
|
||
|
0x00,///16 #define D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000
|
||
|
0x00,///17 #define D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111
|
||
|
0x00,///18 #define D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000
|
||
|
0x00,///19 #define D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000
|
||
|
0x00,///20 #define D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000
|
||
|
0x00,///21 #define D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000
|
||
|
0x00,///22 #define D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000
|
||
|
0x00,///23 #define D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000
|
||
|
0x00,///24 #define D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000
|
||
|
0x00,///25 #define D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000
|
||
|
0x15,///26 #define D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000
|
||
|
0x00,///27 #define D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000
|
||
|
0x00,///28 #define D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000
|
||
|
0x05,///29 #define D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000
|
||
|
0x01,///30 #define D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000
|
||
|
0x00,///31 #define D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000
|
||
|
0x00,///32 #define D_SC7A20_ACT_THS 0x3E ////rw 011 1110
|
||
|
0x00,///33 #define D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111
|
||
|
|
||
|
};
|
||
|
|
||
|
#define D_reg(x) ts_gs7.reg[x-D_0x1e]
|
||
|
#define L0_set_reg(x) Sensor_Write_Byte(x,D_reg(x))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
static INT8U g_level;
|
||
|
|
||
|
|
||
|
static INT8U G_sensor_status=0;
|
||
|
|
||
|
///#define BITN_1(X,BITNx) (X)|= (BITNx)
|
||
|
///#define BITN_0(X,BITNx) (X)&=~(BITNx)
|
||
|
|
||
|
#define D_SC7A20_ODR_Powerdown 0 ///电源关断模式
|
||
|
#define D_SC7A20_ODR_10HZ 0x20///正常/低功耗10HZ
|
||
|
#define D_SC7A20_LPEN BITN3
|
||
|
#define D_SC7A20_Zen BITN2
|
||
|
#define D_SC7A20_Yen BITN1
|
||
|
#define D_SC7A20_Xen BITN0
|
||
|
|
||
|
#define D_D_SC7A20_LowPower 1
|
||
|
#define D_D_SC7A20_NormalPower 0
|
||
|
|
||
|
///
|
||
|
|
||
|
void L1_SC7A20_lowpower(vtype normallowpoer)
|
||
|
{
|
||
|
D_reg(D_SC7A20_CTRL_REG1) = 0;
|
||
|
if(D_D_SC7A20_LowPower == normallowpoer)
|
||
|
{
|
||
|
BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ|D_SC7A20_LPEN);///1,低功耗模式
|
||
|
BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能
|
||
|
}else
|
||
|
{
|
||
|
BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ);/// 正常模式//odr 10Hz
|
||
|
BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//INT1_CFG 30H
|
||
|
#define D_INT1_AOI BITN7
|
||
|
#define D_INT1_6D BITN6
|
||
|
#define D_INT1_ZHIE_ZUPE BITN5
|
||
|
#define D_INT1_ZLIE_ZDOWNE BITN4
|
||
|
#define D_INT1_YHIE_YUPE BITN3
|
||
|
#define D_INT1_YLIE_YDOWNE BITN2
|
||
|
#define D_INT1_XHIE_XUPE BITN1
|
||
|
#define D_INT1_XLIE_XDOWNE BITN0
|
||
|
|
||
|
/************
|
||
|
|
||
|
12.2 控制寄存器 2 (21h)
|
||
|
B7 B6 B5 B4 B3 B2 B1 B0
|
||
|
HPM1 HPM0 HPCF2 HPCF1 FDS HPCLICK HPIS2 HPIS1
|
||
|
HPM1-HPM0 高通模式选择。默认值:00
|
||
|
参考“高通模式配置”
|
||
|
HPCF2 -HPCF1 高通截止频率选择
|
||
|
FDS 数据滤波选择。默认值:0
|
||
|
(0:跳过内部滤波; 1:内部滤波以后的数据输出到数据寄存器或 FIFO
|
||
|
HPCLICK CLICK 功能高通滤波使能。
|
||
|
(0:滤波禁止; 1:滤波使能)
|
||
|
HPIS2 中断 2 AOI 功能高通滤波使能。
|
||
|
(0:滤波禁止; 1:滤波使能)
|
||
|
HPIS1 中断 1 AOI 功能高通滤波使能。
|
||
|
(0:滤波禁止; 1:滤波使能)
|
||
|
***********/
|
||
|
|
||
|
#define HPCLICK BITN2
|
||
|
|
||
|
#define HPIS2 BITN1
|
||
|
#define HPIS1 BITN0
|
||
|
|
||
|
/***********
|
||
|
12.4 控制寄存器 4(23h)
|
||
|
B7 B6 B5 B4 B3 B2 B1 B0
|
||
|
BDU BLE FS1 FS0 HR ST1 ST0 SIM
|
||
|
BDU 块数据更新。默认值:0
|
||
|
(0:连续更新;1:输出数据寄存器不更新直到 MSB 和 LSB 被读取)
|
||
|
BLE 大端/小端数据选择。默认值:0
|
||
|
(0:低字节数据在低地址;1:高字节数据在低地址)
|
||
|
FS1-FS0 全量程选择。默认值:00
|
||
|
(00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G)
|
||
|
HR 高精度输出模式选择。默认值:0
|
||
|
(0: 高精度禁止; 1:高精度使能)
|
||
|
ST1-ST0 自测试使能。默认值:00
|
||
|
(00: 自测试禁止;其他: 参考“自测试模式配置” )
|
||
|
SIM SPI 串行接口模式配置。默认值:0
|
||
|
(0:4 线接口; 1:3 线接口)
|
||
|
|
||
|
#define SL_SC7A20_FS_2G (unsigned char)0x00
|
||
|
#define SL_SC7A20_FS_4G (unsigned char)0x10
|
||
|
#define SL_SC7A20_FS_8G (unsigned char)0x20
|
||
|
#define SL_SC7A20_FS_16G (unsigned char)0x30
|
||
|
|
||
|
|
||
|
|
||
|
12.5 控制寄存器 5(24h)
|
||
|
B7 B6 B5 B4 B3 B2 B1 B0
|
||
|
BOOT FIFO_EN -- -- LIR_INT1 D4D_INT1 LIR_INT2 D4D_INT2
|
||
|
|
||
|
BOOT 重载修调值。默认值:0
|
||
|
(0:正常模式; 1:重载修调值)
|
||
|
FIFO_EN FIFO 使能。默认值:0
|
||
|
(0:FIFO 禁止; 1: FIFO 使能)
|
||
|
LIR_INT1 锁存中断 1 配置寄存器上指定的中断响应。
|
||
|
通过读中断 1 配置寄存器可以清除相应的中断锁存信号。默认值:0
|
||
|
(0: 不锁存中断信号; 1:锁存中断信号)
|
||
|
D4D_INT1 4D 使能: 在 INT1 管脚上使能 4D 检测,同时要把中断 1 配置寄存器中的 6D 为置 1。
|
||
|
LIR_INT2 锁存中断 2 配置寄存器上指定的中断响应。
|
||
|
通过读中断 2 配置寄存器可以清除相应的中断锁存信号。默认值:0
|
||
|
(0: 不锁存中断信号; 1:锁存中断信号)
|
||
|
D4D_INT2 4 D 使能: 在 INT2 管脚上使能 4D 检测,同时要把中断 2 配置寄存器中的 6D 为置 1。
|
||
|
***********/
|
||
|
#define LIR_INT1 BITN3
|
||
|
void L1_SC7A20_FF(void)
|
||
|
{
|
||
|
D_reg(D_SC7A20_CTRL_REG1) = SL_SC7A20_ODR_100HZ;
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG1);
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG2) = 0;///0:滤波禁止
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG2);
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG3) = 0;///中断全部禁止
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG3);
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认
|
||
|
|
||
|
///D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_4G;///FIXME:高精度和功耗的关系需要FAE确认
|
||
|
|
||
|
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG4);
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG5) = LIR_INT1;///FIXME:高精度和功耗的关系需要FAE确认
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG5);
|
||
|
|
||
|
//FreeFall AOI1
|
||
|
D_reg(D_SC7A20_INT1_CFG) = 0x95;///1001 0101 与中断 xyz低中断使能 高中断关闭
|
||
|
/// D_reg(D_SC7A20_INT1_CFG) = D_INT1_AOI|D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE;///1001 0101 与中断 xz低中断使能 高中断关闭
|
||
|
// D_reg(D_SC7A20_INT1_CFG) = D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE|D_INT1_YLIE_YDOWNE;///1001 0101 中断 xz低中断使能 高中断关闭
|
||
|
L0_set_reg(D_SC7A20_INT1_CFG);///
|
||
|
|
||
|
#ifdef D_2g
|
||
|
|
||
|
D_reg(D_SC7A20_INT1_THS) = 0x1F;///
|
||
|
L0_set_reg(D_SC7A20_INT1_THS);///
|
||
|
D_reg(D_SC7A20_INT1_DURATION) = 0x05;///
|
||
|
L0_set_reg(D_SC7A20_INT1_DURATION);///
|
||
|
|
||
|
#else
|
||
|
|
||
|
D_reg(D_SC7A20_INT1_THS) = 0x1F;///
|
||
|
L0_set_reg(D_SC7A20_INT1_THS);///
|
||
|
D_reg(D_SC7A20_INT1_DURATION) = 0x05;///
|
||
|
L0_set_reg(D_SC7A20_INT1_DURATION);///
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
void L1_SC7A20_Init(u8 *Acc_Int_Thr)
|
||
|
{
|
||
|
u8 temp1;
|
||
|
Acc_Int_Thr = 0;
|
||
|
Sensor_Read_Byte(CHIPID,&temp1);
|
||
|
printf("Chip_ID = %x\r\n", temp1);
|
||
|
|
||
|
printf("G_Sensor_SC7A20_Init \r\n");
|
||
|
if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了
|
||
|
{
|
||
|
printf("Error\r\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
#if 10
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG1) = 0x57;///1
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG1);///
|
||
|
|
||
|
|
||
|
L1_SC7A20_lowpower(D_D_SC7A20_NormalPower);///L0_set_reg(D_SC7A20_CTRL_REG1);//odr 10Hz
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG2);//fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G)
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG3) = D_REG3_I1_AOI1;/// 0x22, 0x40);//AOI1 映射到INT1
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG3);///
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG4) = D_FS_4G;
|
||
|
/// D_reg(D_SC7A20_CTRL_REG4) = D_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG4);
|
||
|
|
||
|
L0_set_reg(D_SC7A20_NVM_WR); //开启控制开关
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG5) = 0x80;///B1000_0000
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG5);///
|
||
|
/// Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻fixme:20220401
|
||
|
|
||
|
D_reg(D_SC7A20_CTRL_REG6) = D_REG6_H_LACTIVE;///
|
||
|
L0_set_reg(D_SC7A20_CTRL_REG6);///0x25, 0x02);//INT1 默认高电平,有中断输出低电平 selects active level low for pin INT 正常是高电平,有效的时候是低电平
|
||
|
|
||
|
|
||
|
|
||
|
L1_SC7A20_FF();
|
||
|
|
||
|
/// L0_set_reg(D_SC7A20_CLICK_THS);// //设定中断阈值(触发阈值)
|
||
|
/// L0_set_reg(D_SC7A20_TIME_LIMIT);//
|
||
|
|
||
|
#else
|
||
|
|
||
|
reg( 20)=2f 47
|
||
|
reg( 21)=4 4
|
||
|
reg( 22)=80 128
|
||
|
reg( 23)=88 136
|
||
|
reg( 24)=0 0
|
||
|
reg( 25)=2 2
|
||
|
|
||
|
/// u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80};
|
||
|
/// 0 1 2 3 4 5 6 7 8 9
|
||
|
Sensor_Write_Byte(D_SC7A20_CTRL_REG1,D_reg(D_SC7A20_CTRL_REG1));///SC7A20_REG[0]); //odr 10Hz
|
||
|
Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G)
|
||
|
Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8
|
||
|
//SDO 接地
|
||
|
Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关
|
||
|
Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻
|
||
|
|
||
|
Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平
|
||
|
Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值)
|
||
|
Sensor_Write_Byte(0x3b,SC7A20_REG[6]);
|
||
|
|
||
|
Sensor_Write_Byte(0x3c,SC7A20_REG[7]);
|
||
|
Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应))
|
||
|
Sensor_Write_Byte(0x22,SC7A20_REG[9]);
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
///#define D_2uc_u16(H,L) (((u16)H)<<8 | (u16)L)
|
||
|
void L1_SC7A20_xyz(void)
|
||
|
{
|
||
|
L2_IICM1_ReadReg(G_SlaveAddr,(D_SC7A20_ADD_INC|D_SC7A20_OUT_X_L),
|
||
|
&D_reg(D_SC7A20_OUT_X_L),6);
|
||
|
///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3);
|
||
|
///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3);
|
||
|
ts_gs7.x = D_2uc_u16(D_reg(D_SC7A20_OUT_X_H),D_reg(D_SC7A20_OUT_X_L));
|
||
|
ts_gs7.y = D_2uc_u16(D_reg(D_SC7A20_OUT_Y_H),D_reg(D_SC7A20_OUT_Y_L));
|
||
|
ts_gs7.z = D_2uc_u16(D_reg(D_SC7A20_OUT_Z_H),D_reg(D_SC7A20_OUT_Z_L));
|
||
|
|
||
|
printf("\r\n%d %d %d",ts_gs7.x,ts_gs7.y,ts_gs7.z);
|
||
|
|
||
|
|
||
|
}
|
||
|
/*******
|
||
|
12.12 中断 1 状态寄存器 (31h)
|
||
|
B7 B6 B5 B4 B3 B2 B1 B0
|
||
|
0 IA ZH ZL YH YL XH XL
|
||
|
IA 中断激活。默认值:0
|
||
|
(0: 中断没有产生; 1:一个或多个中断已经产生)
|
||
|
ZH Z 轴高。 默认值:0
|
||
|
(0:没有中断, 1:Z 轴高事件已经产生)
|
||
|
ZL Z 轴低。默认值:0
|
||
|
(0:没有中断, 1:Z 轴低事件已经产生)
|
||
|
YH Y 轴高。 默认值:0
|
||
|
(0:没有中断, 1:Y 轴高事件已经产生)
|
||
|
YL Y 轴低。默认值:0
|
||
|
(0:没有中断, 1:Y 轴低事件已经产生)
|
||
|
XH X 轴高。 默认值:0
|
||
|
(0:没有中断, 1:X 轴高事件已经产生)
|
||
|
XL X 轴低。默认值:0
|
||
|
(0:没有中断, 1:X 轴低事件已经产生)
|
||
|
|
||
|
|
||
|
*********/
|
||
|
|
||
|
|
||
|
|
||
|
//自由落体检测
|
||
|
void L2_SC7A20_Freefall_Status(void)
|
||
|
{
|
||
|
unsigned char sl_freefall_reg;
|
||
|
|
||
|
Sensor_Read_Byte(D_SC7A20_INT1_SOURCE, &sl_freefall_reg);
|
||
|
//USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg);
|
||
|
if((sl_freefall_reg&0x40)==0x40)
|
||
|
{///跌落第一级判定 fixme:
|
||
|
if(ts_gs7.staus != sl_freefall_reg)
|
||
|
{
|
||
|
ts_gs7.staus = sl_freefall_reg;
|
||
|
if(sl_freefall_reg == 0x55)
|
||
|
{
|
||
|
ts_gs7.ff_temp ++;
|
||
|
printf(" 20000 INT1_SOURCE (%2x)= %2x %d",
|
||
|
(int)D_SC7A20_INT1_SOURCE,(int)sl_freefall_reg,(int)ts_gs7.ff_temp);
|
||
|
ts_gs7.n = 0;
|
||
|
ts_gs7.got = 1;
|
||
|
TTSS_overtime_init(ts_gs7.stamp,10);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(1 == ts_gs7.got)
|
||
|
{
|
||
|
TTSS_overtime_get(ts_gs7.stamp)
|
||
|
{////空闲一段时间后 确定当前跌落持续的时间
|
||
|
ts_gs7.ff = ts_gs7.ff_temp;
|
||
|
printf(" FF %d",(int)ts_gs7.ff);
|
||
|
ts_gs7.ff_temp = 0;
|
||
|
ts_gs7.got = 0;
|
||
|
}
|
||
|
TTSS_overtime_end
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void L3_GSensor_setPara(u8 filter)
|
||
|
{
|
||
|
if(filter == Ts_debug.td->filter)
|
||
|
{
|
||
|
/// L0_uart0_uc("A"); L0_uart0_0d0a();
|
||
|
if(0x01 == Ts_debug.td->ocr)
|
||
|
{
|
||
|
if(0x04 == Ts_debug.td->R1)///
|
||
|
{ //// fc R1 R2 R3 ocr
|
||
|
//// fc 04 33 44 01
|
||
|
L1_SC7A20_Init(&Ts_debug.td->R2);
|
||
|
printf("SC7A20_Init2 %x \r\n",Ts_debug.td->R2);
|
||
|
///L0_uart0_sendstr("\r\n G_Sensor_SC7A20_Init2\r\n");
|
||
|
/// L3_adc_zero();
|
||
|
}else if(0x01 == Ts_debug.td->R1)///设置重量的清��?
|
||
|
{
|
||
|
//// fc R1 R2 R3 ocr
|
||
|
//// fc 01 33 44 01
|
||
|
L1_SC7A20_xyz();
|
||
|
|
||
|
}else if(0x02 == Ts_debug.td->R1)///读取
|
||
|
{
|
||
|
//// fc R1 R2 R3 ocr
|
||
|
//// fc 02 33 44 01
|
||
|
|
||
|
for(Ts_debug.td->R1 = 0; Ts_debug.td->R1 <= D_SC7A20_ACT_DURATION; Ts_debug.td->R1++)
|
||
|
{
|
||
|
Ts_debug.td->R2 = L2_IICM1_Read1Reg1D(G_SlaveAddr,Ts_debug.td->R1);
|
||
|
printf("reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R1,(int)Ts_debug.td->R2 ,(int)Ts_debug.td->R2 );
|
||
|
|
||
|
}
|
||
|
|
||
|
}else if(0x03 == Ts_debug.td->R1)///设置重量的清��?
|
||
|
{
|
||
|
//// fc R1 R2 R3 ocr
|
||
|
//// fc 03 reg dat 01
|
||
|
/// fc 03
|
||
|
g_sensor_write_add(Ts_debug.td->R2,Ts_debug.td->R3);
|
||
|
printf("g_sensor_write_add reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R2,(int)Ts_debug.td->R3 ,(int)Ts_debug.td->R3 );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
L0_uart0_sendstr("\r\n command error \r\n");
|
||
|
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#ifdef doc2342342343
|
||
|
|
||
|
SL_Read_Reg=0x80|SL_Read_Reg;//AOI1 LATCH
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
|
||
|
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x22, 0x40);//AOI1 映射到INT1
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x25, 0x02);//INT1 默认高电平,有中断输出低电平
|
||
|
|
||
|
//FreeFall AOI1
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x30, 0x95);
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x32, 0x19);
|
||
|
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x33, 0x04);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef Doc09s780987
|
||
|
|
||
|
Aban
|
||
|
|
||
|
|
||
|
Aban
|
||
|
40 0A D0 05 60 C2
|
||
|
|
||
|
reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved
|
||
|
reg( 1)= F 15 OUT_TEMP_L r 0C 0001100 output
|
||
|
reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output
|
||
|
reg( 3)= B 11 Reserved(do not modify) 0E Reserved
|
||
|
reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001
|
||
|
reg( 5)= C5 197 Reserved(do not modify) 10-12 Reserved
|
||
|
reg( 6)= 0 0 USER_CAL 13-1A
|
||
|
reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved
|
||
|
reg( 8)= 0 0
|
||
|
reg( 9)= 0 0
|
||
|
reg( A)= 0 0
|
||
|
reg( B)= 0 0
|
||
|
reg( C)= 0 0
|
||
|
reg( D)= 0 0
|
||
|
reg( E)= 0 0
|
||
|
reg( F)= 11 17
|
||
|
reg( 10)= FE 254
|
||
|
reg( 11)= FF 255
|
||
|
reg( 12)= 0 0
|
||
|
reg( 13)= 10 16
|
||
|
reg( 14)= FF 255
|
||
|
reg( 15)= 8D 141
|
||
|
reg( 16)= 7E 126
|
||
|
reg( 17)= FF 255
|
||
|
reg( 18)= 2 2
|
||
|
reg( 19)= 2 2
|
||
|
reg( 1A)= 2 2
|
||
|
reg( 1B)= 2 2
|
||
|
reg( 1C)= 0 0
|
||
|
reg( 1D)= 0 0
|
||
|
reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 0000000
|
||
|
reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output
|
||
|
reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 0000011
|
||
|
reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 0000000
|
||
|
reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 0000000
|
||
|
reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 0000000
|
||
|
reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 0000000
|
||
|
reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 0000000
|
||
|
reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 0000000
|
||
|
reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000
|
||
|
reg( 28)= 60 96 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output
|
||
|
reg( 29)= 8 8 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output
|
||
|
reg( 2A)= F0 240 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output
|
||
|
reg( 2B)= 6 6 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output
|
||
|
reg( 2C)= 20 32 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output
|
||
|
reg( 2D)= C2 194 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output
|
||
|
reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000
|
||
|
reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111
|
||
|
reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 0000000
|
||
|
reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 0000000
|
||
|
reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 0000000
|
||
|
reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000
|
||
|
reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000
|
||
|
reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000
|
||
|
reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 0000000
|
||
|
reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000
|
||
|
reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 0000000
|
||
|
reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000
|
||
|
reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 0000000
|
||
|
reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000
|
||
|
reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 1100000000
|
||
|
reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 0000000
|
||
|
reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110
|
||
|
reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111
|
||
|
|
||
|
B an
|
||
|
-7424 -19168 -32640
|
||
|
-7360 -19184 -32640
|
||
|
-7344 -19168 -32640
|
||
|
reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved
|
||
|
reg( 1)= E8 232 OUT_TEMP_L r 0C 0001100 output
|
||
|
reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output
|
||
|
reg( 3)= B8 184 Reserved(do not modify) 0E Reserved
|
||
|
reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001
|
||
|
reg( 5)= 80 128 Reserved(do not modify) 10-12 Reserved
|
||
|
reg( 6)= 0 0 USER_CAL 13-1A
|
||
|
reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved
|
||
|
reg( 8)= 0 0
|
||
|
reg( 9)= 0 0
|
||
|
reg( A)= 0 0
|
||
|
reg( B)= 0 0
|
||
|
reg( C)= 0 0
|
||
|
reg( D)= 0 0
|
||
|
reg( E)= 0 0
|
||
|
reg( F)= 11 17
|
||
|
reg( 10)= 0 0
|
||
|
reg( 11)= 0 0
|
||
|
reg( 12)= 0 0
|
||
|
reg( 13)= 0 0
|
||
|
reg( 14)= 0 0
|
||
|
reg( 15)= 0 0
|
||
|
reg( 16)= 0 0
|
||
|
reg( 17)= 0 0
|
||
|
reg( 18)= 0 0
|
||
|
reg( 19)= 0 0
|
||
|
reg( 1A)= 0 0
|
||
|
reg( 1B)= 2 2
|
||
|
reg( 1C)= 0 0
|
||
|
reg( 1D)= 0 0
|
||
|
reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000
|
||
|
reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output
|
||
|
reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111
|
||
|
reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000
|
||
|
reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000
|
||
|
reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000
|
||
|
reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000
|
||
|
reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000
|
||
|
reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000
|
||
|
reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000
|
||
|
reg( 28)= 90 144 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output
|
||
|
reg( 29)= E3 227 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output
|
||
|
reg( 2A)= 30 48 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output
|
||
|
reg( 2B)= B4 180 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output
|
||
|
reg( 2C)= 80 128 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output
|
||
|
reg( 2D)= 80 128 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output
|
||
|
reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000
|
||
|
reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111
|
||
|
reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000
|
||
|
reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000
|
||
|
reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000
|
||
|
reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000
|
||
|
reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000
|
||
|
reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000
|
||
|
reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000
|
||
|
reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000
|
||
|
reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000
|
||
|
reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000
|
||
|
reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000
|
||
|
reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000
|
||
|
reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000
|
||
|
reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000
|
||
|
reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110
|
||
|
reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111
|
||
|
70 E3 00 B5 80 80
|
||
|
70 E3 80 B4 80 80
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void SC7A20_Enter_Interrupt_WakeUp_Mode(INT8U level)
|
||
|
{
|
||
|
|
||
|
|
||
|
/// I2C_gpio_init(I2C_SCL,I2C_SDA);
|
||
|
DBG_PRINT("interupt wake up mode level=%d!\r\n",level);
|
||
|
#define USE_G_SENSOR_ACTIVE 1
|
||
|
#if USE_G_SENSOR_ACTIVE ==0
|
||
|
g_sensor_write_add(0x25,0x02); //selects active level low for pin INT
|
||
|
#else
|
||
|
g_sensor_write_add(0x25,0x00); //selects active level high for pin INT
|
||
|
#endif
|
||
|
|
||
|
switch(level)
|
||
|
{
|
||
|
case 0://doesn't map to INT
|
||
|
g_sensor_write_add(0x38,0x00);
|
||
|
g_sensor_write_add(0x22,0x00);
|
||
|
return ;
|
||
|
break;
|
||
|
case 1://low
|
||
|
g_sensor_write_add(0x3a,40);
|
||
|
break;
|
||
|
case 2://mid
|
||
|
g_sensor_write_add(0x3a,20);
|
||
|
break;
|
||
|
case 3://high
|
||
|
g_sensor_write_add(0x3a,10);
|
||
|
break;
|
||
|
}
|
||
|
g_sensor_write_add(0x3b,0x7f);
|
||
|
g_sensor_write_add(0x3c,0x6a);
|
||
|
g_sensor_write_add(0x38,0x15);
|
||
|
g_sensor_write_add(0x22,0x80);
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void ap_gsensor_set_sensitive(INT8U Gsensor)
|
||
|
{
|
||
|
DBG_PRINT("ap_gsensor_set_sensitive level=%d\r\n",Gsensor);
|
||
|
///sw_i2c_lock();
|
||
|
|
||
|
switch(Gsensor)
|
||
|
{
|
||
|
case 0://doesn't map to INT
|
||
|
g_sensor_write_add(0x38,0x00);
|
||
|
g_sensor_write_add(0x22,0x00);
|
||
|
g_level = 0xff;
|
||
|
break;
|
||
|
case 1://low
|
||
|
g_sensor_write_add(0x3a,10);
|
||
|
g_level = 30;
|
||
|
break;
|
||
|
case 2://mid
|
||
|
g_sensor_write_add(0x3a,20);
|
||
|
g_level = 50;
|
||
|
break;
|
||
|
case 3://high
|
||
|
g_sensor_write_add(0x3a,40);
|
||
|
g_level = 70;
|
||
|
break;
|
||
|
default:
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
// g_sensor_write_add(INT_LATCH, 0x81); //clear gsensor interrupt flag
|
||
|
|
||
|
///sw_i2c_unlock();
|
||
|
}
|
||
|
|
||
|
|
||
|
void G_Sensor_park_mode_init(INT8U level)
|
||
|
{
|
||
|
SC7A20_Enter_Interrupt_WakeUp_Mode(level);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*read accelertion data , only X and Y axis*/
|
||
|
u8 Read_XY_Data(s8 *buf)
|
||
|
{
|
||
|
u8 cd[2];
|
||
|
/// Sensor_Read_Byte(0x28+1,&cd[0]);
|
||
|
/// Sensor_Read_Byte(0x28+3,&cd[1]);
|
||
|
buf[0]=cd[0];
|
||
|
buf[1]=cd[1];
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void G_Sensor_SC7A20_Init2(u8 *Acc_Int_Thr)
|
||
|
{
|
||
|
u8 temp1;
|
||
|
|
||
|
Sensor_Read_Byte(CHIPID,&temp1);
|
||
|
printf("Chip_ID = %x\r\n", temp1);
|
||
|
|
||
|
printf("G_Sensor_SC7A20_Init \r\n");
|
||
|
if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了
|
||
|
{
|
||
|
printf("Error\r\n");
|
||
|
}
|
||
|
|
||
|
/*click */
|
||
|
Sensor_Write_Byte(0x20,SC7A20_REG[0]); //odr 10Hz
|
||
|
Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G)
|
||
|
Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8
|
||
|
//SDO 接地
|
||
|
Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关
|
||
|
Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻
|
||
|
|
||
|
Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平
|
||
|
Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值)
|
||
|
Sensor_Write_Byte(0x3b,SC7A20_REG[6]);
|
||
|
|
||
|
Sensor_Write_Byte(0x3c,SC7A20_REG[7]);
|
||
|
Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应))
|
||
|
Sensor_Write_Byte(0x22,SC7A20_REG[9]);
|
||
|
|
||
|
// g_sensor_write(G_SlaveAddr,0x20,0x2f); //odr
|
||
|
// g_sensor_write(G_SlaveAddr,0x21,0x04); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G)
|
||
|
// g_sensor_write(G_SlaveAddr,0x23,0x98); //range bdu 0x20--0xA8
|
||
|
//
|
||
|
// //SDO 接地
|
||
|
// g_sensor_write(G_SlaveAddr,0x1e,0x05); //开启控制开关
|
||
|
// g_sensor_write(G_SlaveAddr,0x57,0x08); //关闭SDO管脚上的上拉电阻
|
||
|
|
||
|
/*AOI*/
|
||
|
// g_sensor_write(G_SlaveAddr,0x20,0x2f); //设置odr
|
||
|
// g_sensor_write(G_SlaveAddr,0x23,0x98); //设置量程range bdu 0x20--0xA8
|
||
|
}
|
||
|
|
||
|
|
||
|
/*read accelertion data */
|
||
|
u8 read_acceler_data(s8 *buf)
|
||
|
{
|
||
|
u8 i;
|
||
|
u8 cd[6];
|
||
|
for(i=0;i<6;i++){
|
||
|
/// Sensor_Read_Byte(0x28+i,&cd[i]);
|
||
|
}
|
||
|
buf[0]=cd[1];
|
||
|
buf[1]=cd[3];
|
||
|
buf[2]=cd[5];
|
||
|
|
||
|
// if(((buf[0]==0)&&(buf[1]==0)&&(buf[2]==0))
|
||
|
// ||((buf[0]==-1)&&(buf[1]==-1)&&(buf[2]==-1))
|
||
|
// )
|
||
|
// {
|
||
|
// return 1;
|
||
|
// }
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
INT16U G_sensor_get_int_active(void)
|
||
|
{
|
||
|
INT16U temp=0x00;
|
||
|
INT8S x,y,z=0;
|
||
|
/// sw_i2c_lock();
|
||
|
{
|
||
|
x = g_sensor_read(G_SlaveAddr, 0x29); //erichan 20150529
|
||
|
y = g_sensor_read(G_SlaveAddr, 0x2b); //erichan 20150529
|
||
|
z = g_sensor_read(G_SlaveAddr, 0x2d); //erichan 20150529
|
||
|
DBG_PRINT("abs(x)=%d,abs(y)=%d,abs(z)=%d\r\n",abs(x),abs(y),abs(z));
|
||
|
if((abs(x) > g_level) || (abs(y) > g_level) || (abs(z) > g_level))
|
||
|
temp=0x40;
|
||
|
}
|
||
|
|
||
|
/// sw_i2c_unlock();
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
void G_Sensor_Init(INT8U level)
|
||
|
{
|
||
|
G_sensor_status=0;
|
||
|
/// G_Sensor_SC7A20_Init(level);
|
||
|
}
|
||
|
|
||
|
|
||
|
INT32U G_Get_ACC_Data(INT8U addr, INT8U Num)
|
||
|
{
|
||
|
INT16U Redata,temp;
|
||
|
|
||
|
if(Num==1){
|
||
|
/// L2_iicx_Read1Reg(&ts_siic1,8);
|
||
|
Redata = g_sensor_read(G_SlaveAddr,addr);
|
||
|
/// Redata = L2_iicx_Read1Reg(&ts_siic1,addr);
|
||
|
}else{
|
||
|
temp = g_sensor_read(G_SlaveAddr,addr);
|
||
|
Redata = g_sensor_read(G_SlaveAddr,addr+1);
|
||
|
|
||
|
Redata = (Redata<<8)|(temp&0x00ff);
|
||
|
}
|
||
|
|
||
|
return Redata;
|
||
|
}
|
||
|
|
||
|
INT8U ap_gsensor_power_on_get_status(void)
|
||
|
{
|
||
|
return G_sensor_status;
|
||
|
}
|
||
|
|
||
|
void ap_gsensor_power_on_set_status(INT8U status)
|
||
|
{
|
||
|
if(status)
|
||
|
G_sensor_status=1; //gsensor power on
|
||
|
else
|
||
|
G_sensor_status=0; //key power on
|
||
|
}
|
||
|
#if 0
|
||
|
void G_Sensor_SC7A20_Init(INT8U level)
|
||
|
{
|
||
|
INT8U temp1;
|
||
|
|
||
|
INT8U MTPSETTING,B57H,B1BH,i;
|
||
|
|
||
|
MTPSETTING= 0x07;
|
||
|
B57H=0x00;
|
||
|
B1BH=0x08;//for iicaddr=0x3a
|
||
|
|
||
|
temp1 = g_sensor_read(G_SlaveAddr,CHIPID);
|
||
|
DBG_PRINT("chip_id = %x\r\n", temp1);
|
||
|
DBG_PRINT("G_Sensor_SC7A20_Init \r\n");
|
||
|
if(temp1 != 0x11)// I2C address fixed
|
||
|
{
|
||
|
for(i=0;i<3;i++)
|
||
|
{
|
||
|
g_sensor_write(0x30,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x30,0x1e,0x05);
|
||
|
g_sensor_write(0x30,0x1b,B1BH);
|
||
|
g_sensor_write(0x30,0x57,B57H);
|
||
|
|
||
|
|
||
|
g_sensor_write(0x32,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x32,0x1e,0x05);
|
||
|
g_sensor_write(0x32,0x1b,B1BH);
|
||
|
g_sensor_write(0x32,0x57,B57H);
|
||
|
|
||
|
|
||
|
g_sensor_write(0x34,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x34,0x1e,0x05);
|
||
|
g_sensor_write(0x34,0x1b,B1BH);
|
||
|
g_sensor_write(0x34,0x57,B57H);
|
||
|
|
||
|
|
||
|
|
||
|
g_sensor_write(0x36,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x36,0x1e,0x05);
|
||
|
g_sensor_write(0x36,0x1b,B1BH);
|
||
|
g_sensor_write(0x36,0x57,B57H);
|
||
|
|
||
|
|
||
|
g_sensor_write(0x38,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x38,0x1e,0x05);
|
||
|
g_sensor_write(0x38,0x1b,B1BH);
|
||
|
g_sensor_write(0x38,0x57,B57H);
|
||
|
|
||
|
|
||
|
|
||
|
g_sensor_write(0x3a,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x3a,0x1e,0x05);
|
||
|
g_sensor_write(0x3a,0x1b,B1BH);
|
||
|
g_sensor_write(0x3a,0x57,B57H);
|
||
|
|
||
|
|
||
|
g_sensor_write(0x3c,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x3c,0x1e,0x05);
|
||
|
g_sensor_write(0x3c,0x1b,B1BH);
|
||
|
g_sensor_write(0x3c,0x57,B57H);
|
||
|
|
||
|
|
||
|
|
||
|
g_sensor_write(0x3e,0x59,MTPSETTING);
|
||
|
g_sensor_write(0x3e,0x1e,0x05);
|
||
|
g_sensor_write(0x3e,0x1b,B1BH);
|
||
|
g_sensor_write(0x3e,0x57,B57H);
|
||
|
}
|
||
|
|
||
|
|
||
|
g_sensor_write(G_SlaveAddr,0x1e,0x05); //to comment
|
||
|
|
||
|
}
|
||
|
|
||
|
//g_sensor_write(0x32,0x24,0x80);
|
||
|
//---------------------------------------------------
|
||
|
temp1 = g_sensor_read(G_SlaveAddr, 0x39);
|
||
|
if(temp1 & 0x40 ) //active int flag
|
||
|
{
|
||
|
ap_gsensor_power_on_set_status(1);
|
||
|
DBG_PRINT("==========gsensor power on=========\r\n");
|
||
|
}else{
|
||
|
ap_gsensor_power_on_set_status(0);
|
||
|
DBG_PRINT("==========key power on=============\r\n");
|
||
|
}
|
||
|
|
||
|
g_sensor_write_add(0x22,0x00);
|
||
|
g_sensor_write_add(0x38,0x00);
|
||
|
g_sensor_write_add(0x24,0x80);
|
||
|
/*temp1 = g_sensor_read(G_SlaveAddr,0x57);
|
||
|
if(!(temp1 & 0x04))
|
||
|
{
|
||
|
g_sensor_write_add(0x1e,0x05);
|
||
|
temp1 |= 0x04;
|
||
|
g_sensor_write_add(0x57,temp1);
|
||
|
g_sensor_write_add(0x1e,0x15);
|
||
|
g_delay(500);
|
||
|
}*/
|
||
|
//else
|
||
|
//g_sensor_write_add(0x1e,0x00);
|
||
|
|
||
|
g_sensor_write_add(0x20,0x37);
|
||
|
g_sensor_read(G_SlaveAddr, 0x26);//
|
||
|
g_sensor_write_add(0x21,0x0d);
|
||
|
g_sensor_write_add(0x23,0x80);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|