![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Mode1 Optical Validation
Diff: main.cpp
- Revision:
- 61:a2e73c5b87e7
- Parent:
- 60:fdccd048489b
- Child:
- 62:21a7745d02e0
--- a/main.cpp Tue May 31 22:37:14 2022 +0000 +++ b/main.cpp Wed Jun 01 01:03:55 2022 +0000 @@ -35,7 +35,7 @@ #include "platform/mbed_thread.h" #include "mbed.h" /****************************************************************************** -* https://os.mbed.com/users/phonemacro/code/MAX32664C_MAXM86161_Mode1_Optical/ +* https://os.mbed.com/users/phonemacro/code/MAX32664C_Example_Host_Code * Tera Term output is set to 115200 baud rate. * ver: 220531 ******************************************************************************/ @@ -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.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.22, 32.13.12 /*****************************************************************************/ /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ @@ -86,7 +86,7 @@ /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ // comment the two below if you want raw sensor+algo data //#define ALGO_ONLY 1 // define this if you only want algo data -//#define RAW // define this if you want AFE+accel data, no algorithm, tested on 33.13.31 +#define RAW // define this if you want AFE+accel data, no algorithm, tested on 33.13.31 //#define RAW_HZ 25 // Raw data rate //#define RAW_HZ 50 // Raw data rate #define RAW_HZ 100 // Raw data rate @@ -96,16 +96,15 @@ #define MAXM86161_OPT_VALIDATION_GRN 1 // Optical validatation //#define MAXM86161_OPT_VALIDATION_IR 1 // Optical validatation //#define MAXM86161_OPT_VALIDATION_RED 1 // Optical validatation -//#define MAXM86161_OPT_VALIDATION_XTALK 1 // Optical validatation -#define SENSOR_ONLY 1 + // Comment out both of the below for Normal Algorithm Samples Format -//#define EXTENDED_ALGO 1 // define this if you want the extended algo samples report format +//#define EXTENDED_ALGO 1 // define this if you want the extended algo samples report format //#define PACKED_NORMAL_ALGO 1 // define this if you want the packed normal algo samples report format, 33.13.31 //#define PCK_CFG_MASK 1 // define this and the above if you want to config mask out some of the packed data, 33.13.31 //#define AGC 1 // define this for AGC, otherwise the default is AEC -#define USE_SYN 1 +//#define USE_SYN 1 //#define REDUCE_RPT_PERIOD 0x19 // Report samples every 25 frame. //#define USE_FIFO_BUFFER_CNT 5 // Allow the FIFO to accumulate this many samples @@ -143,17 +142,13 @@ #endif #endif -#if defined(MAXM86161_OPT_VALIDATION_GRN) || defined(MAXM86161_OPT_VALIDATION_RED) || defined(MAXM86161_OPT_VALIDATION_IR) || defined(MAXM86161_OPT_VALIDATION_XTALK) - #define TTL_SZ (PPG_SZ) +#ifdef ALGO_ONLY + #define TTL_SZ (ALGO_SZ) #else - #ifdef ALGO_ONLY - #define TTL_SZ (ALGO_SZ) + #ifdef RAW + #define TTL_SZ (PPG_SZ+ACCEL_SZ) #else - #ifdef RAW - #define TTL_SZ (PPG_SZ+ACCEL_SZ) - #else - #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ) - #endif + #define TTL_SZ (PPG_SZ+ACCEL_SZ+ALGO_SZ) #endif #endif @@ -184,7 +179,7 @@ // read_sh_fifo /*****************************************************************************/ /*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/ -//#define OPTIMIZE_FIFO_READ 1 // Assume that the FIFO is filled at the specified rate, so just periodically check then number of samples in the FIFO to save power +#define OPTIMIZE_FIFO_READ 1 // Assume that the FIFO is filled at the specified rate, so just periodically check then number of samples in the FIFO to save power #ifdef OPTIMIZE_FIFO_READ // tested on MAXM86146EVSYS int32_t check_fifo_countdown; #define MAX_FIFO_CNT 20 // Only send the 0x00 0x00 (step 2.0), and 0x12 0x00 (step 2.1) commands every MAX_FIFO_CNT frames. @@ -228,7 +223,7 @@ #endif // 2.2 #if defined(PACKED_NORMAL_ALGO) || defined(USE_SYN) - cmd[0] = 0x20; + cmd[0] = 0x20; sh_i2c.write(SH_ADDR, cmd, 1); #else cmd[0] = 0x12; cmd[1] = 0x00; @@ -279,7 +274,7 @@ #if RAW_HZ <= 100 pc.printf("%d,%d,", ppg[4], ppg[5]); #endif -#endif +#endif #ifdef MAXM86146_CFG #if defined(RAW) || defined(SPO2_CAL_RPT) ppg[6] = (rsp[ptr+18] << 16) | (rsp[ptr+19] << 8) | (rsp[ptr+20]); @@ -302,8 +297,7 @@ #endif //!defined(ALGO_ONLY) -#if !defined(RAW) && !defined(SENSOR_ONLY) - +#ifndef RAW #ifdef EXTENDED_ALGO // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ); opmode = rsp[ptr]; @@ -443,7 +437,7 @@ pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd); pc.printf("%d,", ibi_offset); pc.printf("%d,", inappro_ori); - #endif + #endif #else // print some if (heading_printed == 0) { heading_printed = 1; @@ -483,7 +477,7 @@ // ibi_offset = rsp[ptr+20]; sptr += (TTL_SZ); - + #if 0 if (heading_printed == 0) { heading_printed = 1; @@ -509,7 +503,7 @@ pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel,spo2_state, scd); #endif #endif // end normal algo size -#endif // !RAW && !SENSOR_ONLY +#endif // !RAW pc.printf("\n\r"); } @@ -544,7 +538,17 @@ } #endif // MAXREFDES103_CFG -void reset_sh(void) { +/*****************************************************************************/ +// init_sh_algo +/*****************************************************************************/ +void init_sh_algo(void) { + char cmd[64]; + char rsp[256]; + +#ifdef OPTIMIZE_FIFO_READ + check_fifo_countdown = MAX_FIFO_CNT; +#endif + // switch to application mode rst = 0; mfio = 1; @@ -556,25 +560,11 @@ #endif // 33.13.31 needs at least 1.6s // thread_sleep_for(100); -} - -/*****************************************************************************/ -// init_sh_algo -/*****************************************************************************/ -void init_sh_algo(void) { - char cmd[64]; - char rsp[256]; - - reset_sh(); - -#ifdef OPTIMIZE_FIFO_READ - check_fifo_countdown = MAX_FIFO_CNT; -#endif mfio = 0; wait_us(300); #ifdef REDUCE_RPT_PERIOD //Change report period to 25 - cmd[0] = 0x10; cmd[1] = 0x02; cmd[2] = REDUCE_RPT_PERIOD; + cmd[0] = 0x10; cmd[1] = 0x02; cmd[2] = REDUCE_RPT_PERIOD; 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); @@ -720,7 +710,7 @@ #endif #if defined(MAXM86161_CFG) //only use Red and IR -//1.20 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); @@ -812,7 +802,7 @@ #endif #if 0 //write SpO2 coefficients 0x00000000 FFD7FBDD 00AB61FE - cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x00; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x00; cmd[3] = 0x00; cmd[4] = 0x00; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0xFF; cmd[8] = 0xD7; cmd[9] = 0xFB; cmd[10] = 0xDD; cmd[11] = 0x00; cmd[12] = 0xAB; cmd[13] = 0x61; cmd[14] = 0xFE; @@ -822,7 +812,7 @@ mfio = 1; mfio = 0; wait_us(300); pc.printf("Wr Spo2 Coeff %x\n\r", rsp[0]); #endif -//1.26 rd SpO2 Coefficients +//1.26 rd SpO2 Coefficients cmd[0] = 0x51; cmd[1] = 0x07; cmd[2] = 0x00; sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -881,14 +871,217 @@ mfio = 1; } + +void set_reg_opt_validation(void) { + char cmd[16]; + char rsp[32]; + + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D; // fifo_a_full + 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("wr afe reg Status: %x\n\r", rsp[0]); + + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x11; cmd[3] = 0x3F; // ppg2_adc_rge=32768 ppg1_adc_rge=32768 tint=117.3us + 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("wr afe reg Status: %x\n\r", rsp[0]); + + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x13; cmd[3] = 0xC0; // reg ppg config 3 + 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("wr afe reg Status: %x\n\r", rsp[0]); + +#if 0 + // set seq1 reg + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // set seq2 reg + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0x43; + 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("wr afe reg Status: %x\n\r", rsp[0]); + // always set seq3 reg to none + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; 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("wr afe reg Status: %x\n\r", rsp[0]); +#endif + + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D; + 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("wr afe reg Status: %x\n\r", rsp[0]); + +#if defined(MAXM86161_OPT_VALIDATION_GRN) + // Set Green1 current to 1uA, 10uA or 30uA + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xA7; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set LED2 current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set Green2 current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set LED4 current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x26; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set Red current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x27; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set IR current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x28; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); +#endif +#if defined(MAXM86161_OPT_VALIDATION_IR) + // Set Green current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set IR current to 1uA, 10uA or 30uA + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xA7; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set Red current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); +#endif + +#if defined(MAXM86161_OPT_VALIDATION_RED) + // Set Green current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set IR current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set Red current to 1uA, 10uA or 30uA + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xA7; + 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("wr afe reg Status: %x\n\r", rsp[0]); + +#endif +#if defined(MAXM86161_OPT_VALIDATION_XTALK) + // Set Green current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xFF; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set IR current to 1uA, 10uA or 30uA + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xFF; + 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("wr afe reg Status: %x\n\r", rsp[0]); + + // Set Red current + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xFF; + 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("wr afe reg Status: %x\n\r", rsp[0]); +#endif + + // configure LED Range + cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x2A; 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("wr afe reg Status: %x\n\r", rsp[0]); + + +} + /*****************************************************************************/ // init_sh_raw /*****************************************************************************/ void init_sh_raw(void) { char cmd[16]; char rsp[256]; - - reset_sh(); + // switch to application mode + rst = 0; + mfio = 1; + thread_sleep_for(10); + rst = 1; + thread_sleep_for(1500); +#ifdef MAXREFDES103_CFG + init_max20303_pmic(); +#endif mfio = 0; wait_us(300); @@ -946,34 +1139,24 @@ pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]); #endif -//#if defined(MAXM86146_CFG) || defined(MAXM86161_CFG) -#if 0 // raw 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.10 accel Status: %x\n\r", rsp[0]); + pc.printf("raw1.4 Status: %x\n\r", rsp[0]); // raw enable AFE -// cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; +// cmd[0] = 0x44; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; // sh_i2c.write(SH_ADDR, cmd, 4); 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] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00; +// cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00; // sh_i2c.write(SH_ADDR, cmd, 9); mfio = 1; thread_sleep_for(465); 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.11 afe en Status: %x\n\r", rsp[0]); -#else - cmd[0] = 0x44; cmd[1] = 0xFF; cmd[2] = 0x02; cmd[3] = 0x04; cmd[4] = 0x01; cmd[5] = 0x00; cmd[6] = 0x00; cmd[7] = 0x01; cmd[8] = 0x00; - sh_i2c.write(SH_ADDR, cmd, 9); - mfio = 1; thread_sleep_for(465); 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.10/11 accel, afe en Status: %x\n\r", rsp[0]); -#endif + pc.printf("raw1.6 Status: %x\n\r", rsp[0]); /// raw 1.20 AFE part id cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF; @@ -990,7 +1173,7 @@ mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); pc.printf("1.7 Who Status: %x %x\n\r", rsp[0], rsp[1]); -// raw1.8 sample rate +// raw1.8 sample rate #if RAW_HZ == 25 cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x00; // set AFE reg 0x12 to 25 Hz, ave 1 #elif RAW_HZ == 50 @@ -1076,289 +1259,15 @@ mfio = 1; mfio = 0; wait_us(300); pc.printf("Seq cntrl3 Status: %x\n\r", rsp[0]); #endif +set_reg_opt_validation(); mfio = 1; } - - -void set_reg_opt_validation(void) { - char cmd[16]; - char rsp[32]; - - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x11; 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("wr afe reg Status: %x\n\r", rsp[0]); - - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x12; cmd[3] = 0x30; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x13; cmd[3] = 0xC0; - 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("wr afe reg Status: %x\n\r", rsp[0]); - -#if 1 - // set seq1 reg - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x20; cmd[3] = 0x21; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // set seq2 reg - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x21; cmd[3] = 0x03; - 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("wr afe reg Status: %x\n\r", rsp[0]); -#endif - // always set seq3 reg to none - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x22; 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("wr afe reg Status: %x\n\r", rsp[0]); - - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x09; cmd[3] = 0x7D; - 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("wr afe reg Status: %x\n\r", rsp[0]); - -#if defined(MAXM86161_OPT_VALIDATION_GRN) - // Set Green current to 1uA, 10uA or 30uA - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xA7; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set IR current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set Red current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); -#endif -#if defined(MAXM86161_OPT_VALIDATION_IR) - // Set Green current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set IR current to 1uA, 10uA or 30uA - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xA7; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set Red current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); -#endif - -#if defined(MAXM86161_OPT_VALIDATION_RED) - // Set Green current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set IR current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0x0; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set Red current to 1uA, 10uA or 30uA - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xA7; - 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("wr afe reg Status: %x\n\r", rsp[0]); - -#endif -#if defined(MAXM86161_OPT_VALIDATION_XTALK) - // Set Green current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x23; cmd[3] = 0xFF; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set IR current to 1uA, 10uA or 30uA - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x24; cmd[3] = 0xFF; - 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("wr afe reg Status: %x\n\r", rsp[0]); - - // Set Red current - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x25; cmd[3] = 0xFF; - 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("wr afe reg Status: %x\n\r", rsp[0]); -#endif - - // configure LED Range - cmd[0] = 0x40; cmd[1] = 0x00; cmd[2] = 0x2A; 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("wr afe reg Status: %x\n\r", rsp[0]); - - -} - - -/*****************************************************************************/ -// init_sh_opt_validation Mode1 optical validation for MAXM86161 -/*****************************************************************************/ -void init_sh_opt_validation(void) { - char cmd[16]; - char rsp[32]; - - reset_sh(); - - mfio = 0;wait_us(300); -//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.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); - sh_i2c.read(SH_ADDR, rsp, 4); - mfio = 1; mfio = 0; wait_us(300); - pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]); - -// Sensor Data only - cmd[0] = 0x10; cmd[1] = 0x00; 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("Sensor data Status: %x\n\r", rsp[0]); - -// HRM, 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("HR, SPO2 Status: %x\n\r", rsp[0]); -// Disable AEC - cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; 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("Disable AEC Status: %x\n\r", rsp[0]); -// Disable Auto PD - 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("Disable Auto PD Status: %x\n\r", rsp[0]); -// Disable SCD - 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("Disable SCD Status: %x\n\r", rsp[0]); - - -// Enable Algo, normal report - cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01; - sh_i2c.write(SH_ADDR, cmd, 4); - mfio = 1; thread_sleep_for(465); mfio = 0; wait_us(300); - sh_i2c.read(SH_ADDR, rsp, 1); - mfio = 1; mfio = 0; wait_us(300); - pc.printf("Disable SCD Status: %x\n\r", rsp[0]); - -#if 1 -//1.31 rd 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; mfio = 0; wait_us(300); - pc.printf("1.31 part id afe %x %x\n\r", rsp[0], rsp[1]); -//1.32 rd accel who - 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; mfio = 0; wait_us(300); - pc.printf("1.32 who accel %x %x\n\r", rsp[0], rsp[1]); -#endif - - set_reg_opt_validation(); - -mfio = 1; -} /*****************************************************************************/ // main /*****************************************************************************/ int main() { - char cmd[16]; - char rsp[32]; sh_i2c.frequency(400000); int32_t ledcnt = 0; rLED = LED_OFF; gLED = LED_ON; bLED = LED_OFF; @@ -1367,7 +1276,6 @@ #if 0 // test disable algo char cmd[8]; char rsp[256]; - // 3.1 Disable algo mfio = 1; mfio = 0; wait_us(300); cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x00; @@ -1381,8 +1289,6 @@ //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS); /* set timer for one second */ #ifdef RAW init_sh_raw(); -#elif defined(MAXM86161_OPT_VALIDATION_RED) || defined(MAXM86161_OPT_VALIDATION_IR) || defined(MAXM86161_OPT_VALIDATION_GRN) - init_sh_opt_validation(); #else init_sh_algo(); #endif @@ -1392,7 +1298,7 @@ Timer tmr1; while (1) { tmr1.start(); -#if defined(RAW) +#if defined(RAW) #if RAW_HZ == 25 if (tmr1.read_ms() >= 40) { #elif RAW_HZ == 50 @@ -1421,7 +1327,6 @@ #endif tmr1.reset(); read_sh_fifo(); - if ((ledcnt++ % 50) == 0) gLED = !gLED; }