| | |
| | | #include "SC7A22H.h" |
| | | #include "mk_trace.h" |
| | | |
| | | #include "WS2812.h" |
| | | |
| | | |
| | | //轮询获取三轴数据示例 |
| | |
| | | } |
| | | |
| | | |
| | | 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() |
| | | { |
| | |
| | | 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 |
| | | |
| | |
| | | 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输出 |
| | |
| | | |
| | | //等待中断触发 |
| | | 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(); |
| | | } |
| | | |
| | | |
| | | |
| | | /***************计步检测示例*********/ |
| | |
| | | //低功耗模式使能, 低功耗模式: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, ®_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, ®_value); |
| | | //自测试模式使能---正方向, 偏转低振幅 |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | 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(); |
| | | } |
| | | |
| | | |
| | | |