MAX32620HSP ECG with lead off detection
Dependencies: mbed HSP_ECG MAX14720 USBDevice
Diff: main.cpp
- Revision:
- 0:9ead5978d784
- Child:
- 1:8b09f627a713
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Mar 28 08:10:23 2019 +0000 @@ -0,0 +1,215 @@ + #include "mbed.h" + #include "MAX14720.h" + #include "MAX30001.h" + #include "MAX30101.h" + #include "System.h" + #include "USBSerial.h" + + /************************************************************************************************************************************/ + /// define the HVOUT Boost Voltage default for the MAX14720 PMIC + #define HVOUT_VOLTAGE 4500 // set to 4500 mV + + /// define all I2C addresses + #define MAX14720_I2C_SLAVE_ADDR (0x54) + #define MAX30101_I2C_SLAVE_ADDR (0xAE) + + // Settings for ECG Initialization + #define En_ecg 0x01 + #define Openp 0x00 + #define Openn 0x00 + #define Pol 0x00 + #define Calp_sel 0x00 + #define Caln_sel 0x00 + #define E_fit 0x0F + #define Rate 0x02 + #define Gain 0x00 + #define Dhpf 0x01 + #define Dlpf 0x01 + + // Settings for ECG RtoR + #define En_rtor 0x01 + #define Wndw 0x03 + #define Gain1 0x0f + #define Pavg 0x02 + #define Ptsf 0x03 + #define Hoff 0x20 + #define Ravg 0x02 + #define Rhsf 0x04 + #define Clr_rrint 0x01 + + // Settings for Lead Detection + #define En_dcloff 0x01 + #define Ipol 0x00 + #define Imag 0x00 + #define Vth 0x00 + + // Settings for the HR initialization + #define FIFO_WATERLEVEL_MARK 15 + #define SAMPLE_AVG 2 + #define SAMPLE_RATE 1 + #define PULSE_WIDTH 2 + #define RED_LED_CURRENT 0x1F + #define IR_LED_CURRENT 0X1F + + /// Define with Maxim VID and a Maxim assigned PID, set to version 0x0001 and non-blocking + USBSerial usbSerial(0x0b6a, 0x0100, 0x0001, false); + + // I2C Master 2 + I2C i2c2(I2C2_SDA, I2C2_SCL); // used by MAX14720, MAX30101, LIS2DH + + // SPI Master 0 with SPI0_SS for use with MAX30001 + SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS); // used by MAX30001 + + // PMIC + MAX14720 max14720(&i2c2, MAX14720_I2C_SLAVE_ADDR); + + // Optical Oximeter + //MAX30101 max30101(&i2c2, MAX30101_I2C_SLAVE_ADDR); + //InterruptIn max30101_Interrupt(P4_0); + + // ECG device + MAX30001 max30001(&spi); + InterruptIn max30001_InterruptB(P3_6); + InterruptIn max30001_Interrupt2B(P4_5); + + /// PWM used as fclk for the MAX30001 + PwmOut pwmout(P1_7); + + // Data of sensors + int32_t ECG_Raw; + //int32_t SpO_Raw; + uint32_t index = 0; + DigitalOut led(LED1); + + //@brief Creates a packet that will be streamed via USB Serial + //@brief the packet created will be inserted into a fifo to be streamed at a later time + //@param id Streaming ID + //@param buffer Pointer to a uint32 array that contains the data to include in the packet + //@param number Number of elements in the buffer + // + void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) { + int k; + if(id == MAX30001_DATA_ECG) + { + for (k = 0; k < number; k++) + { + ECG_Raw = (int32_t)(buffer[k] << 8); + ECG_Raw = ECG_Raw >> 14; + usbSerial.printf("%d|" , index); + usbSerial.printf("%d\r\n", ECG_Raw); + index++; + } + } + } + /*void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) { + int i; + if(id == MAX30101_OXIMETER_DATA + 2) + { + for (i = 0; i < number; i++) + { + SpO_Raw = (int32_t)(buffer[i]); + } + usbSerial.printf("%d\r\n", SpO_Raw); + } + }*/ + //****************************************************************************** + /*void MAX30101_OnInterrupt(void){ + I2CM_Init_Reset(2, 1); + }*/ + //******************************************************************************* + int main() { + // hold results for returning functions + int result; + + // initialize HVOUT on the MAX14720 PMIC + result = max14720.init(); + if (result == MAX14720_ERROR){ + printf("Error initializing MAX14720"); + } + max14720.boostEn = MAX14720::BOOST_ENABLED; + max14720.boostSetVoltage(HVOUT_VOLTAGE); + + + // This is the SpO2 mode (IR&Red LED) + /*max30101.SpO2mode_init(FIFO_WATERLEVEL_MARK, SAMPLE_AVG, SAMPLE_RATE,PULSE_WIDTH, RED_LED_CURRENT,IR_LED_CURRENT); + + // MAX30101 initialize interrupt + max30101.onInterrupt(&MAX30101_OnInterrupt); + max30101.onDataAvailable(&StreamPacketUint32_ex); + max30101_Interrupt.fall(&MAX30101MidIntHandler);*/ + + // Interrupt priority + NVIC_SetPriority(GPIO_P0_IRQn, 5); + NVIC_SetPriority(GPIO_P1_IRQn, 5); + NVIC_SetPriority(GPIO_P2_IRQn, 5); + NVIC_SetPriority(GPIO_P3_IRQn, 5); + NVIC_SetPriority(GPIO_P4_IRQn, 5); + NVIC_SetPriority(GPIO_P5_IRQn, 5); + NVIC_SetPriority(GPIO_P6_IRQn, 5); + // used by the MAX30001 + NVIC_SetPriority(SPI1_IRQn, 0); + + /* ECG Initialize */ + max30001_InterruptB.disable_irq(); + max30001_Interrupt2B.disable_irq(); + max30001_InterruptB.mode(PullUp); + max30001_InterruptB.fall(&MAX30001Mid_IntB_Handler); + max30001_Interrupt2B.mode(PullUp); + max30001_Interrupt2B.fall(&MAX30001Mid_Int2B_Handler); + max30001_InterruptB.enable_irq(); + max30001_Interrupt2B.enable_irq(); + MAX30001_AllowInterrupts(1); + // Configuring the FCLK for the ECG, set to 32.768KHZ + pwmout.period_us(31); + pwmout.write(0.5); // 0-1 is 0-100%, 0.5 = 50% duty cycle. + //max30001.max30001_RtoR_InitStart(En_rtor, Wndw, Gain1, Pavg, Ptsf, Hoff, Ravg, Rhsf, Clr_rrint); + max30001.max30001_sw_rst(); // Do a software reset of the MAX30001 + max30001.max30001_INT_assignment( + MAX30001::MAX30001_INT_B, // en_enint_loc + MAX30001::MAX30001_NO_INT, // en_eovf_loc + MAX30001::MAX30001_NO_INT, // en_fstint_loc + + MAX30001::MAX30001_INT_2B, // en_dcloffint_loc + MAX30001::MAX30001_INT_B, // en_bint_loc + MAX30001::MAX30001_NO_INT, // en_bovf_loc + + MAX30001::MAX30001_INT_2B, // en_bover_loc + MAX30001::MAX30001_INT_2B, // en_bundr_loc + MAX30001::MAX30001_NO_INT, // en_bcgmon_loc + + MAX30001::MAX30001_INT_B, // en_pint_loc + MAX30001::MAX30001_NO_INT, // en_povf_loc, + MAX30001::MAX30001_NO_INT, // en_pedge_loc + + MAX30001::MAX30001_INT_2B, // en_lonint_loc + MAX30001::MAX30001_INT_B, // en_rrint_loc + MAX30001::MAX30001_NO_INT, // en_samp_loc + + MAX30001::MAX30001_INT_ODNR, // intb_Type + MAX30001::MAX30001_INT_ODNR); // int2b_Type + + // MAX30001 initialize interrupt + max30001.max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf); + //max30001.max30001_Enable_DcLeadOFF_Init(En_dcloff, Ipol, Imag, Vth); + //max30001.max30001_FIFO_LeadONOff_Read(); + max30001.max30001_synch(); + max30001.onDataAvailable(&StreamPacketUint32_ex); + int a; + while (1) + { + a = usbSerial._getc(); + if (a == 65) + { + max30001.max30001_Stop_ECG(); + index = 0; + } + if (a == 97) + { + //max30001.max30001_sw_rst(); + max30001.max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf); + //max30001.max30001_synch(); + //max30001.onDataAvailable(&StreamPacketUint32_ex); + } + } +} +