#include "SC7A22H.h"
|
#include "mk_trace.h"
|
/***************Èí¸´Î»**********************/
|
void SL_SC7A22H_Soft_Reset(void)
|
{
|
SL_SC7A22H_I2c_Spi_Write(SL_SC7A22H_SPI_IIC_MODE,SL_SC7A22H_SOFT_RST, SL_SC7A22H_RESET_VALUE);
|
}
|
|
|
unsigned char SL_SC7A22H_Check(void)
|
{
|
SL_SC7A22H_I2c_Spi_Init(SL_SC7A22H_SPI_IIC_MODE);
|
unsigned char reg_value1=0;
|
unsigned char reg_value2=0;
|
SL_SC7A22H_I2c_Spi_Write(SL_SC7A22H_SPI_IIC_MODE, 0x7f, 0x00);
|
delay_us(100);
|
SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE, SC7A22H_CHIP_ID_ADDRESS, 1, ®_value1);
|
if(reg_value1==0x18)
|
{
|
SC7A22H_get_Pedo();
|
}
|
|
#if SL_Sensor_Algo_Release_Enable==0x01
|
|
// printf("SC7A22_WHO_AM_I:0x%x\r\n",reg_value1);
|
LOG_INFO(TRACE_MODULE_APP,"SC7A22_WHO_AM_I:0x%x\r\n",reg_value1);
|
// printf( "SC7A22_VERSION:0x%x\r\n",reg_value2);
|
#endif
|
if((reg_value1==0x18)&&(reg_value2==0x22))
|
return 0x01;//SC7A22H
|
else
|
return 0x00;//ÆäËûоƬ
|
}
|
|
//¶Áȡʱ¼ä´Á
|
//È¡20HzµÄÊý¾Ý£¬Ï൱ÓÚÊÇ´ÓFIFOÖгéȡһ×éÊý¾Ý
|
unsigned int SL_SC7A22H_TimeStamp_Read(void)
|
{
|
unsigned char time_data[3];
|
unsigned int time_stamp;
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x18, 1, &time_data[0]);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x19, 1, &time_data[1]);
|
SL_SC7A22H_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;
|
}
|
|
|
unsigned char SL_SC7A22H_POWER_DOWN(void)
|
{
|
unsigned char SL_Read_Reg = 0xff;
|
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, 0x00);//POWER DOWN
|
// SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x7D, SL_Read_Reg);
|
if(SL_Read_Reg==0x00) return 1;
|
else return 0;
|
}
|
|
|
//»ñÈ¡¼ÓËÙ¶ÈÔʼÊý¾Ý
|
void SL_SC7A22H_RawData_Read(signed short *x_data,signed short *y_data,signed short *z_data)
|
{
|
unsigned char raw_data[6];
|
unsigned char drdy_satus;
|
unsigned short drdy_cnt=0;
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x0B, 1, &drdy_satus);
|
while((drdy_satus&0x03)!=0x03);
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x0C, 6, &raw_data[0]);
|
|
*x_data =(signed short)((((unsigned char)raw_data[0])* 256) + ((unsigned char)raw_data[1]));//16λ
|
*y_data =(signed short)((((unsigned char)raw_data[2])* 256) + ((unsigned char)raw_data[3]));//16λ
|
*z_data =(signed short)((((unsigned char)raw_data[4])* 256) + ((unsigned char)raw_data[5]));//16λ
|
#if SL_Sensor_Algo_Release_Enable==0x01
|
printf("SC7A22H_rawdata_16bit:x:%d y:%d z:%d\r\n",*x_data,*y_data,*z_data);
|
#endif
|
|
}
|
|
|
|
|
unsigned char SL_SC7A22H_FIFO_DATA[512];
|
//È¡20HzµÄÊý¾Ý£¬Ï൱ÓÚÊÇ´ÓFIFOÖгéȡһ×éÊý¾Ý
|
unsigned char SL_SC7A22H_FIFO_Read(signed short *x_data_buf,signed short *y_data_buf,signed short *z_data_buf)
|
{
|
unsigned char fifo_num1=0;
|
unsigned char fifo_num2=0;
|
unsigned short fifo_num=0;
|
unsigned short fifo_len=0;
|
unsigned short j;
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x1F,1,&fifo_num1);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x20,1,&fifo_num2);
|
|
if((fifo_num1&0x10)==0x10)
|
{
|
fifo_num=256;
|
}
|
else
|
{
|
fifo_num=(fifo_num1&0x01)*256+fifo_num2;
|
}
|
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x21, fifo_num*2,SL_SC7A22H_FIFO_DATA);//µ¥µØÖ·Á¬Ðø¶ÁÈ¡
|
|
#if SL_Sensor_Algo_Release_Enable==1
|
printf("0x1F:0x%x 0x20:0x%x\n",fifo_num1,fifo_num2);
|
printf("SC7A22H_FIFO_NUM1:%d\n",fifo_num);
|
printf("SC7A22H_FIFO_NUM2:%d\n",(fifo_num-2)/3);//I2C=4 SPI=2
|
#endif
|
|
for(j=0;j<(fifo_num-2)/3;j++)
|
{
|
//0-3=sensor timestamp
|
x_data_buf[j] =(signed short)(((unsigned char)SL_SC7A22H_FIFO_DATA[4+j*6] * 256 ) + (unsigned char)SL_SC7A22H_FIFO_DATA[5+j*6]);//16λ
|
y_data_buf[j] =(signed short)(((unsigned char)SL_SC7A22H_FIFO_DATA[6+j*6] * 256 ) + (unsigned char)SL_SC7A22H_FIFO_DATA[7+j*6]);//16λ
|
z_data_buf[j] =(signed short)(((unsigned char)SL_SC7A22H_FIFO_DATA[8+j*6] * 256 ) + (unsigned char)SL_SC7A22H_FIFO_DATA[9+j*6]);//16λ
|
// x_data_buf[j] =x_data_buf[0][j]/16;//12λ
|
// y_data_buf[j] =y_data_buf[0][j]/16;//12λ
|
// z_data_buf[j] =z_data_buf[0][j]/16;//12λ
|
#if SL_Sensor_Algo_Release_Enable==0x01
|
// printf("SC7A22H_rawdata_16bit:len:%d x:%d y:%d z:%d\r\n",j,x_data_buf[j],y_data_buf[j],z_data_buf[j]);
|
#endif
|
}
|
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x00);//BY PASS MODE
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE, 0x1D, 0x10);//FIFO MODE
|
|
return fifo_len;
|
}
|
|
|
|
|
/***************¼ÓËٶȼÆÊý¾Ý¶ÁÈ¡*1byte*********/
|
void SL_SC7A22H_Read_XYZ_Data(signed short *SL_SC7A22H_Data_XYZ_Buf)
|
{
|
unsigned char SL_Read_Buf[7];
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,SL_SC7A22H_DATA_STAT,1, &SL_Read_Buf[0]);
|
//
|
if((SL_Read_Buf[0]&0x0f)==0x0f)
|
{
|
SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,SL_SC7A22H_DATA_OUT,6, &SL_Read_Buf[1]);
|
|
SL_SC7A22H_Data_XYZ_Buf[0]=(signed short)(SL_Read_Buf[6] << 8);//X BLE=0
|
SL_SC7A22H_Data_XYZ_Buf[1]=(signed short)(SL_Read_Buf[2] << 8);//Y
|
SL_SC7A22H_Data_XYZ_Buf[2]=(signed short)(SL_Read_Buf[4] << 8);//Z
|
}
|
|
}
|
|
/***************¼ÓËٶȼÆÊý¾Ý¶Áȡһ×éFIFOÊý¾Ý*********/
|
void SL_SC7A22H_Read_XYZ_Data_FIFO(signed short *SL_SC7A22H_Data_XYZ_Buf)
|
{
|
unsigned char SL_Read_Buf[3];
|
|
SL_SC7A22H_I2c_Spi_Read(SL_SC7A22H_SPI_IIC_MODE,SL_SC7A22H_FIFO_DATA1,3, &SL_Read_Buf[0]);
|
|
SL_SC7A22H_Data_XYZ_Buf[0]=(signed short)(SL_Read_Buf[2] << 8);//x
|
SL_SC7A22H_Data_XYZ_Buf[1]=(signed short)(SL_Read_Buf[0] << 8);//y
|
SL_SC7A22H_Data_XYZ_Buf[2]=(signed short)(SL_Read_Buf[1] << 8);//z
|
}
|
|
/***************¼ÓËÙ¶ÈÊý¾Ýת»»*********/
|
void SL_SC7A22H_Data_Convert(signed short *SL_SC7A22H_Raw_Data_XYZ_Buf,signed short *SL_SC7A22H_Output_Data_XYZ_Buf,unsigned char SC7A22H_FS_Reg)
|
{
|
unsigned char ratio =0 ;
|
|
switch (SC7A22H_FS_Reg)
|
{
|
case SL_SC7A22H_FS_2G:
|
ratio=1;
|
break;
|
case SL_SC7A22H_FS_4G:
|
ratio=2;
|
break;
|
case SL_SC7A22H_FS_8G:
|
ratio=4;
|
break;
|
case SL_SC7A22H_FS_16G:
|
ratio=8;
|
break;
|
default:
|
ratio=1;
|
break;
|
}
|
|
SL_SC7A22H_Output_Data_XYZ_Buf[0]= (SL_SC7A22H_Raw_Data_XYZ_Buf[0] >> 4) * ratio;
|
SL_SC7A22H_Output_Data_XYZ_Buf[1]= (SL_SC7A22H_Raw_Data_XYZ_Buf[1] >> 4) * ratio;
|
SL_SC7A22H_Output_Data_XYZ_Buf[2]= (SL_SC7A22H_Raw_Data_XYZ_Buf[2] >> 4) * ratio;
|
printf("%d,%d,%d\r\n",SL_SC7A22H_Output_Data_XYZ_Buf[0], SL_SC7A22H_Output_Data_XYZ_Buf[1], SL_SC7A22H_Output_Data_XYZ_Buf[2]);
|
|
}
|
|
|
static unsigned int SL_Step_Value_Temp=0;
|
//0:¾²Ö¹ 1:Âý×ß 2:¿ì×ß 3:Åܲ½
|
unsigned char SL_SC7A22H_Get_Motion(void)
|
{
|
unsigned char sl_motion;
|
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x90);
|
SL_SC7A22H_Delay_Ms(1);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE, 0x3B, 1, &sl_motion);
|
// printf("SC7A22H_sl_motion:%d\r\n",sl_motion);
|
sl_motion=(sl_motion&0x30)>>4;
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);
|
SL_SC7A22H_Delay_Ms(1);
|
|
return sl_motion;
|
}
|
|
void SL_SC7A22H_Pedo_Reset(void)
|
{
|
unsigned char SL_Reg;
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x90);
|
SL_SC7A22H_Delay_Ms(1);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE,0x3A,1, &SL_Reg);
|
SL_Reg=(SL_Reg&0x08)|0x05;
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x3A, SL_Reg);
|
SL_Step_Value_Temp=0;
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);
|
SL_SC7A22H_Delay_Ms(1);
|
}
|
|
|
//recommend IN TIMER <10s
|
unsigned int SL_SC7A22H_Get_Pedo_Count(void)
|
{
|
unsigned char SL_Step_Reg[2];
|
unsigned short SL_Step_Value;
|
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x90);
|
SL_SC7A22H_Delay_Ms(1);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE,0x3C,2, &SL_Step_Reg[0]);
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);
|
SL_SC7A22H_Delay_Ms(1);
|
SL_Step_Value=(unsigned short)((SL_Step_Reg[1]<<8)|(SL_Step_Reg[0]));
|
|
return SL_Step_Value;
|
}
|
|
|
// 0: ûÓз¢ÉúÈκÎ̧ÊÖ״̬
|
// 1: ÒѾ·¢ÉúÁȨ̈ÊÖ¶¯×÷
|
// 2: ÒѾ·¢ÉúÁË·Å϶¯×÷
|
unsigned char SL_SC7A22H_Get_Wrist_Status(void)
|
{
|
unsigned char sl_wrist_status;
|
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x90);
|
SL_SC7A22H_Delay_Ms(1);
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE,0x3E,1, &sl_wrist_status);
|
#if SL_Sensor_Algo_Release_Enable==0x01
|
printf("SC7A22H_WRIST_STATUS:0x%x\r\n",sl_wrist_status);
|
#endif
|
#if SL_SC7A22H_WRIST_INT_MODE==0x00 //ÉÏÉýÑØ±íʾ·ÅÏ£¬Ï½µÑرíʾ̧ÊÖ
|
if((sl_wrist_status&0x02)==0x02)
|
{
|
printf("ÒѾ·¢ÉúÁȨ̈ÊÖ¶¯×÷\r\n");
|
return 1;
|
|
}
|
else if((sl_wrist_status&0x04)==0x04)
|
{
|
printf("ÒѾ·¢ÉúÁË·Å϶¯×÷\r\n");
|
return 2;
|
}
|
else
|
{
|
return 0;//Òì³£Çé¿ö
|
}
|
#else //ϽµÑرíʾ̧ÊÖ»ò·ÅÏ£¬ÐèÒª²»¶ÏÇл»Öжϴ¥·¢Ô´,ͨ¹ý²éѯȷ¶¨ÖжÏ
|
if((sl_wrist_status&0x02)==0x02)
|
{
|
#if SC7A22H_INT2_WRIST_ON_DOWN==0x01
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);//À´»ØÇл»Ê¹ÓÃ
|
sl_delay(1);//À´»ØÇл»Ê¹ÓÃ
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x07, 0x14);//À´»ØÇл»Ê¹ÓÃ
|
#endif
|
return 1;
|
}
|
else if((sl_wrist_status&0x04)==0x04)
|
{
|
#if SC7A22H_INT2_WRIST_ON_DOWN==0x01
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);//À´»ØÇл»Ê¹ÓÃ
|
sl_delay(1);//À´»ØÇл»Ê¹ÓÃ
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x07, 0x13);//À´»ØÇл»Ê¹ÓÃ
|
#endif
|
return 2;
|
}
|
else
|
{
|
#if SC7A22H_INT2_WRIST_ON_DOWN==0x01
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x90);//À´»ØÇл»Ê¹ÓÃ
|
sl_delay(1);//À´»ØÇл»Ê¹ÓÃ
|
SL_SC7A22H_I2c_Spi_Read(SL_SPI_IIC_INTERFACE,0x3E,1, &sl_wrist_status);//¶Áȡһ´Î
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x07, 0x14);//À´»ØÇл»Ê¹ÓÃ
|
SL_SC7A22H_I2c_Spi_Write(SL_SPI_IIC_INTERFACE,0x7F, 0x00);
|
sl_delay(1);
|
#endif
|
return 0;//Òì³£Çé¿ö
|
}
|
#endif
|
return sl_wrist_status;
|
}
|