David Jung
/
MAX32664C_MAXM86146_Mode1_Optical
Mode1 Optical Validation
Diff: main.cpp
- Revision:
- 6:e1b7190d6cb5
- Parent:
- 5:7f5a012747a5
- Child:
- 7:23b067817ab8
--- a/main.cpp Thu Mar 25 04:08:19 2021 +0000 +++ b/main.cpp Fri Mar 26 00:41:20 2021 +0000 @@ -44,14 +44,22 @@ */ /****************************************************************************** * Tera Term output is set to 115200 baud rate. -* ver: 210324 +* ver: 210325 ******************************************************************************/ -//#define MAXM86146_CFG 1 // tested on MAXM86146+MAX32630FTHR -//#define HSP2 // MAXREFDES103 not debugged yet -#ifdef HSP2 +/*****************************************************************************/ +// define one and only one of the following three platforms +//#define MAXM86146_CFG 1 // tested on MAXM86146EVSYS_sensorBrd+MAXM86161_ADAPTER_REVB+MAX32630FTHR +#define MAXREFDES103_CFG // tested on MAXREFDES103 +//#define MAX86161_CFG 1 +/*****************************************************************************/ + +#define ALGO_ONLY 1 // define this if you only want the algo data, comment out if you want raw sensor+algo data + + +#ifdef MAXREFDES103_CFG #include "MAX20303.h" -I2C i2c_pmic(P5_7, P6_0); +I2C sh_i2c_pmic(P5_7, P6_0); #endif #ifdef MAXM86146_CFG @@ -63,7 +71,6 @@ #define SENSOR_SZ (PPG_SZ+ACCEL_SZ) //#define ALGO_SZ 20 // 24 bytes is the algo normal size for 3x.12.0 #define ALGO_SZ 24 // 24 bytes is the algo normal size for 3x.13.x -//#define ALGO_ONLY 1 #ifdef ALGO_ONLY #define TTL_SZ (ALGO_SZ) #else @@ -81,10 +88,12 @@ #define MFIO_PIN P5_4 DigitalOut rst(RST_PIN, PullUp); DigitalOut mfio(MFIO_PIN, PullUp); -I2C i2c(P3_4, P3_5); +I2C sh_i2c(P3_4, P3_5); + +//#define thread_sleep_for(x) wait_ms(x) // for older versions of mbed -const int addr = 0xAA;//0x55; +const int SH_ADDR = 0xAA;//0x55; int32_t Time_to_Read_PPG = 0; #define BLINKING_RATE_MS 1000ms @@ -111,16 +120,16 @@ #if 0 // 2.1 cmd[0] = 0x00; cmd[1] = 0x00; - i2c.write(addr, cmd, 2); + sh_i2c.write(SH_ADDR, cmd, 2); wait_us(100); - i2c.read(addr, rsp, 2); + sh_i2c.read(SH_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; - i2c.write(addr, cmd, 2); + sh_i2c.write(SH_ADDR, cmd, 2); wait_us(100); - i2c.read(addr, rsp, 2); + sh_i2c.read(SH_ADDR, rsp, 2); // pc.printf("2.2 Status: %x %x\n\r", rsp[0], rsp[1]); samples = rsp[1]; // pc.printf("num samples %d, (num*ttl)+1 %d\n\r", rsp[1], TTL_SZ*samples+1); @@ -128,10 +137,10 @@ scnt = rsp[1]; // 2.3 cmd[0] = 0x12; cmd[1] = 0x01; - i2c.write(addr, cmd, 2); + sh_i2c.write(SH_ADDR, cmd, 2); wait_us(100); // thread_sleep_for(1); - i2c.read(addr, rsp, 1+(TTL_SZ*samples)); + sh_i2c.read(SH_ADDR, rsp, 1+(TTL_SZ*samples)); status = rsp[0]; sptr = 1; @@ -198,13 +207,13 @@ mfio = 1; } -#ifdef HSP2 -void init_pmic(void) { +#ifdef MAXREFDES103_CFG +void init_max20303_pmic(void) { /* Wait for pmic to settle down */ thread_sleep_for(800); //set_time(1544787300); // Set RTC time to Wed, 28 Oct 2009 11:35:37 - MAX20303 max20303(&i2c); + MAX20303 max20303(&sh_i2c); /*Set LDO1 to 1.8v*/ max20303.LDO1Config(); @@ -214,25 +223,22 @@ //max20303.BoostEnable(); max20303.BuckBoostEnable(); - max20303.led0on(0); max20303.led1on(0); max20303.led2on(0); /* Wait for pmic to settle down */ thread_sleep_for(200); - + } -#endif // HSP2 +#endif // MAXREFDES103_CFG int main() { - i2c.frequency(400000); + sh_i2c.frequency(400000); char cmd[8], i, j; char rsp[256]; int32_t ppg[12]; -#ifdef HSP2 - init_pmic(); -#endif + int32_t ledcnt = 0; 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 */ @@ -246,19 +252,21 @@ mfio = 0; wait_us(300); +#ifdef MAXREFDES103_CFG + init_max20303_pmic(); +#endif //read operating mode cmd[0] = 0x02; cmd[1] = 0x00; - i2c.write(addr, cmd, 2); + sh_i2c.write(SH_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]); + 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 cmd[0] = 0xFF; cmd[1] = 0x03; - i2c.write(addr, cmd, 2); + sh_i2c.write(SH_ADDR, cmd, 2); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - wait_us(300); - i2c.read(addr, rsp, 4); + 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]); @@ -271,81 +279,81 @@ cmd[2] = 0x03; // sensor + algo data pc.printf("sens+algo \n\r"); #endif - i2c.write(addr, cmd, 3); + sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + 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.7 cont hr, spo2 cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0A; cmd[3] = 0x00; - i2c.write(addr, cmd, 4); + sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("1.7 Status: %x\n\r", rsp[0]); // 1.8 AEC enable (default) cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0B; cmd[3] = 0x01; - i2c.write(addr, cmd, 4); + sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); 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); + sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + 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) cmd[0] = 0x50; cmd[1] = 0x07; cmd[2] = 0x0C; cmd[3] = 0x01; - i2c.write(addr, cmd, 4); + sh_i2c.write(SH_ADDR, cmd, 4); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("1.7 Status: %x\n\r", rsp[0]); #ifdef MAXM86146_CFG //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; - i2c.write(addr, cmd, 6); + sh_i2c.write(SH_ADDR, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_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; - i2c.write(addr, cmd, 5); + sh_i2c.write(SH_ADDR, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_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; - i2c.write(addr, cmd, 5); + sh_i2c.write(SH_ADDR, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]); #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; - i2c.write(addr, cmd, 6); + sh_i2c.write(SH_ADDR, cmd, 6); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_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; - i2c.write(addr, cmd, 5); + sh_i2c.write(SH_ADDR, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_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; - i2c.write(addr, cmd, 5); + sh_i2c.write(SH_ADDR, cmd, 5); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_ADDR, rsp, 1); mfio = 1; mfio = 0; wait_us(300); pc.printf("map SpO2 to slots/PDs %x\n\r", rsp[0]); #endif @@ -353,34 +361,47 @@ // 1.3 Enable HR, SpO2 algo cmd[0] = 0x52; cmd[1] = 0x07; cmd[2] = 0x01; - i2c.write(addr, cmd, 3); + sh_i2c.write(SH_ADDR, cmd, 3); thread_sleep_for(465); - i2c.read(addr, rsp, 1); + sh_i2c.read(SH_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); + sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 2); + 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; - i2c.write(addr, cmd, 3); + sh_i2c.write(SH_ADDR, cmd, 3); mfio = 1; thread_sleep_for(2); mfio = 0; wait_us(300); - i2c.read(addr, rsp, 2); + 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 - ticker.attach(callback(&fifo_timer), 0.040f); -// Timer tmr1; +#if defined(MAXREFDES103_CFG) || defined(MAXM86161_CFG) + Timer tmr1; while (1) { + tmr1.start(); + if (tmr1.read_ms() > 40) { read_ppg(); - if (Time_to_Read_PPG) { + if (ledcnt++ % 50) + gLED = !gLED; } } +#else + ticker.attach(callback(&fifo_timer), 0.040f); + while (1) { + if (Time_to_Read_PPG) { + read_ppg(); + if (ledcnt++ % 50) + gLED = !gLED; + } + } +#endif } \ No newline at end of file