MAX32620HSP ECG with lead off detection

Dependencies:   mbed HSP_ECG MAX14720 USBDevice

Revision:
0:9ead5978d784
Child:
1:8b09f627a713
diff -r 000000000000 -r 9ead5978d784 main.cpp
--- /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);            
+        }
+    }
+}
+