国产士兰微六轴陀螺仪SC7I22介绍和应用

      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, &reg_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

样品和其他技术问题可留言。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值