Ahmad Alkaff / Mbed 2 deprecated CS3237

Dependencies:   mbed

Committer:
AhmadAlkaff
Date:
Wed Nov 13 11:10:03 2019 +0000
Revision:
13:0f663ca63342
Parent:
12:2ad10c36f820
Reorganize Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmadAlkaff 0:7b5d37ca532f 1 #include "mbed.h"
AhmadAlkaff 1:e4a32b4163f2 2 #include "LIS2DH.h"
AhmadAlkaff 0:7b5d37ca532f 3 #include "MAX30001.h"
AhmadAlkaff 0:7b5d37ca532f 4 #include "System.h"
AhmadAlkaff 13:0f663ca63342 5 #include "USBSerial.h"
socrj 7:188bf08cfb44 6
AhmadAlkaff 13:0f663ca63342 7 /******************************************************************************/
AhmadAlkaff 13:0f663ca63342 8 #define LIS2DH_I2C_SLAVE_ADDR (0x32)
AhmadAlkaff 0:7b5d37ca532f 9
AhmadAlkaff 0:7b5d37ca532f 10 // Settings for ECG Initialization
AhmadAlkaff 0:7b5d37ca532f 11 #define En_ecg 0x01
AhmadAlkaff 0:7b5d37ca532f 12 #define Openp 0x00
AhmadAlkaff 0:7b5d37ca532f 13 #define Openn 0x00
AhmadAlkaff 0:7b5d37ca532f 14 #define Pol 0x00
AhmadAlkaff 0:7b5d37ca532f 15 #define Calp_sel 0x00
AhmadAlkaff 0:7b5d37ca532f 16 #define Caln_sel 0x00
AhmadAlkaff 0:7b5d37ca532f 17 #define E_fit 0x0F
socrj 7:188bf08cfb44 18 #define Rate 0x00
AhmadAlkaff 0:7b5d37ca532f 19 #define Gain 0x00
AhmadAlkaff 0:7b5d37ca532f 20 #define Dhpf 0x01
AhmadAlkaff 0:7b5d37ca532f 21 #define Dlpf 0x01
AhmadAlkaff 0:7b5d37ca532f 22
AhmadAlkaff 0:7b5d37ca532f 23 // Settings for ECG RtoR
AhmadAlkaff 0:7b5d37ca532f 24 #define En_rtor 0x01
AhmadAlkaff 0:7b5d37ca532f 25 #define Wndw 0x03
AhmadAlkaff 0:7b5d37ca532f 26 #define Gain1 0x0f
AhmadAlkaff 0:7b5d37ca532f 27 #define Pavg 0x02
AhmadAlkaff 0:7b5d37ca532f 28 #define Ptsf 0x03
AhmadAlkaff 0:7b5d37ca532f 29 #define Hoff 0x20
AhmadAlkaff 0:7b5d37ca532f 30 #define Ravg 0x02
AhmadAlkaff 0:7b5d37ca532f 31 #define Rhsf 0x04
AhmadAlkaff 0:7b5d37ca532f 32 #define Clr_rrint 0x01
AhmadAlkaff 0:7b5d37ca532f 33
AhmadAlkaff 13:0f663ca63342 34 // Define with Maxim VID and a Maxim assigned PID, set to version 0x0001 and
AhmadAlkaff 13:0f663ca63342 35 // non-blocking
AhmadAlkaff 0:7b5d37ca532f 36 USBSerial usbSerial(0x0b6a, 0x0100, 0x0001, false);
AhmadAlkaff 0:7b5d37ca532f 37
AhmadAlkaff 13:0f663ca63342 38 // LIS2DH I2C Master
AhmadAlkaff 13:0f663ca63342 39 I2C i2c2(I2C2_SDA, I2C2_SCL);
AhmadAlkaff 0:7b5d37ca532f 40
AhmadAlkaff 0:7b5d37ca532f 41 // SPI Master 0 with SPI0_SS for use with MAX30001
AhmadAlkaff 0:7b5d37ca532f 42 SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS);
AhmadAlkaff 0:7b5d37ca532f 43
AhmadAlkaff 0:7b5d37ca532f 44 // Accelerometer
AhmadAlkaff 2:17d5a74fc2c4 45 LIS2DH lis2dh(&i2c2, LIS2DH_I2C_SLAVE_ADDR);
AhmadAlkaff 2:17d5a74fc2c4 46 InterruptIn lis2dh_Interrupt(P4_7);
AhmadAlkaff 0:7b5d37ca532f 47
AhmadAlkaff 0:7b5d37ca532f 48 // ECG device
AhmadAlkaff 0:7b5d37ca532f 49 MAX30001 max30001(&spi);
AhmadAlkaff 0:7b5d37ca532f 50 InterruptIn max30001_InterruptB(P3_6);
AhmadAlkaff 0:7b5d37ca532f 51 InterruptIn max30001_Interrupt2B(P4_5);
socrj 7:188bf08cfb44 52
AhmadAlkaff 0:7b5d37ca532f 53 // PWM used as fclk for the MAX30001
AhmadAlkaff 0:7b5d37ca532f 54 PwmOut pwmout(P1_7);
AhmadAlkaff 0:7b5d37ca532f 55
AhmadAlkaff 0:7b5d37ca532f 56 DigitalOut led(LED1);
AhmadAlkaff 0:7b5d37ca532f 57
AhmadAlkaff 0:7b5d37ca532f 58 // Data of sensors
AhmadAlkaff 13:0f663ca63342 59 int16_t Acc[3];
AhmadAlkaff 13:0f663ca63342 60 int32_t ECG_Raw, ECG_cumul;
AhmadAlkaff 0:7b5d37ca532f 61 double ECG_converted = 0;
AhmadAlkaff 0:7b5d37ca532f 62 uint32_t index = 0;
AhmadAlkaff 0:7b5d37ca532f 63
AhmadAlkaff 13:0f663ca63342 64 //@brief Creates a packet that will be streamed via USB Serial, the packet
AhmadAlkaff 13:0f663ca63342 65 // created will be inserted into a fifo to be streamed at a later time
AhmadAlkaff 13:0f663ca63342 66 //@param id Streaming ID
AhmadAlkaff 13:0f663ca63342 67 //@param buffer Pointer to a uint32 array that contains the data to include in
AhmadAlkaff 13:0f663ca63342 68 // the packet
AhmadAlkaff 0:7b5d37ca532f 69 //@param number Number of elements in the buffer
AhmadAlkaff 0:7b5d37ca532f 70 void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) {
AhmadAlkaff 0:7b5d37ca532f 71 int k;
AhmadAlkaff 0:7b5d37ca532f 72
AhmadAlkaff 0:7b5d37ca532f 73 if(id == MAX30001_DATA_ECG) {
AhmadAlkaff 13:0f663ca63342 74 for (k = 0; k < number; k++) {
AhmadAlkaff 0:7b5d37ca532f 75 ECG_Raw = (int32_t)(buffer[k] << 8);
AhmadAlkaff 0:7b5d37ca532f 76 ECG_Raw = ECG_Raw >> 14;
socrj 7:188bf08cfb44 77 usbSerial.printf("ECG\r\n");
socrj 7:188bf08cfb44 78 usbSerial.printf("%d\r\n", ECG_Raw);
AhmadAlkaff 0:7b5d37ca532f 79 index++;
AhmadAlkaff 0:7b5d37ca532f 80 }
AhmadAlkaff 0:7b5d37ca532f 81 }
AhmadAlkaff 0:7b5d37ca532f 82 }
AhmadAlkaff 0:7b5d37ca532f 83
AhmadAlkaff 0:7b5d37ca532f 84 int main() {
AhmadAlkaff 13:0f663ca63342 85 // Hold results for returning functions
AhmadAlkaff 0:7b5d37ca532f 86 int result;
AhmadAlkaff 0:7b5d37ca532f 87
AhmadAlkaff 0:7b5d37ca532f 88 // Interrupt priority
AhmadAlkaff 0:7b5d37ca532f 89 NVIC_SetPriority(GPIO_P0_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 90 NVIC_SetPriority(GPIO_P1_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 91 NVIC_SetPriority(GPIO_P2_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 92 NVIC_SetPriority(GPIO_P3_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 93 NVIC_SetPriority(GPIO_P4_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 94 NVIC_SetPriority(GPIO_P5_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 95 NVIC_SetPriority(GPIO_P6_IRQn, 5);
AhmadAlkaff 0:7b5d37ca532f 96 // Used by the MAX30001
AhmadAlkaff 0:7b5d37ca532f 97 NVIC_SetPriority(SPI1_IRQn, 0);
AhmadAlkaff 0:7b5d37ca532f 98
AhmadAlkaff 0:7b5d37ca532f 99 /* ECG Initialize */
AhmadAlkaff 0:7b5d37ca532f 100 max30001_InterruptB.disable_irq();
AhmadAlkaff 0:7b5d37ca532f 101 max30001_Interrupt2B.disable_irq();
AhmadAlkaff 0:7b5d37ca532f 102 max30001_InterruptB.mode(PullUp);
AhmadAlkaff 0:7b5d37ca532f 103 max30001_InterruptB.fall(&MAX30001Mid_IntB_Handler);
AhmadAlkaff 0:7b5d37ca532f 104 max30001_Interrupt2B.mode(PullUp);
AhmadAlkaff 0:7b5d37ca532f 105 max30001_Interrupt2B.fall(&MAX30001Mid_Int2B_Handler);
AhmadAlkaff 0:7b5d37ca532f 106 max30001_InterruptB.enable_irq();
AhmadAlkaff 0:7b5d37ca532f 107 max30001_Interrupt2B.enable_irq();
AhmadAlkaff 0:7b5d37ca532f 108 MAX30001_AllowInterrupts(1);
AhmadAlkaff 0:7b5d37ca532f 109 // Configuring the FCLK for the ECG, set to 32.768KHZ
AhmadAlkaff 0:7b5d37ca532f 110 pwmout.period_us(31);
AhmadAlkaff 0:7b5d37ca532f 111 pwmout.write(0.5); // 0-1 is 0-100%, 0.5 = 50% duty cycle.
AhmadAlkaff 0:7b5d37ca532f 112 max30001.max30001_sw_rst(); // Do a software reset of the MAX30001
AhmadAlkaff 0:7b5d37ca532f 113 max30001.max30001_INT_assignment(
AhmadAlkaff 0:7b5d37ca532f 114 MAX30001::MAX30001_INT_B, // en_enint_loc
AhmadAlkaff 0:7b5d37ca532f 115 MAX30001::MAX30001_NO_INT, // en_eovf_loc
AhmadAlkaff 0:7b5d37ca532f 116 MAX30001::MAX30001_NO_INT, // en_fstint_loc
AhmadAlkaff 0:7b5d37ca532f 117
AhmadAlkaff 0:7b5d37ca532f 118 MAX30001::MAX30001_INT_2B, // en_dcloffint_loc
AhmadAlkaff 0:7b5d37ca532f 119 MAX30001::MAX30001_INT_B, // en_bint_loc
AhmadAlkaff 0:7b5d37ca532f 120 MAX30001::MAX30001_NO_INT, // en_bovf_loc
AhmadAlkaff 0:7b5d37ca532f 121
AhmadAlkaff 0:7b5d37ca532f 122 MAX30001::MAX30001_INT_2B, // en_bover_loc
AhmadAlkaff 0:7b5d37ca532f 123 MAX30001::MAX30001_INT_2B, // en_bundr_loc
AhmadAlkaff 0:7b5d37ca532f 124 MAX30001::MAX30001_NO_INT, // en_bcgmon_loc
AhmadAlkaff 0:7b5d37ca532f 125
AhmadAlkaff 0:7b5d37ca532f 126 MAX30001::MAX30001_INT_B, // en_pint_loc
AhmadAlkaff 0:7b5d37ca532f 127 MAX30001::MAX30001_NO_INT, // en_povf_loc,
AhmadAlkaff 0:7b5d37ca532f 128 MAX30001::MAX30001_NO_INT, // en_pedge_loc
AhmadAlkaff 0:7b5d37ca532f 129
AhmadAlkaff 0:7b5d37ca532f 130 MAX30001::MAX30001_INT_2B, // en_lonint_loc
AhmadAlkaff 0:7b5d37ca532f 131 MAX30001::MAX30001_INT_B, // en_rrint_loc
AhmadAlkaff 0:7b5d37ca532f 132 MAX30001::MAX30001_NO_INT, // en_samp_loc
AhmadAlkaff 0:7b5d37ca532f 133
AhmadAlkaff 0:7b5d37ca532f 134 MAX30001::MAX30001_INT_ODNR, // intb_Type
AhmadAlkaff 0:7b5d37ca532f 135 MAX30001::MAX30001_INT_ODNR); // int2b_Type
socrj 7:188bf08cfb44 136
socrj 7:188bf08cfb44 137 lis2dh.initStart(LIS2DH_DATARATE_50HZ, LIS2DH_FIFO_SIZE);
AhmadAlkaff 13:0f663ca63342 138 max30001.max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel,
AhmadAlkaff 13:0f663ca63342 139 Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf);
AhmadAlkaff 0:7b5d37ca532f 140 max30001.max30001_synch();
AhmadAlkaff 0:7b5d37ca532f 141 max30001.onDataAvailable(&StreamPacketUint32_ex);
socrj 7:188bf08cfb44 142
socrj 7:188bf08cfb44 143 while (1){
socrj 7:188bf08cfb44 144 int a;
AhmadAlkaff 13:0f663ca63342 145 lis2dh.get_motion_fifo(&Acc[0], &Acc[1], &Acc[2]);
socrj 7:188bf08cfb44 146 usbSerial.printf("ACC\r\n");
AhmadAlkaff 13:0f663ca63342 147 usbSerial.printf("X %d\r\nY %d\r\nZ %d\r\n", Acc[0], Acc[1], Acc[2]);
socrj 7:188bf08cfb44 148 }
AhmadAlkaff 0:7b5d37ca532f 149 }