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.
 
 
 
 

911 lines
31 KiB

#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 Reserveddo 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 Reserveddo not modify 0E Reserved
reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001
reg( 5)= C5 197 Reserveddo not modify 10-12 Reserved
reg( 6)= 0 0 USER_CAL 13-1A
reg( 7)= 0 0 Reserveddo 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 Reserveddo 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 Reserveddo not modify 0E Reserved
reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001
reg( 5)= 80 128 Reserveddo not modify 10-12 Reserved
reg( 6)= 0 0 USER_CAL 13-1A
reg( 7)= 0 0 Reserveddo 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