From cbc3ed1b6ead25a22d1efd51401e73d7e93e2b4d Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期三, 16 七月 2025 18:10:42 +0800 Subject: [PATCH] 1g加速度测试通过 --- keil/include/drivers/SC7A22H_example.c | 103 ++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 84 insertions(+), 19 deletions(-) diff --git a/keil/include/drivers/SC7A22H_example.c b/keil/include/drivers/SC7A22H_example.c index 884052e..cd8a15c 100644 --- a/keil/include/drivers/SC7A22H_example.c +++ b/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(); +} + -- Gitblit v1.9.3