You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1177 lines
30 KiB
1177 lines
30 KiB
#include "MAX30102.h"
|
|
#include "debug_drv.h"
|
|
|
|
#define D_task_m32_01 0x20
|
|
#define D_task_m32_HR 0x31
|
|
#define D_task_m32_SPO 0x32
|
|
#define D_task_m32_sample 0x34
|
|
#define D_task_m32_cal 0x35
|
|
#define D_task_m32_out 0x25
|
|
#define D_task_m32_ask 0x24
|
|
|
|
#define D_task_m32_read 0x28
|
|
|
|
|
|
////>>>>>>>>>>>>>>>>>>>>>_s_task_m32_>>>>>>>>>>>>>>>>>>>>>>
|
|
TS_task_m32_ ts_task_m32;
|
|
TS_max30102_ ts_max30102;
|
|
|
|
|
|
/// ts_max30102.d[6];
|
|
uint8 Max30102_reset(void)
|
|
{
|
|
|
|
#if 0
|
|
if(L1_max30102_WB(REG_MODE_CONFIG, 0x40))
|
|
return 1;
|
|
else
|
|
return 0;
|
|
|
|
|
|
#else
|
|
L1_max30102_WB(REG_MODE_CONFIG, 0x40);
|
|
return 1;
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
/****
|
|
SPO2_ADC_RGE[1:0] LSB SIZE (pA) FULL SCALE (nA)
|
|
00 7.81 2048
|
|
01 15.63 4096
|
|
10 31.25 8192
|
|
11 62.5 16384
|
|
|
|
|
|
LED_PW[1:0] PULSE WIDTH (µs) ADC RESOLUTION (bits)
|
|
00 69 (68.95) 15
|
|
01 118 (117.78) 16
|
|
10 215 (215.44) 17
|
|
11 411 (410.75) 18
|
|
|
|
27
|
|
0010 0111
|
|
0 01 0 01 11
|
|
*********/
|
|
|
|
#define D_LED_PW_16BITS 0X01
|
|
#define D_LED_PW_18BITS 0X03
|
|
|
|
#define D_SPO2_SR_50pS (0X00<<2) ///SAMPLE RATE
|
|
#define D_SPO2_SR_100pS (0X01<<2) ///SAMPLE RATE
|
|
#define D_SPO2_SR_200pS (0X02<<2) ///SAMPLE RATE
|
|
#define D_SPO2_SR_400pS (0X03<<2) ///SAMPLE RATE
|
|
|
|
|
|
#define SPO2_ADC_RGE_2048 (0X00<<5)
|
|
#define SPO2_ADC_RGE_4096 (0X01<<5)
|
|
#define SPO2_ADC_RGE_8192 (0X02<<5)
|
|
/*********
|
|
REGISTER FIFO Configuration
|
|
B7 B6 B5 B4 B3 B2 B1 B0 REG ADDR POR STATE
|
|
SMP_AVE[2:0] FIFO_ROL LOVER_EN FIFO_A_FULL[3:0] 0x08 0x00 R/W
|
|
****/
|
|
|
|
void L0_MAX30102_mode(u8 mode)
|
|
{
|
|
if(D_m32_mode_SPO2 == mode)
|
|
{
|
|
|
|
/// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
|
|
L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0
|
|
////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断
|
|
|
|
L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_SPO2);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
|
|
////27
|
|
L1_max30102_WB(REG_SPO2_CONFIG,SPO2_ADC_RGE_8192|D_SPO2_SR_50pS|D_LED_PW_18BITS); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS)
|
|
|
|
/// L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS)
|
|
|
|
|
|
L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1
|
|
L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2
|
|
L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED
|
|
|
|
|
|
|
|
}else
|
|
{
|
|
/// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
|
|
L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0
|
|
////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断
|
|
|
|
L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_HR);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
|
|
|
|
L1_max30102_WB(REG_SPO2_CONFIG,SPO2_ADC_RGE_8192|D_SPO2_SR_400pS|D_LED_PW_18BITS); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS)
|
|
L1_max30102_WB(REG_LED1_PA,0x10);//Choose value for ~ 10mA for LED1
|
|
L1_max30102_WB(REG_LED2_PA,0x10);// Choose value for ~ 10mA for LED2
|
|
L1_max30102_WB(REG_PILOT_PA,0x01);// Choose value for ~ 25mA for Pilot LED
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void L1_MAX30102_Config(void)
|
|
{
|
|
L1_max30102_WB(REG_MODE_CONFIG, 0x40);///reset = 1;
|
|
Lc_delay_ms(30);
|
|
// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN
|
|
// L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
L1_max30102_WB(REG_INTR_ENABLE_1,0x80);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN
|
|
L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
|
|
|
|
L0_MAX30102_mode(D_m32_mode_HR);
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
|
|
|
|
}
|
|
#define D_max3_sp 3
|
|
#define D_max3_figer 868236L
|
|
#define D_max3_NoFiger 6000L
|
|
void L2_max30102_init(void)
|
|
{
|
|
|
|
L2_task_m32_register();
|
|
|
|
L0_IICMx_INIT(D_iicch_max13102,1);
|
|
ts_iicm.t0[D_iicch_max13102]= 0;///模拟iic的时候低电平和高电平的时间经常不确定
|
|
ts_iicm.t1[D_iicch_max13102]= 1;///使用iic前需要配置iic的速率 根据规格书的要求
|
|
|
|
ts_max30102.fifook = 0;
|
|
ts_max30102.havefigle = 0;
|
|
ts_max30102.datok = 0;
|
|
ts_max30102.sum = D_max3_figer << D_max3_sp;;
|
|
ts_max30102.sum2 = D_max3_figer << D_max3_sp;
|
|
|
|
|
|
}
|
|
void L3_max_spo2(void)
|
|
{
|
|
if(ts_max30102.i >= 64)
|
|
{//39数据为1周期
|
|
ts_max30102.i = 0;
|
|
ts_max30102.havefigle = 0;
|
|
//取得周期内最大最小数据
|
|
ts_max30102.ac=ts_max30102.IR_max-ts_max30102.IR_min; //单个周期内最大最小数据差为交流分量
|
|
ts_max30102.dc=ts_max30102.IR_min; //数据=直流分量+交流分量
|
|
ts_max30102.ac2=ts_max30102.RED_max-ts_max30102.RED_min;//同理
|
|
ts_max30102.dc2=ts_max30102.RED_min;
|
|
|
|
ts_max30102.ac_ir=(float)ts_max30102.ac;//注意转换,否则无法赋值
|
|
ts_max30102.dc_ir=(float)ts_max30102.dc;
|
|
ts_max30102.ac_red=(float)ts_max30102.ac2;
|
|
ts_max30102.dc_red=(float)ts_max30102.dc2;
|
|
ts_max30102.R2=(ts_max30102.ac_red* ts_max30102.dc_ir)/(ts_max30102.ac_ir*ts_max30102.dc_red);
|
|
ts_max30102.SPO2 =-45.060*ts_max30102.R2*ts_max30102.R2+ 30.354 *ts_max30102.R2 + 94.845;
|
|
ts_max30102.u16d =(U16)ts_max30102.SPO2;
|
|
ts_max30102.SPO2_out =(U8)ts_max30102.u16d;
|
|
/// printf(" SPO2 = %2.2f (%d) ",ts_max30102.SPO2,(int)ts_max30102.SPO2_out);
|
|
ts_max30102.SPO2_ok = 1;
|
|
///printf(" %lu--%lu ",ts_max30102.IR_min,ts_max30102.IR_max);
|
|
///printf(" %lu--%lu ",ts_max30102.RED_min,ts_max30102.RED_max);
|
|
ts_max30102.IR_max=ts_max30102.IR_out2;
|
|
ts_max30102.IR_min=ts_max30102.IR_out2;
|
|
ts_max30102.RED_max=ts_max30102.RED_out2;
|
|
ts_max30102.RED_min=ts_max30102.RED_out2;
|
|
}
|
|
}
|
|
|
|
///进行简单的分析
|
|
void L2_max30102_hh(void)
|
|
{
|
|
////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>shift average
|
|
ts_max30102.sum += ts_max30102.red;
|
|
ts_max30102.sum -= ts_max30102.RED_out2;
|
|
ts_max30102.RED_out2 = ts_max30102.sum >> D_max3_sp;
|
|
|
|
|
|
// 0 red,red_out2
|
|
/// 0 -red_out2 +red
|
|
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<shift average
|
|
ts_max30102.sum2 += ts_max30102.ir;
|
|
ts_max30102.sum2 -= ts_max30102.IR_out2;
|
|
ts_max30102.IR_out2 = ts_max30102.sum2 >> D_max3_sp;
|
|
|
|
/// printf(" H %lu %lu f%d ",ts_max30102.RED_out2,ts_max30102.IR_out2,(int)ts_max30102.havefigle);
|
|
if(0 == ts_max30102.havefigle)
|
|
{
|
|
if((ts_max30102.IR_out2 +ts_max30102.RED_out2) > D_max3_figer)
|
|
{
|
|
//// printf("\r\n have figle ");
|
|
ts_max30102.havefigle = 1;
|
|
ts_max30102.i=0;
|
|
ts_max30102.IR_max=ts_max30102.IR_out2;
|
|
ts_max30102.IR_min=ts_max30102.IR_out2;
|
|
ts_max30102.RED_max=ts_max30102.RED_out2;
|
|
ts_max30102.RED_min=ts_max30102.RED_out2;
|
|
}else
|
|
{
|
|
/// printf(" clear figle \r\n");///需要显示清零
|
|
ts_max30102.havefigle = 0;
|
|
ts_max30102.i = 0;
|
|
ts_max30102.hr_out = 1;
|
|
ts_max30102.hr_out2 = 0;
|
|
ts_max30102.hr_out2_temp = ts_max30102.hr_out2+1;
|
|
ts_max30102.hr_ok = 1;
|
|
ts_max30102.SPO2 = 0;
|
|
ts_max30102.SPO2_out = 0;
|
|
ts_max30102.SPO2_ok = 1;
|
|
ts_max30102.SPO2_out_temp = ts_max30102.SPO2_ok+ 1;
|
|
}
|
|
}else
|
|
{///have figle
|
|
ts_max30102.havefigle++;
|
|
if (ts_max30102.havefigle > 16)///过滤掉最开始的几个数据
|
|
{ts_max30102.havefigle = 16;
|
|
ts_max30102.cashe[2] = ts_max30102.cashe[1];
|
|
ts_max30102.cashe[1] = ts_max30102.cashe[0];
|
|
ts_max30102.cashe[0] = ts_max30102.RED_out2;
|
|
|
|
if((ts_max30102.cashe[1] >= ts_max30102.cashe[2])&&(ts_max30102.cashe[1] > ts_max30102.cashe[0]))
|
|
{///求波峰
|
|
ts_max30102.hr_s = ts_max30102.hr_i;
|
|
ts_max30102.hr_s *= 20L;///20ms 间隔的周期 200hz采样决定的
|
|
ts_max30102.hr = 60000L/ts_max30102.hr_s;
|
|
ts_max30102.u16d = (U16)ts_max30102.hr;
|
|
ts_max30102.hr_out = (U8)ts_max30102.u16d;
|
|
|
|
//// printf( "hr = %d ",(int)ts_max30102.hr_out);
|
|
|
|
|
|
if((ts_max30102.hr_out >= 100) ||(ts_max30102.hr_out <= 50)) //缓存套路
|
|
{
|
|
ts_max30102.hr_out = ts_max30102.hr_out2;
|
|
}else
|
|
{
|
|
ts_max30102.hr_out2 = ts_max30102.hr_out;
|
|
}
|
|
//// printf( "hr_out2 = %d ",(int)ts_max30102.hr_out2);
|
|
ts_max30102.hr_ok = 1;
|
|
ts_max30102.hr_i = 0;
|
|
}
|
|
else
|
|
{
|
|
ts_max30102.hr_i ++;
|
|
}
|
|
|
|
/// printf(" i=%lu ",ts_max30102.i);
|
|
if(ts_max30102.RED_max < ts_max30102.RED_out2){ ts_max30102.RED_max=ts_max30102.RED_out2; }
|
|
if(ts_max30102.RED_min > ts_max30102.RED_out2){ ts_max30102.RED_min=ts_max30102.RED_out2; }
|
|
//printf(" %lu--%lu ",ts_max30102.RED_min,ts_max30102.RED_max);
|
|
|
|
if(ts_max30102.IR_max < ts_max30102.IR_out2){ ts_max30102.IR_max=ts_max30102.IR_out2; }
|
|
if(ts_max30102.IR_min > ts_max30102.IR_out2){ ts_max30102.IR_min=ts_max30102.IR_out2; }
|
|
//printf(" %lu--%lu ",ts_max30102.IR_min,ts_max30102.IR_max);
|
|
|
|
ts_max30102.i++;//记录周期数
|
|
L3_max_spo2();
|
|
|
|
}
|
|
}
|
|
}
|
|
#if 0
|
|
void L2_timer4max30102_callback(void)
|
|
{
|
|
max30102_read_fifo();//数据读入
|
|
|
|
}
|
|
|
|
void max30102_read_fifo(void)
|
|
{
|
|
U8 i;
|
|
ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR);
|
|
|
|
///L1_uartD_senduc('W');
|
|
///L1_uartD_senduchex(ts_max30102.s);
|
|
|
|
if(ts_max30102.s > 0x1e)
|
|
{///L1_uartD_senduc('r');
|
|
ts_max30102.fifook = 1;
|
|
|
|
}
|
|
|
|
if(ts_max30102.fifook)
|
|
{////ts_max30102.s
|
|
ts_max30102.fifook = 0;
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
for(i = 0;i < 32;i ++)
|
|
{
|
|
L1_max30102_Read_Array(REG_FIFO_DATA,(u8 *)&ts_max30102.dfifo[i],6);
|
|
if (ts_max30102.mode == D_m32_mode_SPO2)
|
|
{
|
|
if(i ==0x1f)
|
|
{
|
|
ts_max30102.dfifo[i].RED0 = ts_max30102.dfifo[i-1].RED0 ;
|
|
ts_max30102.dfifo[i].RED1 = ts_max30102.dfifo[i-1].RED1 ;
|
|
ts_max30102.dfifo[i].RED2 = ts_max30102.dfifo[i-1].RED2 ;
|
|
ts_max30102.dfifo[i].IR0 = ts_max30102.dfifo[i-1].IR0 ;
|
|
ts_max30102.dfifo[i].IR1 = ts_max30102.dfifo[i-1].IR1 ;
|
|
ts_max30102.dfifo[i].IR2 = ts_max30102.dfifo[i-1].IR2 ;
|
|
/// L1_uartD_senduchex(i); L1_uartD_senduc('f');L1_uartD_senduc(' ');
|
|
}else
|
|
{
|
|
// L1_uartD_senduchex(i); L1_uartD_senduc(' ');
|
|
}
|
|
}else
|
|
{
|
|
/// L1_uartD_senduchex(i); L1_uartD_senduc(' ');
|
|
}
|
|
|
|
ts_max30102.u16b = ts_max30102.dfifo[i].RED2;
|
|
ts_max30102.red =(U32)ts_max30102.u16b;
|
|
ts_max30102.red <<= 16 ;
|
|
|
|
ts_max30102.u16d = ts_max30102.dfifo[i].RED1;
|
|
ts_max30102.u16d <<= 8;
|
|
ts_max30102.u16d |= ts_max30102.dfifo[i].RED0;
|
|
|
|
ts_max30102.red |= (U32)ts_max30102.u16d;
|
|
|
|
//////////////////////
|
|
ts_max30102.u16b = ts_max30102.dfifo[i].IR2;
|
|
ts_max30102.ir =(U32)ts_max30102.u16b;
|
|
ts_max30102.ir <<= 16 ;
|
|
|
|
ts_max30102.u16d = ts_max30102.dfifo[i].IR1;
|
|
ts_max30102.u16d <<= 8;
|
|
|
|
ts_max30102.u16d |= ts_max30102.dfifo[i].IR0;
|
|
|
|
ts_max30102.ir |= (U32)ts_max30102.u16d;
|
|
|
|
//printf("\r\n %lu %lu ",ts_max30102.red,ts_max30102.ir);
|
|
/// ts_max30102.datok = 1;
|
|
L2_max30102_hh();
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
void L2_task_m32_register(void)
|
|
{
|
|
L1_task_reg_clear(&ts_task_m32.task);
|
|
L3_task_s_go(ts_task_m32,D_task_init);
|
|
}
|
|
|
|
///step 1 init
|
|
///step 2 启动hr模式
|
|
///step 3 等待采样完成
|
|
///step 4 启动spo模式
|
|
///step 5 等待采样完成
|
|
///step 6
|
|
|
|
///L2_task_m32_handle(&ts_task_m32);
|
|
void L2_task_m32_handle(TS_task_m32_ *s)
|
|
{
|
|
unsigned char i = 0;
|
|
|
|
TTSS_Task_init():
|
|
|
|
ts_max30102.HRok = 0;
|
|
printf("\r\nL2_task_m32_handle ");
|
|
L2_task_go(D_task_m32_HR);
|
|
TTSS_Task_step(D_task_m32_HR):
|
|
L1_MAX30102_Config();
|
|
ts_max30102.mode = D_m32_mode_SPO2;
|
|
///ts_max30102.mode = D_m32_mode_HR;
|
|
printf("\r\nD_m32_mode_SPO2 ");
|
|
///printf("\r\nD_m32_mode_HR ");
|
|
L0_MAX30102_mode(ts_max30102.mode);
|
|
|
|
ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR);
|
|
printf("REG_FIFO_WR_PTR = %d \r\n",(int)ts_max30102.s);
|
|
ts_max30102.s2 = ts_max30102.s +1;
|
|
ts_max30102.fifo_ok = 0;
|
|
L2_task_go(D_task_m32_ask);
|
|
TTSS_Task_step(D_task_m32_ask):
|
|
/// ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1);
|
|
/// printf("S%d ",(int)ts_max30102.s);///
|
|
|
|
ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR);
|
|
|
|
|
|
/// printf("S%d ",(int)ts_max30102.s);///
|
|
if(ts_max30102.s == 0)
|
|
{
|
|
printf(" Z%d ",(int)ts_max30102.s);
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
L2_task_go(D_task_m32_HR);
|
|
}else if(ts_max30102.s >31 )
|
|
{
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
printf(" E%d ",(int)ts_max30102.s);
|
|
L2_task_go(D_task_m32_HR);
|
|
}else
|
|
{
|
|
if(ts_max30102.s2 != ts_max30102.s)
|
|
{
|
|
ts_max30102.s2 = ts_max30102.s;
|
|
////printf("\r\n%d ",(int)ts_max30102.s);
|
|
if(ts_max30102.s == 31)
|
|
{///printf("\r\n %d ",(int)ts_max30102.s);
|
|
/// printf("\r\nFull:");
|
|
L2_task_go(D_task_m32_read);
|
|
}else
|
|
{
|
|
/// L1_uartD_senduc('&');
|
|
}
|
|
}
|
|
}
|
|
TTSS_Task_step(D_task_m32_read):
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
for(i = 0;i < 32;i ++)
|
|
{
|
|
L1_max30102_Read_Array(REG_FIFO_DATA,(u8 *)&ts_max30102.dfifo[i],6);
|
|
/// L1_uartD_0d0a();
|
|
/// L1_uartD_uc(' ');L1_uartD_Arrayhex((u8 *)&ts_max30102.dfifo[i],6);
|
|
// L1_uartD_uc(' ');L1_uartD_uchex(i);
|
|
|
|
if (ts_max30102.mode == D_m32_mode_SPO2)
|
|
{
|
|
if(i ==0x1f)///31
|
|
{
|
|
|
|
ts_max30102.dfifo[i].RED0 = ts_max30102.dfifo[i-1].RED0 ;
|
|
ts_max30102.dfifo[i].RED1 = ts_max30102.dfifo[i-1].RED1 ;
|
|
ts_max30102.dfifo[i].RED2 = ts_max30102.dfifo[i-1].RED2 ;
|
|
ts_max30102.dfifo[i].IR0 = ts_max30102.dfifo[i-1].IR0 ;
|
|
ts_max30102.dfifo[i].IR1 = ts_max30102.dfifo[i-1].IR1 ;
|
|
ts_max30102.dfifo[i].IR2 = ts_max30102.dfifo[i-1].IR2 ;
|
|
|
|
/**/
|
|
///L1_uartD_senduchex(i); L1_uartD_senduc('f');L1_uartD_senduc(' ');
|
|
}else
|
|
{
|
|
}
|
|
////L1_uartD_senduchex(i); L1_uartD_senduc(' ');
|
|
}else
|
|
{
|
|
|
|
}
|
|
|
|
ts_max30102.u16b = ts_max30102.dfifo[i].RED2;
|
|
ts_max30102.red =(U32)ts_max30102.u16b;
|
|
ts_max30102.red <<= 16 ;
|
|
|
|
ts_max30102.u16d = ts_max30102.dfifo[i].RED1;
|
|
ts_max30102.u16d <<= 8;
|
|
ts_max30102.u16d |= ts_max30102.dfifo[i].RED0;
|
|
|
|
ts_max30102.red |= (U32)ts_max30102.u16d;
|
|
|
|
//////////////////////
|
|
ts_max30102.u16b = ts_max30102.dfifo[i].IR2;
|
|
ts_max30102.ir =(U32)ts_max30102.u16b;
|
|
ts_max30102.ir <<= 16 ;
|
|
|
|
ts_max30102.u16d = ts_max30102.dfifo[i].IR1;
|
|
ts_max30102.u16d <<= 8;
|
|
|
|
ts_max30102.u16d |= ts_max30102.dfifo[i].IR0;
|
|
|
|
ts_max30102.ir |= (U32)ts_max30102.u16d;
|
|
|
|
L2_max30102_hh();/////
|
|
|
|
|
|
ts_max30102.u322 = ts_max30102.RED_out2/4000L;
|
|
ts_max30102.u162 = ts_max30102.u322;
|
|
ts_max30102.u81 = ts_max30102.u162;
|
|
ts_max30102.send[i] = ts_max30102.u81;
|
|
|
|
|
|
/// printf("\r\n%d %lu %lu ",(int)i,ts_max30102.red,ts_max30102.ir);
|
|
/// ts_max30102.datok = 1;
|
|
|
|
}
|
|
|
|
///ts_max30102.fifo_ok = 1;
|
|
L2_task_go(D_task_m32_SPO);
|
|
TTSS_Task_step(D_task_m32_SPO):
|
|
/// L2_max30102_hh();
|
|
|
|
|
|
/// printf("\r\n%d %lu %lu ",(int)i,ts_max30102.red,ts_max30102.ir);
|
|
L2_task_go(D_task_m32_out);
|
|
TTSS_Task_step(D_task_m32_out):
|
|
//// 0-1-2-3-4-5-6-7 127/8=16
|
|
|
|
|
|
|
|
if(ts_max30102.SPO2_ok)
|
|
{
|
|
ts_max30102.SPO2_ok = 0;
|
|
if(ts_max30102.SPO2_out_temp != ts_max30102.SPO2_out)
|
|
{
|
|
ts_max30102.SPO2_out_temp = ts_max30102.SPO2_out;
|
|
D_SHOW_oxygen(ts_max30102.SPO2_out);
|
|
}
|
|
}
|
|
if(ts_max30102.hr_ok)
|
|
{
|
|
ts_max30102.hr_ok = 0;
|
|
if(ts_max30102.hr_out2_temp != ts_max30102.hr_out2)
|
|
{
|
|
ts_max30102.hr_out2_temp = ts_max30102.hr_out2;
|
|
D_SHOW_heart(ts_max30102.hr_out2);
|
|
}
|
|
}
|
|
|
|
/// ts_max30102.SPO2_out = 99;
|
|
/// ts_max30102.hr_out2 = 123;
|
|
// L2_OLED_Showint2(5*8,0,ts_max30102.SPO2_out,16);
|
|
// L2_OLED_Showint3(5*8,2,ts_max30102.hr_out2,16);
|
|
|
|
L2_task_go(D_task_m32_ask);
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
8x16
|
|
128/8=16
|
|
0 1 2 3 4 5 6 7
|
|
|
|
|
|
|
|
|
|
void max30102_read_fifo222222(void)
|
|
{
|
|
|
|
U32 un_temp;
|
|
|
|
/**************
|
|
|
|
ts_max30102.fifo_red=0;
|
|
ts_max30102.fifo_ir=0;
|
|
|
|
for(i=0;i<6;i++)
|
|
{
|
|
ts_max30102.d[i]=0;
|
|
}
|
|
|
|
printf("\r\n");
|
|
|
|
for(m = 0;m<=0x12;m ++)
|
|
{
|
|
s=IIC_Read_Byte(MAX30102_Device_address,m);
|
|
printf("\r\nreg(%2x %d) = %2X %d ",(int)m,(int)m,(int)s,(u16)s);
|
|
}
|
|
printf("\r\n");
|
|
|
|
|
|
|
|
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_INTR);
|
|
// s=0x12;
|
|
ts_max30102.s2= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_FRAC);
|
|
/// printf(" tmp %2X %2X %d.%d",(int)s,(int)s2,(int)s,(int)s2);
|
|
//read and clear statu
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1);
|
|
// s=0x12;
|
|
ts_max30102.s2= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_2);
|
|
//// printf("\r\nsta %X %X %X --",(int)0xAA,(int)ts_max30102.s,(int)ts_max30102.s2);
|
|
|
|
|
|
#define REG_FIFO_WR_PTR 0x04
|
|
#define REG_OVF_COUNTER 0x05
|
|
#define REG_FIFO_RD_PTR 0x06
|
|
40 40 1C 00 00
|
|
40 00 1D 00 00
|
|
40 00 1E 00 00
|
|
40 C0 00 00 00
|
|
|
|
|
|
Status 1
|
|
B7 B6 B5 B4 B3 B2 B1 B0 ADDR POR_STATE
|
|
A_FULL PPG_RDY ALC_OVF PWR_RDY 0x00 0X00 R
|
|
|
|
*************/
|
|
|
|
Lc_delay_ms(1);
|
|
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1);
|
|
L1_uartD_senduc(' ');
|
|
L1_uartD_senduchex(ts_max30102.s);
|
|
|
|
// ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_CONFIG);
|
|
// L1_uartD_senduc(' ');
|
|
// L1_uartD_senduchex(ts_max30102.s);
|
|
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR);
|
|
L1_uartD_senduc(' ');
|
|
L1_uartD_senduchex(ts_max30102.s);
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_OVF_COUNTER);
|
|
L1_uartD_senduc(' ');
|
|
L1_uartD_senduchex(ts_max30102.s);
|
|
ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_RD_PTR);
|
|
L1_uartD_senduc(' ');
|
|
L1_uartD_senduchex(ts_max30102.s);
|
|
|
|
|
|
L1_uartD_0d0a();
|
|
|
|
/// ts_max30102.d[0]=REG_FIFO_DATA;
|
|
/// L1_max30102_Read_Array(REG_FIFO_DATA,ts_max30102.d,6);
|
|
///
|
|
/// L1_uartD_uchexArray(ts_max30102.d,6);
|
|
|
|
|
|
/********
|
|
printf("fifo :%2X %2X %2X %2X %2X %2X ",
|
|
(int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2],
|
|
(int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]);
|
|
|
|
|
|
|
|
for(i=0;i<6;i++)
|
|
{
|
|
ts_max30102.d[i]=0x40+i;
|
|
}
|
|
|
|
printf("fifo :%2X %2X %2X %2X %2X %2X ",
|
|
(int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2],
|
|
(int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]);
|
|
|
|
*******/
|
|
|
|
/************
|
|
un_temp=ts_max30102.d[0];
|
|
|
|
ts_max30102.fifo_red=un_temp<<16;
|
|
|
|
un_temp=ts_max30102.d[1];
|
|
un_temp<<=8;
|
|
ts_max30102.fifo_red|=un_temp;
|
|
un_temp=ts_max30102.d[2];
|
|
// un_temp>>=2;
|
|
ts_max30102.fifo_red|=un_temp;
|
|
|
|
|
|
|
|
|
|
un_temp=ts_max30102.d[3];
|
|
ts_max30102.fifo_ir = un_temp<<16;
|
|
un_temp=ts_max30102.d[4];
|
|
un_temp<<=8;
|
|
ts_max30102.fifo_ir|=un_temp;
|
|
un_temp=ts_max30102.d[5];
|
|
/// un_temp>>=2;
|
|
ts_max30102.fifo_ir|=un_temp;
|
|
|
|
ts_max30102.u16out_c = D_2uc_u16(ts_max30102.d[2],ts_max30102.d[5]);
|
|
|
|
|
|
L1_uartD_sendulhex(ts_max30102.fifo_red);
|
|
/// Lc_delay_ms(1);
|
|
L1_uartD_senduc('R');
|
|
L1_uartD_sendulhex(ts_max30102.fifo_ir);
|
|
// if(ts_max30102.fifo_ir<=10000)
|
|
// {
|
|
// ts_max30102.fifo_ir=0;
|
|
// }
|
|
// if(ts_max30102.fifo_red<=10000)
|
|
// {
|
|
// ts_max30102.fifo_red=0;
|
|
// }
|
|
|
|
|
|
// USART_SendData(USART_PORT,ts_max30102.fifo_red);
|
|
// while (USART_GetFlag Status(USART_PORT, USART_FLAG_TXE) == RESET);
|
|
// printf("%d %d\r\n",ts_max30102.fifo_red,ts_max30102.fifo_ir);
|
|
// Delay_ms(100);
|
|
|
|
****************/
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void L0_MAX30102_Config(void)
|
|
{
|
|
L1_max30102_WB(REG_MODE_CONFIG, 0x40);///reset = 1;
|
|
Lc_delay_ms(30);
|
|
// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN
|
|
// L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN
|
|
L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
|
|
/*********
|
|
REGISTER FIFO Configuration
|
|
B7 B6 B5 B4 B3 B2 B1 B0 REG ADDR POR STATE
|
|
SMP_AVE[2:0] FIFO_ROL LOVER_EN FIFO_A_FULL[3:0] 0x08 0x00 R/W
|
|
****/
|
|
|
|
|
|
/// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
|
|
L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0
|
|
////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断
|
|
|
|
L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_SPO2);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
|
|
L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS)
|
|
L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1
|
|
L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2
|
|
L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED
|
|
|
|
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
|
|
|
|
}
|
|
|
|
if(d > 4)
|
|
{
|
|
d = 0;
|
|
L2_task_go(D_task_m32_01);
|
|
L1_task_Tdelay(D_Tdelay_100ms);
|
|
}else
|
|
{
|
|
d ++;
|
|
}
|
|
|
|
|
|
if(d > 8)
|
|
{
|
|
d = 0;
|
|
L2_task_go(D_task_m32_02);
|
|
L1_task_Cdelay(D_Cdelay_200us);
|
|
}else
|
|
{
|
|
d ++;
|
|
}
|
|
|
|
void L2_timer4max30102_callbackyyyy(void)
|
|
{
|
|
|
|
//// TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
|
|
max30102_read_fifo();//数据读入
|
|
ts_max30102.i++;//记录周期数
|
|
int temp=fifo_ir;
|
|
int temp2=fifo_red;
|
|
while(ts_max30102.temp+ts_max30102.temp2<20000)
|
|
{//未检测出手指时代码会在此处跑死,原因为拟合函数只在检测到手指时有效
|
|
printf("未检测出手指\r\n");
|
|
max30102_read_fifo();
|
|
ts_max30102.temp=ts_max30102.fifo_ir;
|
|
ts_max30102.temp2=ts_max30102.fifo_red;
|
|
}
|
|
|
|
|
|
if(ts_max30102.i==0){//周期数值初始
|
|
ts_max30102.max=ts_max30102.temp;
|
|
ts_max30102.min=ts_max30102.temp;
|
|
ts_max30102.max2=ts_max30102.temp2;
|
|
ts_max30102.min2=ts_max30102.temp2;
|
|
}
|
|
//取得周期内最大最小数据
|
|
if(ts_max30102.max<ts_max30102.temp){ ts_max30102.max=ts_max30102.temp; }
|
|
if(ts_max30102.min>ts_max30102.temp){ ts_max30102.min=ts_max30102.temp; }
|
|
if(ts_max30102.max2<ts_max30102.temp2){ ts_max30102.max2=ts_max30102.temp2; }
|
|
if(ts_max30102.min2>ts_max30102.temp2){ ts_max30102.min2=ts_max30102.temp2; }
|
|
|
|
if(ts_max30102.i>=39)
|
|
{//39数据为1周期
|
|
ts_max30102.i=0;
|
|
ts_max30102.ac=ts_max30102.max-ts_max30102.min;//单个周期内最大最小数据差为交流分量
|
|
ts_max30102.dc=ts_max30102.min; //数据=直流分量+交流分量
|
|
ts_max30102.ac2=ts_max30102.max2-ts_max30102.min2;//同理
|
|
ts_max30102.dc2=ts_max30102.min2;
|
|
ts_max30102.max=ts_max30102.temp;
|
|
ts_max30102.min=ts_max30102.temp;
|
|
ts_max30102.max2=ts_max30102.temp2;
|
|
ts_max30102.min2=ts_max30102.temp2;
|
|
}
|
|
|
|
//结果生成,数据较为稳定,开头几个数据可以不要,比较不稳
|
|
ts_max30102.ac_ir=(float)ts_max30102.ac;//注意转换,否则无法赋值
|
|
ts_max30102.dc_ir=(float)ts_max30102.dc;
|
|
ts_max30102.ac_red=(float)ts_max30102.ac2;
|
|
ts_max30102.dc_red=(float)ts_max30102.dc2;
|
|
ts_max30102.R2=(ts_max30102.ac_red* ts_max30102.dc_ir)/(ts_max30102.ac_ir*ts_max30102.dc_red);
|
|
ts_max30102.SPO2 =-45.060*ts_max30102.R2*ts_max30102.R2+ 30.354 *ts_max30102.R2 + 94.845;
|
|
|
|
}
|
|
|
|
|
|
void MAX30102_Config222(void)
|
|
{
|
|
u8 id1,id2,rr = 0xE5;
|
|
|
|
L1_max30102_WB(REG_MODE_CONFIG, 0x40);
|
|
Lc_delay_ms(200);
|
|
//read and clear statu
|
|
id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID);
|
|
|
|
id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID);
|
|
///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2);
|
|
printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2);
|
|
|
|
L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting
|
|
|
|
|
|
L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
|
|
L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
|
|
L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
|
|
L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (50 Hz), LED pulseWidth (400uS)
|
|
L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1
|
|
L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2
|
|
L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED
|
|
|
|
L1_max30102_WB(REG_TEMP_CONFIG,1);
|
|
}
|
|
|
|
void MAX30102_Configbbb(void)
|
|
{
|
|
u8 id1,id2,rr = 0xE5;
|
|
|
|
L1_max30102_WB(REG_MODE_CONFIG, 0x40);
|
|
Lc_delay_ms(200);
|
|
//read and clear statu
|
|
id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID);
|
|
|
|
id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID);
|
|
///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2);
|
|
printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2);
|
|
|
|
|
|
|
|
L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting
|
|
|
|
|
|
L1_max30102_WB(REG_INTR_ENABLE_2,0x00);//
|
|
|
|
///清空
|
|
L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
|
|
L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
|
|
L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
|
|
|
|
L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
|
|
L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
|
|
L1_max30102_WB(REG_SPO2_CONFIG,0x2B); // //SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit
|
|
L1_max30102_WB(REG_LED1_PA,0x40);//Choose value for ~ 10mA for LED1
|
|
L1_max30102_WB(REG_LED2_PA,0x40);// Choose value for ~ 10mA for LED2
|
|
L1_max30102_WB(REG_PILOT_PA,0x01);// Choose value for ~ 25mA for Pilot LED
|
|
|
|
L1_max30102_WB(REG_TEMP_CONFIG,1);
|
|
}
|
|
|
|
|
|
|
|
[16:32:10.800]收←◆
|
|
stcTTSS2_lora v4.4
|
|
Sep 15 202223:40:47
|
|
main while
|
|
L0_OLED_io_int
|
|
[16:32:11.837]收←◆OLED_Clear
|
|
[16:32:13.002]收←◆.
|
|
L2_task_m32_handle
|
|
D_task_m32_HR 41 00 01 00 00
|
|
40 00 02 00 00
|
|
40 00 03 00 00
|
|
40 00 04 00 00
|
|
40 00 05 00 00
|
|
40 00 06 00 00
|
|
40 00 07 00 00
|
|
40 00 08 00 00
|
|
40 00 09 00 00
|
|
40 00 0A 00 00
|
|
40 00 0B 00 00
|
|
40 00 0C 00 00
|
|
40 00 0D 00 00
|
|
40 00 0E 00 00
|
|
40 00 0F 00 00
|
|
40 00 10 00 00
|
|
40 00 11 00 00
|
|
40 00 12 00 00
|
|
40 00 13 00 00
|
|
40 00 14 00 00
|
|
40 00 15 00 00
|
|
40 00 16 00 00
|
|
40 00 17 00 00
|
|
40 00 18 00 00
|
|
40 00 19 00 00
|
|
40 00 1A 00 00
|
|
40 00 1B 00 00
|
|
40 00 1C 00 00
|
|
40 00 1D 00 00
|
|
40 00 1E 00 00
|
|
40 00 1F 00 00
|
|
C0 00 00 01 00
|
|
40 00 00 02 00
|
|
40 00 00 03 00
|
|
40 00 00 04 00
|
|
40 00 00 05 00
|
|
40 00 00 06 00
|
|
40 00 00 07 00
|
|
40 00 00 08 00
|
|
40 00 00 09 00
|
|
ts_max30102.HRok 40 00 00 0A 00
|
|
40 00 00 0B 00
|
|
40 00 00 0C 00
|
|
40 00 00 0D 00
|
|
|
|
[16:32:13.474]收←◆ 40 00 00 0E 00
|
|
40 00 00 0F 00
|
|
40 00 00 10 00
|
|
40 00 00 11 00
|
|
40 00
|
|
[16:32:13.525]收←◆ 00 12 00
|
|
40 00 00 13 00
|
|
40 00 00 14 00
|
|
40 00 00 15 00
|
|
40 00 00 16 00
|
|
40 00 00 17
|
|
[16:32:13.589]收←◆ 00
|
|
40 00 00 18 00
|
|
40 00 00 19 00
|
|
40 00 00 1A 00
|
|
40 00 00 1B 00
|
|
40 00 00 1C 00
|
|
40 00 00 1D
|
|
[16:32:13.632]收←◆ 00
|
|
40 00 00 1E 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40
|
|
[16:32:13.687]收←◆ 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00
|
|
[16:32:13.712]收←◆ 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
|
|
[16:32:13.775]收←◆ 40 00 00 1F 00
|
|
40 00 00 1F 00
|
|
40
|
|
|
|
|
|
|
|
|
|
stcTTSS2_lora v4.4
|
|
Sep 15 202223:40:47
|
|
main while
|
|
L0_OLED_io_intOLED_Clear.
|
|
L2_task_m32_handle
|
|
D_task_m32_HR 41 00 01 00 00
|
|
00 00 03 00 02
|
|
40 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 09 00 09
|
|
00 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
40 00 0F 00 0E
|
|
00 00 10 00 10
|
|
00 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
40 00 16 00 15
|
|
00 00 17 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1B 00 1B
|
|
00 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
40 00 01 00 00
|
|
00 00 02 00 02
|
|
00 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
40 00 08 00 07
|
|
00 00 09 00 09
|
|
00 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0D 00 0D
|
|
00 00 0F 00 0E
|
|
00 00 10 00 10
|
|
00 00 12 00 11
|
|
40 00 13 00 12
|
|
00 00 14 00 14
|
|
00 00 16 00 15
|
|
00 00 17 00 17
|
|
ts_max30102.HRok 00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1C 00 1B
|
|
40 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
00 00 01 00 01
|
|
00 00 03 00 02
|
|
40 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 09 00 09
|
|
00 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
40 00 0F 00 0E
|
|
00 00 10 00 10
|
|
00 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
40 00 16 00 15
|
|
00 00 17 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1B 00 1B
|
|
00 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
40 00 01 00 00
|
|
00 00 02 00 02
|
|
00 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
40 00 08 00 07
|
|
00 00 09 00 09
|
|
00 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0D 00 0D
|
|
ts_max30102.HRok . 40 00 0F 00 0E
|
|
00 00 11 00 10
|
|
40 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
00 00 16 00 16
|
|
00 00 17 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1C 00 1B
|
|
40 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
00 00 01 00 01
|
|
00 00 03 00 02
|
|
40 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 09 00 09
|
|
00 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
40 00 0F 00 0E
|
|
00 00 10 00 10
|
|
00 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
40 00 16 00 15
|
|
00 00 17 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1C 00 1B
|
|
40 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
40 00 01 00 00
|
|
00 00 02 00 02
|
|
00 00 04 00 03
|
|
ts_max30102.HRok 00 00 05 00 05
|
|
00 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 0A 00 09
|
|
40 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
00 00 0F 00 0F
|
|
00 00 11 00 10
|
|
40 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
00 00 16 00 16
|
|
00 00 18 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
00 00 1C 00 1B
|
|
40 00 1D 00 1C
|
|
00 00 1E 00 1E
|
|
00 00 00 00 1F
|
|
00 00 01 00 01
|
|
00 00 03 00 02
|
|
40 00 04 00 03
|
|
00 00 05 00 05
|
|
00 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 0A 00 09
|
|
40 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
40 00 0F 00 0E
|
|
00 00 10 00 10
|
|
00 00 12 00 11
|
|
00 00 13 00 13
|
|
00 00 15 00 14
|
|
40 00 16 00 15
|
|
00 00 17 00 17
|
|
00 00 19 00 18
|
|
00 00 1A 00 1A
|
|
ts_max30102.HRok 00 00 1C 00 1B
|
|
00 00 1D 00 1D
|
|
00 00 1F 00 1E
|
|
40 00 00 00 1F
|
|
00 00 01 00 01
|
|
00 00 03 00 02
|
|
00 00 04 00 04
|
|
00 00 06 00 05
|
|
40 00 07 00 06
|
|
00 00 08 00 08
|
|
00 00 0A 00 09
|
|
40 00 0B 00 0A
|
|
00 00 0C 00 0C
|
|
00 00 0E 00 0D
|
|
00 00 0F 00 0F
|
|
00 00 11 00 10
|
|
40 00 12 00 11
|
|
|
|
|
|
#endif
|
|
|
|
/******************************END*********************************/
|
|
|
|
|
|
|