Qiao li
/
MAX86150_evkit_board_OK
none
main.cpp@2:7d005ac4146f, 2019-04-12 (annotated)
- Committer:
- qiaolimaxim
- Date:
- Fri Apr 12 06:56:27 2019 +0000
- Revision:
- 2:7d005ac4146f
max86150
Who changed what in which revision?
User | Revision | Line number | New 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 | } |