zhangbo
6 天以前 cbc3ed1b6ead25a22d1efd51401e73d7e93e2b4d
keil/include/drivers/SC7A22H_example.c
@@ -1,6 +1,6 @@
#include "SC7A22H.h"
#include "mk_trace.h"
#include "WS2812.h"
//轮询获取三轴数据示例
@@ -146,6 +146,8 @@
}
uint8_t double_click_flag=0;
unsigned char click_flag;
uint8_t click_count=0;
extern uint32_t uwbled,rtkled,led4g,powerled;
/*******双击检测示例*********/
void SC7A22H_get_double_click()
{
@@ -165,21 +167,21 @@
      SL_SC7A22H_Delay_Ms(200);
      
//5,量程设置:+-4G
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x01);//ACC_RANGE  ±4G
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x00);//ACC_RANGE  ±4G
   
//6,敲击中断设置
//输出数据寄存器不更新直到 MSB 和 LSB 被读取 2,地址自增,连续读写时地址自增
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x05, 0x50);//I2C_CFG
//推挽输出使能,   中断触发时输出高电平(默认低电平),CLICK 中断在 INT1 上   
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x06, 0x07);//INT_CFG1 CLICK TO INT1
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x06, 0x27);//INT_CFG1 CLICK TO INT1
//禁止滤波
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x08, 0x00);//Disable DLPF
//AOI 中断使能,AOI1滤波使能,锁存 AOI1_CFG 寄存器上指定的中断响应
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x3F, 0x11);//HPIS1=1 LIR_AOI1
//XYZ 轴高事件中断或者 Z 轴方向检测中断使能,
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x30, 0x2A);//xyz for aoi1 or event
//AIO1阈值:4G----32mg*8=256mg
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x32, 0x08);//aoi1 vth
//AIO1阈值:2G----16mg*8=128mg
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x32, 0x28);//aoi1 vth
//识别AIO1事件的最小持续时间
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x33, 0x02);//aoi1 tth
   
@@ -188,14 +190,13 @@
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7F, 0x90);//goto 0x90
      SL_SC7A22H_Delay_Ms(1);         
//输出中断必须满足设置的敲击阈值个数才能输出中断,否则无中断输出
//锁存CLICK 中断状态,:使能 XYZ 轴数据参与敲击检测
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x38, 0x1F);//XYZ CLICK ENABLE  AND LATCH INT LEVEL            
   //敲击前数据稳定时长设置------20ms(400hz)
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0x52);//CLICK_COEFF1
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x9A);//CLICK_COEFF2
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x42, 0x04);//CLICK_COEFF3
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x43, 0x52);//CLICK_COEFF4  //0x52中的2表示敲击次数
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x43, 0x51);//CLICK_COEFF4  //0x52中的2表示敲击次数
      SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7F, 0x00);//goto 0x00
      SL_SC7A22H_Delay_Ms(1);   
//8,低功耗模式使能  400Hz输出   
@@ -205,28 +206,33 @@
//等待中断触发
   double_click_flag=0;
    while(1)
while(1)
{
    if(double_click_flag)
    {
         if(double_click_flag)
         {
             double_click_flag=0;
         SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x39, 1, &CLICK_status);
         }
        unsigned char CLICK_status;
        double_click_flag=0;
        SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x39, 1, &CLICK_status);
        click_count++;
        click_count++;
        click_count++;
    }
}
}
//用户需自定义中断服务函数,当运动检测事件触发时INT1会从高电平变为低电平,用户可以IO捕捉下降沿产生中断
//在其中断服务中调用改函数
unsigned char Click_count;
void double_click_interrupt_callback()
{
  double_click_flag=1;
{ delay_ms(100);
  SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x39, 1, &Click_count);
  LOG_INFO(TRACE_MODULE_APP,"触发振动:振动次数%d. \r\n",Click_count);
  test_gravity_reading();
}
/***************计步检测示例*********/
@@ -424,5 +430,64 @@
}
uint16_t val[8] = {0};
void SC7A22H_Dump_Config(void)
{
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x40,1,&val[0]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x41,1,&val[1]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x3F,1,&val[2]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x06,1,&val[3]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x08,1,&val[4]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x30,1,&val[5]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x32,1,&val[6]);
    SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,0x33,1,&val[7]);
}
//运动检测
void SC7A22H_Motion_Detection_Init()
{
    unsigned char reg_value = 0;
    // 1. 初始化通信接口
//    SL_SC7A22H_I2c_Spi_Init(SL_SC7A22H_SPI_IIC_MODE);
    // 2. 复位芯片
    SL_SC7A22H_Soft_Reset();
    // 3. 检查芯片
    SL_SC7A22H_Check();
    // 4. 加速度计使能
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, 0x04); // PWR_CTRL ENABLE ACC
    SL_SC7A22H_Delay_Ms(100);
    // 5. 应用给定的寄存器配置
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0x07); // ACC_CONF
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x00); // ACC_RANGE ±2g  量程
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x3F, 0x10); // HPIS1=1
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x06, 0x0B); // AOI中断on INT1
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x08, 0xC0); // 高通滤波
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x30, 0x2A); // XYZ轴高事件或检测
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x32, 0x40); // 检测阈值 (64*16mg=80mg)
    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x33, 0x01); // 持续时间
//    SC7A22H_Dump_Config();
//// 6. 锁存中断
//SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x3F, 0x11); // HPIS1=1 LIR_AOI1
}
void Motion_Detection_callback()
{
  uint8_t int_src = 0;
  SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x31, 1, &int_src);
  test_gravity_reading();
}