#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