zhangbo
21 小时以前 01b6f2525f47ee781d86a2495dfcd17f68ccbafd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#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, &reg_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;
}