![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Mode1 Optical Validation
Diff: main.cpp
- Revision:
- 4:4f1e9439f048
- Parent:
- 3:da975696b936
- Child:
- 5:7f5a012747a5
--- a/main.cpp Fri Mar 19 00:14:42 2021 +0000 +++ b/main.cpp Wed Mar 24 01:32:34 2021 +0000 @@ -34,8 +34,19 @@ #include "mbed.h" #include "platform/mbed_thread.h" #include "mbed.h" - -#define MAXM86146_CFG 1 +/****************************************************************************** +* Warning, if using the either +* MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86146EVSYS sensor brd or +* MAX32630FTHR+MAXM86161_ADPTER_REVB+MAXM86161EVSYS sensor brd, +* The VLED is connected to USB power which is noisy. The VLED should be +* connected to a regulated power supply if you are testing accuracy. +******************************************************************************* +*/ +/****************************************************************************** +* Tera Term output is set to 115200 baud rate. +******************************************************************************* +*/ +//#define MAXM86146_CFG 1 #ifdef MAXM86146_CFG #define PPG_SZ 36 //maxm86146 #else @@ -79,7 +90,8 @@ char rsp[3000]; int32_t ppg[12]; int32_t accel[3]; - int32_t status, opmode, hr, hr_conf, ibi, ibi_conf, act, r, spo2, spo2_conf, scd; + int32_t status, opmode, hr, hr_conf, ibi, ibi_conf, act, r, spo2, spo2_conf; + int32_t spo2_compl, spo2_lo, spo2_mo, spo2_lopi, spo2_unrel, spo2_state, ibi_offset, scd; int32_t scnt = 0; int32_t ptr = 0; int32_t sptr = 0; @@ -87,16 +99,14 @@ Time_to_Read_PPG = 0; #if 0 // 2.1 - cmd[0] = 0x00; - cmd[1] = 0x00; + cmd[0] = 0x00; cmd[1] = 0x00; i2c.write(addr, cmd, 2); wait_us(100); i2c.read(addr, rsp, 2); // pc.printf("2.1 Status: %x %x\n\r", rsp[0], rsp[1]); #endif // 2.2 - cmd[0] = 0x12; - cmd[1] = 0x00; + cmd[0] = 0x12; cmd[1] = 0x00; i2c.write(addr, cmd, 2); wait_us(100); i2c.read(addr, rsp, 2); @@ -106,8 +116,7 @@ // pc.printf("num smpls %d \n\r", samples); scnt = rsp[1]; // 2.3 - cmd[0] = 0x12; - cmd[1] = 0x01; + cmd[0] = 0x12; cmd[1] = 0x01; i2c.write(addr, cmd, 2); wait_us(100); // thread_sleep_for(1); @@ -124,7 +133,10 @@ ppg[1] = (rsp[ptr+3] << 16) | (rsp[ptr+4] << 8) | (rsp[ptr+5]); ppg[2] = (rsp[ptr+6] << 16) | (rsp[ptr+7] << 8) | (rsp[ptr+8]); ppg[3] = (rsp[ptr+9] << 16) | (rsp[ptr+10] << 8) | (rsp[ptr+11]); + ppg[4] = (rsp[ptr+12] << 16) | (rsp[ptr+13] << 8) | (rsp[ptr+14]); + 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]); +// pc.printf("%d,%d,", ppg[4], ppg[5]); ptr = sptr + SENSOR_SZ; #endif // pc.printf("ptr %d ttlsiz %d ", ptr, TTL_SZ); @@ -132,16 +144,39 @@ hr = (rsp[ptr+1] << 8) + rsp[ptr+2]; hr_conf = rsp[ptr+3]; ibi = rsp[ptr+4]; + ibi_conf = (rsp[ptr+5] << 8) + rsp[ptr+6]; act = rsp[ptr+7]; r = (rsp[ptr+8] << 8) + rsp[ptr+9]; spo2_conf = rsp[ptr+10]; + spo2 = (rsp[ptr+11] << 8) + rsp[ptr+12]; + spo2_compl = rsp[ptr+13]; + spo2_lo = rsp[ptr+14]; + spo2_mo = rsp[ptr+15]; + + spo2_lopi = rsp[ptr+16]; + spo2_unrel = rsp[ptr+17]; + spo2_state = rsp[ptr+18]; scd = rsp[ptr+19]; - sptr += (TTL_SZ); + ibi_offset = rsp[ptr+20]; - pc.printf("%d,%d,%d,%d,%d", hr, hr_conf, spo2, spo2_conf, scd); + sptr += (TTL_SZ); +#if 0 + pc.printf("%d,%d,%d,%d,", opmode, hr, hr_conf, ibi); + pc.printf("%d,%d,%d,%d,", ibi_conf, act, r, spo2_conf); + pc.printf("%d,%d,%d,%d,", spo2, spo2_compl, spo2_lo, spo2_mo); + pc.printf("%d,%d,%d,%d,", spo2_lopi,spo2_unrel, spo2_state, scd); + pc.printf("%d,", ibi_offset); +#else + pc.printf("%d,%d,", hr, hr_conf); + pc.printf("%d,%d,", spo2, spo2_conf); + pc.printf("%d,", spo2_lo); + pc.printf("%d,%d,", spo2_unrel, scd); +#endif + + pc.printf("\n\r"); } mfio = 1; @@ -154,9 +189,7 @@ char rsp[256]; int32_t ppg[12]; - rLED = LED_OFF; - gLED = LED_ON; - bLED = LED_OFF; + rLED = LED_OFF; gLED = LED_ON; bLED = LED_OFF; Ticker ticker; // calls a callback repeatedly with a timeout //ticker.attach(callback(&blink_timer), BLINKING_RATE_MS); /* set timer for one second */ @@ -168,16 +201,16 @@ thread_sleep_for(1500); mfio = 0; wait_us(300); - cmd[0] = 0x02; - cmd[1] = 0x00; + +//read operating mode + cmd[0] = 0x02; cmd[1] = 0x00; i2c.write(addr, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 2); mfio = 1; mfio = 0; wait_us(300); pc.printf("02 00 Status, Operating Mode: %x %x\n\r", rsp[0], rsp[1]); -// rd ver - cmd[0] = 0xFF; - cmd[1] = 0x03; +//1.11 rd ver + cmd[0] = 0xFF; cmd[1] = 0x03; i2c.write(addr, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); wait_us(300); @@ -186,12 +219,13 @@ pc.printf("Ver: %d %d %d %d\n\r", rsp[0], rsp[1], rsp[2], rsp[3]); // 1.3 sensor and algo data - cmd[0] = 0x10; - cmd[1] = 0x00; + cmd[0] = 0x10; cmd[1] = 0x00; #ifdef ALGO_ONLY cmd[2] = 0x02; // algo data + pc.printf("algo only \n\r"); #else cmd[2] = 0x03; // sensor + algo data + pc.printf("sens+algo \n\r"); #endif i2c.write(addr, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); @@ -199,100 +233,72 @@ mfio = 1; mfio = 0; wait_us(300); pc.printf("1.3 Status: %x\n\r", rsp[0]); // 1.7 cont hr, spo2 - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x0A; - cmd[3] = 0x00; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00; i2c.write(addr, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("1.7 Status: %x\n\r", rsp[0]); -//1.11 rd AFE part id - cmd[0] = 0x41; - cmd[1] = 0x00; - cmd[2] = 0xFF; - i2c.write(addr, cmd, 3); +// 1.8 AEC enable (default) + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01; + i2c.write(addr, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 2); + i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.11 part id afe %x %x\n\r", rsp[0], rsp[1]); -//1.13 rd accel who - cmd[0] = 0x41; - cmd[1] = 0x04; - cmd[2] = 0x0F; - i2c.write(addr, cmd, 3); + pc.printf("1.8 Status: %x\n\r", rsp[0]); +// 1.9 auto PD (default + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x12; cmd[3] = 0x01; + i2c.write(addr, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 2); + i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); - pc.printf("1.12 who accel %x %x\n\r", rsp[0], rsp[1]); + pc.printf("1.9 Status: %x\n\r", rsp[0]); +// 1.10 SCD (default) + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01; + i2c.write(addr, cmd, 4); + mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); + i2c.read(addr, rsp, 1); + mfio = 1; mfio = 0; wait_us(300); + pc.printf("1.7 Status: %x\n\r", rsp[0]); #ifdef MAXM86146_CFG -#if 1 //1.20 Sec 4.1 map leds to slots for MAXM86146 - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x19; - cmd[3] = 0x13; - cmd[4] = 0x56; - cmd[5] = 0x00; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x13; cmd[4] = 0x56; cmd[5] = 0x00; i2c.write(addr, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map leds to slots%x\n\r", rsp[0]); //1.21 map HR inputs to slots - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x17; - cmd[3] = 0x00; - cmd[4] = 0x11; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x11; i2c.write(addr, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map HR to slots/PDs %x\n\r", rsp[0]); //1.22 map SpO2 inputs to slots - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x18; - cmd[3] = 0x30; - cmd[4] = 0x20; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x30; cmd[4] = 0x20; i2c.write(addr, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]); -#endif #if 0 //1.20 Sec 4.1 map leds to slots for MAXM86146 - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x19; - cmd[3] = 0x15; - cmd[4] = 0x60; - cmd[5] = 0x00; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x19; cmd[3] = 0x15; cmd[4] = 0x60; cmd[5] = 0x00; i2c.write(addr, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map leds to slots%x\n\r", rsp[0]); //1.21 map HR inputs to slots - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x17; - cmd[3] = 0x00; - cmd[4] = 0x01; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x17; cmd[3] = 0x00; cmd[4] = 0x01; i2c.write(addr, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map HR to slots/PDs %x\n\r", rsp[0]); //1.22 map SpO2 inputs to slots - cmd[0] = 0x50; - cmd[1] = 0x07; - cmd[2] = 0x18; - cmd[3] = 0x20; - cmd[4] = 0x10; + cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x18; cmd[3] = 0x20; cmd[4] = 0x10; i2c.write(addr, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); i2c.read(addr, rsp, 1); @@ -301,21 +307,36 @@ #endif #endif // MAXM86146_CFG -// 1.3 - cmd[0] = 0x52; - cmd[1] = 0x07; - cmd[2] = 0x01; +// 1.3 Enable HR, SpO2 algo + cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01; i2c.write(addr, cmd, 3); thread_sleep_for(465); i2c.read(addr, rsp, 1); pc.printf("1.14 status: %x\n\r", rsp[0]); mfio = 1; +#if 1 +//1.31 rd AFE part id + cmd[0] = 0x41; cmd[1] = 0x00; cmd[2] = 0xFF; + i2c.write(addr, cmd, 3); + mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); + i2c.read(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; + i2c.write(addr, cmd, 3); + mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); + i2c.read(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 + ticker.attach(callback(&fifo_timer), 0.040f); // Timer tmr1; while (1) { + read_ppg(); if (Time_to_Read_PPG) { - read_ppg(); } } } \ No newline at end of file