none

Dependencies:   mbed

Committer:
qiaolimaxim
Date:
Fri Apr 12 06:56:27 2019 +0000
Revision:
2:7d005ac4146f
max86150

Who changed what in which revision?

UserRevisionLine numberNew contents of line
qiaolimaxim 2:7d005ac4146f 1 #include "mbed.h"
qiaolimaxim 2:7d005ac4146f 2 #include "max86150.h"
qiaolimaxim 2:7d005ac4146f 3 #include "i2c_functions.h"
qiaolimaxim 2:7d005ac4146f 4
qiaolimaxim 2:7d005ac4146f 5 DigitalOut myled(P7_1);
qiaolimaxim 2:7d005ac4146f 6 Serial myPC(USBTX, USBRX); // Initiating Serial Console communication
qiaolimaxim 2:7d005ac4146f 7 void device_data_read(void);
qiaolimaxim 2:7d005ac4146f 8
qiaolimaxim 2:7d005ac4146f 9
qiaolimaxim 2:7d005ac4146f 10 int main()
qiaolimaxim 2:7d005ac4146f 11 {
qiaolimaxim 2:7d005ac4146f 12 int i=0, j=0;
qiaolimaxim 2:7d005ac4146f 13
qiaolimaxim 2:7d005ac4146f 14 i2c_freq(100000);
qiaolimaxim 2:7d005ac4146f 15 myPC.baud(57600);
qiaolimaxim 2:7d005ac4146f 16
qiaolimaxim 2:7d005ac4146f 17 while (i++<1) {
qiaolimaxim 2:7d005ac4146f 18 myled = !myled;
qiaolimaxim 2:7d005ac4146f 19 wait(1);
qiaolimaxim 2:7d005ac4146f 20
qiaolimaxim 2:7d005ac4146f 21 char data_read[9];
qiaolimaxim 2:7d005ac4146f 22 char data_write[2];
qiaolimaxim 2:7d005ac4146f 23
qiaolimaxim 2:7d005ac4146f 24 // enable()
qiaolimaxim 2:7d005ac4146f 25 data_write[0] = 0x01;
qiaolimaxim 2:7d005ac4146f 26 i2c_write(0xBC, 0x0D, data_write,1); // reset
qiaolimaxim 2:7d005ac4146f 27 data_write[0] = 0x0C;
qiaolimaxim 2:7d005ac4146f 28 i2c_write(0xBC, 0x08, data_write,1); // FIFO roll ON
qiaolimaxim 2:7d005ac4146f 29 data_write[0] = 0x21;
qiaolimaxim 2:7d005ac4146f 30 i2c_write(0xBC, 0x09, data_write,1); // FDx
qiaolimaxim 2:7d005ac4146f 31 data_write[0] = 0x09;
qiaolimaxim 2:7d005ac4146f 32 i2c_write(0xBC, 0x0A, data_write,1); // FD3=ECG
qiaolimaxim 2:7d005ac4146f 33 data_write[0] = 0xDB;
qiaolimaxim 2:7d005ac4146f 34 i2c_write(0xBC, 0x0E, data_write,1); // PPG_ADC_RANGE PPG_SR:100SpS, PPG_LED_PW:400uS
qiaolimaxim 2:7d005ac4146f 35 data_write[0] = 0x10;
qiaolimaxim 2:7d005ac4146f 36 i2c_write(0xBC, 0x11, data_write,1); //LED current - IR
qiaolimaxim 2:7d005ac4146f 37 data_write[0] = 0x55;
qiaolimaxim 2:7d005ac4146f 38 i2c_write(0xBC, 0x12, data_write,1); //LED current - Red
qiaolimaxim 2:7d005ac4146f 39 data_write[0] = 0x10;
qiaolimaxim 2:7d005ac4146f 40 i2c_write(0xBC, 0x15, data_write,1); //Pilot_PA
qiaolimaxim 2:7d005ac4146f 41 data_write[0] = 0x04;
qiaolimaxim 2:7d005ac4146f 42 i2c_write(0xBC, 0x10, data_write,1); //PROX_INT_THRESH
qiaolimaxim 2:7d005ac4146f 43
qiaolimaxim 2:7d005ac4146f 44 data_write[0] = 0x03;
qiaolimaxim 2:7d005ac4146f 45 i2c_write(0xBC, 0x3C, data_write,1); //ECG SAMPLE RATE
qiaolimaxim 2:7d005ac4146f 46 data_write[0] = 0x0D;
qiaolimaxim 2:7d005ac4146f 47 i2c_write(0xBC, 0x3E, data_write,1); //PGA_ECG_GAIN, IA_GAIN
qiaolimaxim 2:7d005ac4146f 48
qiaolimaxim 2:7d005ac4146f 49 //data_write[0] = 0x40;
qiaolimaxim 2:7d005ac4146f 50 //i2c_write(0xBC, 0x02, data_write,1); //PPG_RDY_EN
qiaolimaxim 2:7d005ac4146f 51
qiaolimaxim 2:7d005ac4146f 52 data_write[0] = 0x10;
qiaolimaxim 2:7d005ac4146f 53 i2c_write(0xBC, 0x02, data_write,1); //[4] PROX_INT_EN
qiaolimaxim 2:7d005ac4146f 54 data_write[0] = 0x04;
qiaolimaxim 2:7d005ac4146f 55 i2c_write(0xBC, 0x03, data_write,1); //ECG_RDY_INT_EN
qiaolimaxim 2:7d005ac4146f 56 data_write[0] = 0x04;
qiaolimaxim 2:7d005ac4146f 57 i2c_write(0xBC, 0x0D, data_write,1); //FIFO start
qiaolimaxim 2:7d005ac4146f 58
qiaolimaxim 2:7d005ac4146f 59 myPC.printf("\r\nStart reading...");
qiaolimaxim 2:7d005ac4146f 60 while (j++<15) {
qiaolimaxim 2:7d005ac4146f 61 myPC.printf("\r\n#%d, ", j);
qiaolimaxim 2:7d005ac4146f 62
qiaolimaxim 2:7d005ac4146f 63 i2c_read(0xBC, 0x00, data_read, 2);
qiaolimaxim 2:7d005ac4146f 64 while(data_read[0]==0x00 & data_read[1]==0x00) {
qiaolimaxim 2:7d005ac4146f 65 myPC.printf("\r\nReg 0x00 = 0x%x, Reg 0x01 = 0x%x, wait for INT", data_read[0], data_read[1]);
qiaolimaxim 2:7d005ac4146f 66 i2c_read(0xBC, 0x00, data_read, 2);
qiaolimaxim 2:7d005ac4146f 67 }
qiaolimaxim 2:7d005ac4146f 68 if (data_read[0] == 0x80) { // FIFO almost full
qiaolimaxim 2:7d005ac4146f 69 myPC.printf("\r\nReg 0x00 = 0x%x, read data", data_read[0]);
qiaolimaxim 2:7d005ac4146f 70 device_data_read();
qiaolimaxim 2:7d005ac4146f 71 }else if(data_read[1]&0x04 == 0x04) { // Power Ready
qiaolimaxim 2:7d005ac4146f 72 myPC.printf("\r\nReg 0x00 = 0x%x, read data", data_read[1]);
qiaolimaxim 2:7d005ac4146f 73 device_data_read();
qiaolimaxim 2:7d005ac4146f 74 }else if(data_read[0] == 0x10) { // Prox_INT
qiaolimaxim 2:7d005ac4146f 75 myPC.printf("\r\nReg 0x00 = 0x%x, Proximity Interrupt", data_read[0]);
qiaolimaxim 2:7d005ac4146f 76 data_write[0] = 0x00;
qiaolimaxim 2:7d005ac4146f 77 i2c_write(0xBC, 0x0D, data_write,1);
qiaolimaxim 2:7d005ac4146f 78 data_write[0] = 0x04;
qiaolimaxim 2:7d005ac4146f 79 i2c_write(0xBC, 0x0D, data_write,1);
qiaolimaxim 2:7d005ac4146f 80 data_write[0] = 0x80;
qiaolimaxim 2:7d005ac4146f 81 i2c_write(0xBC, 0x02, data_write,1);
qiaolimaxim 2:7d005ac4146f 82 }else if(data_read[0] == 0x01) { // Power Ready
qiaolimaxim 2:7d005ac4146f 83 myPC.printf("\r\nReg 0x00 = 0x%x, Power Ready", data_read[0]);
qiaolimaxim 2:7d005ac4146f 84 }else
qiaolimaxim 2:7d005ac4146f 85 myPC.printf("\r\nReg 0x00 = 0x%x, Reg 0x01 = 0x%x, other INT event...", data_read[0], data_read[1]);
qiaolimaxim 2:7d005ac4146f 86 }
qiaolimaxim 2:7d005ac4146f 87 }
qiaolimaxim 2:7d005ac4146f 88 }
qiaolimaxim 2:7d005ac4146f 89
qiaolimaxim 2:7d005ac4146f 90 void device_data_read(void)
qiaolimaxim 2:7d005ac4146f 91 {
qiaolimaxim 2:7d005ac4146f 92 char wr_ptr;
qiaolimaxim 2:7d005ac4146f 93 char rd_ptr;
qiaolimaxim 2:7d005ac4146f 94 char prox_int_threshold;
qiaolimaxim 2:7d005ac4146f 95 char flag = 0;
qiaolimaxim 2:7d005ac4146f 96 char dataBuff[32*3*3];
qiaolimaxim 2:7d005ac4146f 97 int sampleCnt = 0;
qiaolimaxim 2:7d005ac4146f 98 int red[32], ir[32], ecg[32], threshold_lower;
qiaolimaxim 2:7d005ac4146f 99 int i;
qiaolimaxim 2:7d005ac4146f 100
qiaolimaxim 2:7d005ac4146f 101 i2c_read(0xBC, 0x04, &wr_ptr, 1);
qiaolimaxim 2:7d005ac4146f 102 i2c_read(0xBC, 0x06, &rd_ptr, 1);
qiaolimaxim 2:7d005ac4146f 103
qiaolimaxim 2:7d005ac4146f 104 if(wr_ptr > rd_ptr)
qiaolimaxim 2:7d005ac4146f 105 sampleCnt = wr_ptr - rd_ptr;
qiaolimaxim 2:7d005ac4146f 106 else
qiaolimaxim 2:7d005ac4146f 107 sampleCnt = 32 + wr_ptr - rd_ptr;
qiaolimaxim 2:7d005ac4146f 108 i2c_read(0xBC, 0x07, dataBuff, sampleCnt*2*3);
qiaolimaxim 2:7d005ac4146f 109
qiaolimaxim 2:7d005ac4146f 110 i2c_read(0xBC, 0x10, &prox_int_threshold, 1);
qiaolimaxim 2:7d005ac4146f 111 threshold_lower = prox_int_threshold*2048*0.8;
qiaolimaxim 2:7d005ac4146f 112
qiaolimaxim 2:7d005ac4146f 113 for(i=0;i<sampleCnt;i++){
qiaolimaxim 2:7d005ac4146f 114 ir[i] = ((dataBuff[i*6+0] << 16) + (dataBuff[i*6+1] << 8) + dataBuff[i*6+2]) & 0x7ffff;
qiaolimaxim 2:7d005ac4146f 115 red[i] = ((dataBuff[i*6+3] << 16) + (dataBuff[i*6+4] << 8) + dataBuff[i*6+5]) & 0x7ffff;
qiaolimaxim 2:7d005ac4146f 116 ecg[i] = ((dataBuff[i*6+6] << 16) + (dataBuff[i*6+7] << 8) + dataBuff[i*6+8]) & 0x7ffff;
qiaolimaxim 2:7d005ac4146f 117 // check sign bit
qiaolimaxim 2:7d005ac4146f 118 if(ecg[i]>0x1FFFF)
qiaolimaxim 2:7d005ac4146f 119 ecg[i] = -((~ecg[i] + 1) & 0x1FFFF);
qiaolimaxim 2:7d005ac4146f 120 else
qiaolimaxim 2:7d005ac4146f 121 ecg[i] = ecg[i];
qiaolimaxim 2:7d005ac4146f 122 myPC.printf("\r\nIR = %d, RED = %d, ECG = %d", ir[i], red[i], ecg[i]);
qiaolimaxim 2:7d005ac4146f 123 if(ir[i]<threshold_lower){
qiaolimaxim 2:7d005ac4146f 124 flag = 0x10; // PROX_ON
qiaolimaxim 2:7d005ac4146f 125 myPC.printf("\r\nIR = %d Enter PROX mode", ir[i]);
qiaolimaxim 2:7d005ac4146f 126 }
qiaolimaxim 2:7d005ac4146f 127 }
qiaolimaxim 2:7d005ac4146f 128 if(flag!=0)
qiaolimaxim 2:7d005ac4146f 129 i2c_write(0xBC, 0x02, &flag,1); // PROX_INT_EN
qiaolimaxim 2:7d005ac4146f 130 }