#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; }