![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Mode1 Optical Validation
Diff: main.cpp
- Revision:
- 32:92adfbe18ab6
- Parent:
- 31:92e1bcdb7b1e
- Child:
- 33:c8fbd904df3e
--- a/main.cpp Fri Feb 04 02:43:50 2022 +0000 +++ b/main.cpp Mon Mar 14 23:53:46 2022 +0000 @@ -37,7 +37,7 @@ /****************************************************************************** * https://os.mbed.com/users/phonemacro/code/MAX32664C_Example_Host_Code * Tera Term output is set to 115200 baud rate. -* ver: 220203 +* ver: 220310 ******************************************************************************/ /****************************************************************************** @@ -51,9 +51,9 @@ /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ // define one and only one of the following three platforms -#define MAXM86146_CFG 1 // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.12 +#define MAXM86146_CFG 1 // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR 33.13.31/12 //#define MAXREFDES103_CFG // not tested -//#define MAXM86161_CFG 1 // tested on MAXM86161+MAX32630FTHR v32.9.22, 32.13.12 +//#define MAXM86161_CFG 1 // tested on MAXM86161+MAX32630FTHR v32.9.23, 32.13.12 /*****************************************************************************/ /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ @@ -84,7 +84,7 @@ #endif /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ -//#define RAW // define this if you only want AFE+accel data, no algorithm +//#define RAW // define this if you want AFE+accel data, no algorithm #define ALGO_ONLY 1 // define this if you only want algo data, comment out if you want raw sensor+algo data //#define EXTENDED_ALGO 1 // define this if you want the extended algo format //#define AGC 1 // define this for AGC, otherwise the default is AEC @@ -94,7 +94,15 @@ I2C sh_i2c_pmic(P5_7, P6_0); #endif -#if defined(MAXM86161_CFG) +#ifdef MAXM86146_CFG + #define PPG_SZ 36 //maxm86146 +#else + #define PPG_SZ 18 //maxm86161, max86141 +#endif +#define ACCEL_SZ 6 // accel +#define SENSOR_SZ (PPG_SZ+ACCEL_SZ) + +#if defined(MAXM86161_CFG) || defined(MAXM86146_CFG) // MAXM86161, MAXM86146, keep algo Fifo size as 52, 20 to keep compatible w/ the GUI #define old_msbl 1 // 3x.12.0 or earlier; 32.9.x #endif @@ -112,16 +120,6 @@ #endif #endif - -#ifdef MAXM86146_CFG - #define PPG_SZ 36 //maxm86146 -#else - #define PPG_SZ 18 //maxm86161, max86141 -#endif -#define ACCEL_SZ 6 // accel -#define SENSOR_SZ (PPG_SZ+ACCEL_SZ) - - #ifdef ALGO_ONLY #define TTL_SZ (ALGO_SZ) #else @@ -234,6 +232,7 @@ ppg[5] = (rsp[ptr+15] << 16) | (rsp[ptr+16] << 8) | (rsp[ptr+17]); pc.printf("%d,%d,%d,%d,", ppg[0], ppg[1], ppg[2], ppg[3]); #ifdef MAXM86146_CFG +#ifdef RAW pc.printf("%d,%d,", ppg[4], ppg[5]); ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]); ppg[7] = (rsp[ptr+21] << 16) | (rsp[ptr+22] << 8) | (rsp[ptr+23]); @@ -243,6 +242,7 @@ ppg[11] = (rsp[ptr+33] << 16) | (rsp[ptr+34] << 8) | (rsp[ptr+35]); pc.printf("%d,%d,%d,%d,%d,%d,", ppg[6], ppg[7],ppg[8], ppg[9],ppg[10], ppg[11]); #endif +#endif accel[0] = (rsp[PPG_SZ+0] << 8) | (rsp[PPG_SZ+1]); accel[1] = (rsp[PPG_SZ+2] << 8) | (rsp[PPG_SZ+3]); accel[2] = (rsp[PPG_SZ+4] << 8) | (rsp[PPG_SZ+5]); @@ -424,7 +424,7 @@ sh_i2c.read(SH_ADDR, rsp, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]); -//1.11 rd ver +//1.1 rd ver cmd[0] = 0xFF; cmd[1] = 0x03; sh_i2c.write(SH_ADDR, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -468,7 +468,7 @@ pc.printf("pi set to 0x19 : %x \n\r", rsp[0]); #endif -// 1.3 sensor and algo data +// 1.2 sensor and algo data cmd[0] = 0x10; cmd[1] = 0x00; #ifdef ALGO_ONLY cmd[2] = 0x02; // algo data @@ -481,55 +481,62 @@ mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.3 Status: %x\n\r", rsp[0]); -// 1.8 AEC enable (default) + pc.printf("1.2 Status: %x\n\r", rsp[0]); +// 1.5 cont hr, spo2 + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00; + sh_i2c.write(SH_ADDR, cmd, 4); + mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); + sh_i2c.read(SH_ADDR, rsp, 1); + mfio = 1; mfio = 0; wait_us(300); + pc.printf("1.5 Status: %x\n\r", rsp[0]); +// 1.6 AEC enable (default) cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.8 Status: %x\n\r", rsp[0]); + pc.printf("1.6 Status: %x\n\r", rsp[0]); #if AGC -// AGC1.8 Disable auto PD (default +// AGC1.7 Disable auto PD (default cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x00; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("AGC1.8 Status: %x\n\r", rsp[0]); -// AGC1.9 Disable SCD (default) + pc.printf("AGC1.7 Status: %x\n\r", rsp[0]); +// AGC1.8 Disable SCD (default) cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x00; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("AGC1.9 Status: %x\n\r", rsp[0]); -// AGC1.10 Set AGC target PD TO 10uA + pc.printf("AGC1.8 Status: %x\n\r", rsp[0]); +// AGC1.9 Set AGC target PD TO 10uA cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x11; cmd[3] = 0x00; cmd[3] = 0x64; sh_i2c.write(SH_ADDR, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("AGC1.10 Status: %x\n\r", rsp[0]); + pc.printf("AGC1.9 Status: %x\n\r", rsp[0]); #else -// 1.9 auto PD (default +// 1.7 auto PD (default cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.9 Status: %x\n\r", rsp[0]); -// 1.10 SCD (default) + pc.printf("1.7 Status: %x\n\r", rsp[0]); +// 1.8 SCD (default) cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.7 Status: %x\n\r", rsp[0]); + pc.printf("1.8 Status: %x\n\r", rsp[0]); #endif #if defined(MAXM86161_CFG) //only use Red and IR -//1.20 Sec 4.1 map leds to slots +//1.20 map leds to slots cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x23; cmd[4] = 0x00; cmd[5] = 0x00; sh_i2c.write(SH_ADDR, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -555,7 +562,7 @@ #endif #ifdef MAXM86146_CFG -//1.20 Sec 4.1 map leds to slots for MAXM86146 +//1.20 map leds to slots for MAXM86146 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00; sh_i2c.write(SH_ADDR, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -602,14 +609,6 @@ #endif #endif // MAXM86146_CFG -// 1.7 cont hr, spo2 - cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00; - sh_i2c.write(SH_ADDR, cmd, 4); - mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - sh_i2c.read(SH_ADDR, rsp, 1); - mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.7 Status: %x\n\r", rsp[0]); - #if 0 // MAXM86161 test new commands // LDO enable cmd[0] = 0x10; cmd[1] = 0x12; cmd[2] = 0x01; @@ -628,7 +627,7 @@ mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); #endif -// 1.3 Enable HR, SpO2 algo +// 1.30 Enable HR, SpO2 algo #ifdef EXTENDED_ALGO cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x02; #else @@ -678,14 +677,14 @@ mfio = 0; wait_us(300); -//read operating mode +//1.0 read operating mode cmd[0] = 0x02; cmd[1] = 0x00; sh_i2c.write(SH_ADDR, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); pc.printf("\n\r 0x02 0x00 Status, Read Operating Mode: %x %x\n\r", rsp[0], rsp[1]); -//1.11 rd ver +//1.1 rd ver cmd[0] = 0xFF; cmd[1] = 0x03; sh_i2c.write(SH_ADDR, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -693,30 +692,30 @@ mfio = 1; mfio = 0; wait_us(300); pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]); -// raw1.1 sensor data +// raw1.2 sensor data cmd[0] = 0x10; cmd[1] = 0x00; cmd[2] = 0x01; pc.printf("raw sensor data only \n\r"); sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.1 Status: %x\n\r", rsp[0]); -// raw1.2 interrupt threshold + pc.printf("raw1.2 Status: %x\n\r", rsp[0]); +// raw1.3 interrupt threshold cmd[0] = 0x10; cmd[1] = 0x01; cmd[2] = 0x01; sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.2 Status: %x\n\r", rsp[0]); -// raw1.3 enable sh accel + pc.printf("raw1.3 Status: %x\n\r", rsp[0]); +// raw1.4 enable sh accel cmd[0] = 0x44; cmd[1] = 0x04; cmd[2] = 0x01; cmd[3] = 0x00; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(20); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - pc.printf("raw1.3 Status: %x\n\r", rsp[0]); -// raw1.4 enable AFE - cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; // 3 bytes // tested on 33.13.12, 33.13.19 + pc.printf("raw1.4 Status: %x\n\r", rsp[0]); +// raw1.6 enable AFE + cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; // 3 bytes // tested on 33.13.31/12 sh_i2c.write(SH_ADDR, cmd, 3); // cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; // sh_i2c.write(SH_ADDR, cmd, 4); @@ -725,54 +724,54 @@ mfio = 1; thread_sleep_for(250); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - pc.printf("raw1.4 Status: %x\n\r", rsp[0]); -#if 0 -// rd accel WHO reg + pc.printf("raw1.6 Status: %x\n\r", rsp[0]); + +// raw1.7 rd accel WHO reg cmd[0] = 0x41; cmd[1] = 0x04; cmd[2] = 0x0F; sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]); -// rd AFE part id + pc.printf("1.7 Who Status: %x %x\n\r", rsp[0], rsp[1]); +// rd1.6 AFE part id cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF; sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - pc.printf("part id Status: %x %x\n\r", rsp[0], rsp[1]); -#endif -// raw1.5 sample rate 100 Hz, ave 1 + pc.printf("raw1.6 part id Status: %x %x\n\r", rsp[0], rsp[1]); + +// raw1.8 sample rate 100 Hz, ave 1 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x18; // set AFE reg 0x12 to 100 Hz // cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x20; // set AFE reg 0x12 to 200 Hz sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.5 Status: %x\n\r", rsp[0]); -// raw1.6 LED1 current + pc.printf("raw1.8 Status: %x\n\r", rsp[0]); +// raw1.9 LED1 current cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x3F; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.6 Status: %x\n\r", rsp[0]); + pc.printf("raw1.9 Status: %x\n\r", rsp[0]); #ifndef MAXM86146_CFG -// raw1.7 LED2 current +// raw1.10 LED2 current cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x7F; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.7 Status: %x\n\r", rsp[0]); + pc.printf("raw1.10 Status: %x\n\r", rsp[0]); #endif -// raw1.8 LED3 current +// raw1.11 LED3 current cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x7F; sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("raw1.8 Status: %x\n\r", rsp[0]); + pc.printf("raw1.11 Status: %x\n\r", rsp[0]); #ifdef MAXM86146_CFG // LED5 current cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x7F;