SC7I22 是一款高集成度、低功耗惯性测量单元(
IMU
)。内置高性能三轴加速度计和三轴陀螺仪测量单元,在高性能模式、SC7I22
集成的节能模式能将功耗控制在 970uA
以下(
ODR 1.6KHz
工作模式)。
加速度计量程范围±
2g/
±
4g/
±
8g/
±
16g
,陀螺仪角速度量程
±125/±250/±500/±1000/±2000dps。包含自测功能和修调功能。
SC7I22
的封装为 LGA-14L
,正常工作温度范围为
-40°C ~ +85 °C
。内置的事件中断功能可在系统功耗极低的条件下有效可靠得实现运动跟踪和姿态识别,包括自由落体检测、6D
方向检测、计步、敲击检测和唤醒等功能。
SC7I22
可以提的运动检测,实现姿态定位和手势识别等,帮助应用开发者开发更加复杂的功能,将大量应用于智能手机、无人机、游戏手柄、各类物联网和智能硬件系统中。支持主流操作系统,实现微信记录和动作截屏,且提供无人机、游戏手柄、VR
和
AR
的各类算法支持。芯片内置自测试功能允许客户系统测试时检测系统功能,省去复杂的转台测试。芯片内置产品倾斜校准功能,对贴片和板卡安装导致的倾斜进行补偿,不占系统资源,系统文件升级不影响传感器参数。
主要特点
模拟供电电压范围
1.71~ 3.6V
;
低功耗:整体联合低功耗模式
450uA
;整体联合高性能模式
970uA
;
加速度计:
±
2/
±
4/
±
8/
±
16G
满量程;
陀螺仪:
±
125/
±
250/
±
500/
±
1000/
±
2000dps
满量程;
紧凑型标准
LGA14
的封装,
2.5mm*3mm*1.00mm
;
提供
SPI
和
IIC
串行接口;
内嵌温度传感器;
Sensor Time
功能
6D/4D
方向检测
OIS
(
ODR=6.4kHz
)功能
内嵌自测试功能
内嵌
FIFO
10000g
高
G
抗击能力
LGA14-2.5x3x1.00mm
3
应用
AR/VR
;
室内导航
/
行人路线跟踪
/
定位
3D
扫描
/
室内地图测绘
/SLAM
手势识别
虚拟现实游戏
空鼠
/
游戏手柄
计步
/
敲击
振动检测和补偿;
自由落体检测;
9D
方向检测;
IOT
应用
以下为驱动例程:
#include "SL_SC7I22_Driver.h"
#include "I2C.h"
#include "usart.h"
#if SL_Sensor_Algo_Release_Enable==0x00
#include "usart.h"
#endif
//I2C SPI选择
#define SL_SC7I22_SPI_EN_I2C_DISABLE 0x00 //SL_SPI_IIC_INTERFACE ;
#define SL_SPI_IIC_INTERFACE 0x01 //SL_SC7I22_SPI_EN_I2C_DISABLE ;
//
#define SL_SC7I22_RAWDATA_HPF_ENABLE 0x00
//
#define SL_SC7I22_INT_DEFAULT_LEVEL 0x01
//SDO
#define SL_SC7I22_SDO_PullUP_ENABLE 0x01
//FIFO使能
#define SL_SC7I22_FIFO_ENABLE 0x00
//FIFO_STREAM使能
#define SL_SC7I22_FIFO_STREAM 0x00
//FIFO_WTM使能
#define SL_SC7I22_FIFO_WTM 0x00
int sensor_status=0;
static void sl_delay(unsigned char sl_i)
{
unsigned int sl_j = 10;
sl_j = sl_j*1000*sl_i;
while(sl_j--);
}
unsigned char SL_SC7I22_Check(void)
{
unsigned char reg_value=0;
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7F, 0x00);//goto 0x00
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, SC7I22_WHO_AM_I, 1, ®_value);
#if SL_Sensor_Algo_Release_Enable==0x00
USART_printf( USART1, "0x%x=0x%x\r\n",SC7I22_WHO_AM_I,reg_value);
#endif
if(reg_value==0x6A)
return 0x01;//SC7I22
else
return 0x00;//IIC??
}
unsigned char SL_SC7I22_Config(void)
{
unsigned char Check_Flag=0;
unsigned char reg_value=0;
unsigned short drdy_cnt=0;
Check_Flag=SL_SC7I22_Check();
// Check_Flag=1;//?????
if(Check_Flag==1)
{
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, 0x0E);//goto 0x00
sl_delay(10);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x40, 0x88);//ACC_CONF 100Hz
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x41, 0x01);//ACC_RANGE ?G
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x42, 0xC8);//GYR_CONF 100Hz
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x43, 0x00);//GYR_RANGE 2000dps
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x05, 0x50);//I2C_CFG
#if SL_SC7I22_FIFO_ENABLE==0x01
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x05, 0x40);//I2C_CFG
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x06, 0x09);//FIFO_WTM:INT1
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1C, 0x00);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1C, 0x06);//FIFO_EN
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x00);
Check_Flag=0;
while((Check_Flag&0x03)!=0x03)
{
i2cRead(0x19,0x0B,1,&Check_Flag);
drdy_cnt++;
if(drdy_cnt>10000) break;
sl_delay(1);
}
#if SL_SC7I22_FIFO_STREAM==0x01
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x20);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1E, 0xFF);
sensor_status=0;
#endif
#if SL_SC7I22_FIFO_WTM==0x01
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1C, 0x06);//FIFO_EN
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x10);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1E, 0x2F);//FIFO-NUM
#endif
#endif
return 1;
}
else
return 0;
}
unsigned int SL_SC7I22_TimeStamp_Read(void)
{
unsigned char time_data[3];
unsigned int time_stamp;
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x18, 1, &time_data[0]);
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x19, 1, &time_data[1]);
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x20, 1, &time_data[2]);
time_stamp=(unsigned int)(time_data[0]<<16|time_data[1]<<8|time_data[2]);
return time_stamp;
}
#if SL_SC7I22_FIFO_ENABLE ==0x00
void SL_SC7I22_RawData_Read(signed short * acc_data_buf,signed short * gyr_data_buf)
{
unsigned char raw_data[12];
unsigned char drdy_satus;
unsigned short drdy_cnt=0;
while((drdy_satus&0x03)!=0x03)
{
drdy_satus=0x00;
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x0B, 1, &drdy_satus);
drdy_cnt++;
if(drdy_cnt>10000) break;
sl_delay(1);
}
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x0C, 12, &raw_data[0]);
acc_data_buf[0] =(signed short)((((unsigned char)raw_data[0])* 256) + ((unsigned char)raw_data[1]));//ACCX-16?
acc_data_buf[1] =(signed short)((((unsigned char)raw_data[2])* 256) + ((unsigned char)raw_data[3]));//ACCY-16?
acc_data_buf[2] =(signed short)((((unsigned char)raw_data[4])* 256) + ((unsigned char)raw_data[5]));//ACCZ-16?
gyr_data_buf[0] =(signed short)((((unsigned char)raw_data[6])* 256) + ((unsigned char)raw_data[7]));//GYRX-16?
gyr_data_buf[1] =(signed short)((((unsigned char)raw_data[8])* 256) + ((unsigned char)raw_data[9]));//GYRY-16?
gyr_data_buf[2] =(signed short)((((unsigned char)raw_data[10])* 256) + ((unsigned char)raw_data[11]));//GYRZ-16?
}
#else
#if SL_Sensor_Algo_Release_Enable==0x00
#define SL_SC7I22_WAIT_FIFO_LEN_ENABLE 0x01
#else
#define SL_SC7I22_WAIT_FIFO_LEN_ENABLE 0x00
#endif
unsigned char SL_SC7I22_FIFO_DATA[2048];
unsigned short SC7I22_FIFO_Read(signed short *accx_buf,signed short *accy_buf,signed short *accz_buf,signed short *gyrx_buf,signed short *gyry_buf,signed short *gyrz_buf)
{
unsigned char fifo_num1=0;
unsigned char fifo_num2=0;
unsigned short fifo_num=0;
signed short AX, AY ,AZ,GX,GY,GZ;
unsigned short fifo_len=0;
unsigned short j;
fifo_num1=0;
fifo_num2=0;
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x1F,1,&fifo_num1);
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x20,1,&fifo_num2);
fifo_num=(fifo_num1&0x0F)*256+fifo_num2;
SL_SC7I22_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x21, fifo_num*2, SL_SC7I22_FIFO_DATA);
#if SL_Sensor_Algo_Release_Enable==0
USART_printf(USART1,"0x1F:0x%x 0x20:0x%x\n",fifo_num1,fifo_num2);
USART_printf(USART1,"SC7I22_FIFO_NUM1:%d\n",fifo_num);
USART_printf(USART1,"SC7I22_FIFO_NUM2:%d\n",(fifo_num-2)/3);//I2C=4 SPI=2
#endif
for(j=0;j<(fifo_num-2)/6;j++)
{
//0-3=sensor timestamp
gyrx_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+4] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+5]);
gyry_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+6] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+7]);
gyrz_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+8] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+9]);
accx_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+10] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+11]);
accy_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+12] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+13]);
accz_buf[j] =(signed short)(((unsigned char)SL_SC7I22_FIFO_DATA[j*12+14] * 256 ) + (unsigned char)SL_SC7I22_FIFO_DATA[j*12+15]);
}
fifo_num=(fifo_num-2)/6;
#if SL_SC7I22_FIFO_STREAM==0x01
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x00);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x20);
#endif
#if SL_SC7I22_FIFO_WTM==0x01
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x00);
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x10);
#endif
return fifo_num;
}
#endif
unsigned char SL_SC7I22_POWER_DOWN(void)
{
unsigned char SL_Read_Reg = 0xff;
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, 0x00);//POWER DOWN
SL_SC7I22_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, SL_Read_Reg);
if(SL_Read_Reg==0x00) return 1;
else return 0;
}
/*
Copyright (c) 2023 Silan MEMS. All Rights Reserved.
*/
#ifndef __SL_SC7I22_DRIVER_H__
#define __SL_SC7I22_DRIVER_H__
/********添加IIC头文件******************/
//#include "i2c.h"
/***************************************/
//传感器调试打印功能是否打开
#define SL_Sensor_Algo_Release_Enable 0x01
//是否打开FIFO工作模式,默认STREAM模式
#define SL_SC7I22_FIFO_MODE_ENABLE 0x00
/***使用驱动前请根据实际接线情况配置******/
/**SC7I22的SDO 脚接地: 0****************/
/**SC7I22的SDO 脚接电源:1****************/
#define SL_SC7I22_SDO_VDD_GND 1
/*****************************************/
/***使用驱动前请根据实际IIC情况进行配置***/
/**SC7I22的IIC 接口地址类型 7bits: 0****/
/**SC7I22的IIC 接口地址类型 8bits: 1****/
#define SL_SC7I22_IIC_7BITS_8BITS 0
/*****************************************/
#if SL_SC7I22_SDO_VDD_GND==0
#define SL_SC7I22_IIC_7BITS_ADDR 0x18
#define SL_SC7I22_IIC_8BITS_WRITE_ADDR 0x30
#define SL_SC7I22_IIC_8BITS_READ_ADDR 0x31
#else
#define SL_SC7I22_IIC_7BITS_ADDR 0x19
#define SL_SC7I22_IIC_8BITS_WRITE_ADDR 0x32
#define SL_SC7I22_IIC_8BITS_READ_ADDR 0x33
#endif
#if SL_SC7I22_IIC_7BITS_8BITS==0
#define SL_SC7I22_IIC_ADDRESS SL_SC7I22_IIC_7BITS_ADDR
#else
#define SL_SC7I22_IIC_WRITE_ADDRESS SL_SC7I22_IIC_8BITS_WRITE_ADDR
#define SL_SC7I22_IIC_READ_ADDRESS SL_SC7I22_IIC_8BITS_READ_ADDR
#endif
/********客户需要定义IIC/SPI接口封包函数****************/
extern unsigned char SL_SC7I22_I2c_Spi_Write(unsigned char sl_spi_iic, unsigned char reg, unsigned char dat);
extern unsigned char SL_SC7I22_I2c_Spi_Read(unsigned char sl_spi_iic, unsigned char reg, unsigned short len, unsigned char* buf);
/**SL_SC7I22_I2c_Spi_Write 函数中, sl_spi_iic:0=spi 1=i2c Reg:寄存器地址 dat:寄存器的配置值******************/
/**SL_SC7I22_I2c_Spi_Write 函数 是一个单次写的函数******************************************************************/
/***SL_SC7I22_I2c_Spi_Read 函数中, sl_spi_iic:0=spi 1=i2c Reg 同上,len:读取数据长度,buf:存储数据首地址(指针)***/
/***SL_SC7I22_I2c_Spi_Read 函数 是可以进行单次读或多次连续读取的函数************************************************/
/*************I2C通讯检查函数******************/
unsigned char SL_SC7I22_Check(void);
/*************返回数据情况如下*****************/
/**return : 1 IIC通讯正常IC在线**************/
/**return : 0 IIC通讯异常或IC不在线**********/
/*************驱动初始化函数*******************/
unsigned char SL_SC7I22_Config(void);
/*************返回数据情况如下*****************/
/**return : 1 IIC通讯正常IC在线*************/
/**return : 0; IIC通讯异常或IC不在线*********/
/*************SC7I22 Sensor Time**************/
unsigned int SL_SC7I22_TimeStamp_Read(void);
/*************返回数据情况如下*****************/
/**return : Internal Sensor Time***************/
#if SL_SC7I22_FIFO_MODE_ENABLE ==0x00
/******定时读取数据寄存器的数据,相当于是从400Hz的FIFO数据中抽取数据******/
void SL_SC7I22_RawData_Read(signed short* acc_data_buf, signed short* gyr_data_buf);
/************* 输入XYZ三轴数据变量的地址*****************/
/************* *acc_data_buf: ACC轴数据***********************/
/************* *gyr_data_buf: GYR轴数据***********************/
#else
/******定时读取数据寄存器的FIFO数据******/
unsigned short SC7I22_FIFO_Read(signed short* accx_buf, signed short* accy_buf, signed short* accz_buf, signed short* gyrx_buf, signed short* gyry_buf, signed short* gyrz_buf);
/*************输入XYZ三轴数组首地址**************************/
/*************accx_buf[0]: X轴第一个数据****************/
/*************accy_buf[0]: Y轴第一个数据****************/
/*************accz_buf[0]: Z轴第一个数据****************/
/*************gyrx_buf[0]: X轴第一个数据****************/
/*************gyry_buf[0]: Y轴第一个数据****************/
/*************gyrz_buf[0]: Z轴第一个数据****************/
/****************返回数据情况如下****************************/
/**return : len 表示数组长度*************************/
#endif
/*********进入传感器关闭模式*************/
unsigned char SL_SC7I22_POWER_DOWN(void);
/**0: 进入模式失败***********************/
/**1: 进入模式成功***********************/
/**reg map***************/
#define SC7I22_WHO_AM_I 0x01
#endif // SC7I22
样品和其他技术问题可留言。