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 |  147 +++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 125 insertions(+), 22 deletions(-)

diff --git a/keil/include/drivers/SC7A22H_example.c b/keil/include/drivers/SC7A22H_example.c
index be59a54..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"
 
 
 //轮询获取三轴数据示例
@@ -111,8 +111,43 @@
 }
 
 
+float g_x, g_y, g_z;
+void test_gravity_reading() 
+{
+    
+//    SL_SC7A22H_I2c_Spi_Init(SL_SC7A22H_SPI_IIC_MODE);
+//    SL_SC7A22H_Soft_Reset();
+//    SL_SC7A22H_Check();
+    
+//    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, 0x04);  // 使能加速度计
+//    SL_SC7A22H_Delay_Ms(50);
+//    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x00);  // ±2g量程
+//    SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0x0A);  // 400Hz输出速率
 
+    //转换数据
+    signed short x_raw, y_raw, z_raw;
+    const float sensitivity = 16384;
+//16位数据 1g值         量程  2G     4G     8G     16G
+
+//16384    1g值               1g     2g     4g     8g    
+
+    
+    while(1) 
+    {
+        SL_SC7A22H_RawData_Read(&x_raw, &y_raw, &z_raw);
+        
+        // 转换为重力加速度值(g)
+        g_x = (float)x_raw/sensitivity;
+        g_y = (float)y_raw/sensitivity;
+        g_z = (float)z_raw/sensitivity;
+      
+        SL_SC7A22H_Delay_Ms(250);  // 250ms采样间隔
+    }
+}
 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()
 {
@@ -132,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
 	
@@ -161,7 +196,7 @@
 		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输出	
@@ -171,27 +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);
-			   printf("SC7A22H_INT1_SRC:%x\r\n",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();
 }
-
 
 
 /***************计步检测示例*********/
@@ -365,14 +406,14 @@
 //低功耗模式使能, 低功耗模式:1个数据平均一次,50Hz输出	
   
 //全量程选择:±8G		
-		SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x02);//ACC_RANGE  ±8G
+	SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x02);//ACC_RANGE  ±8G
     SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x6D, 1, &reg_value);
-		delay_ms(60);  
+	delay_ms(60);  
 				
-		SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0xac);//ACC_CONF 0x07=50Hz				
+	SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0xac);//ACC_CONF 0x07=50Hz				
 	delay_ms(60); 
 //地址自增,连续读写时地址自增,连续更新
-		SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x05, 0x10);//I2C_CFG
+	SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x05, 0x10);//I2C_CFG
     delay_ms(60); 
 //		SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, 0x6D, 1, &reg_value);
 //自测试模式使能---正方向,	偏转低振幅			
@@ -388,3 +429,65 @@
     }
 }
 
+
+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