Linnéa Edström / MAX30102

Fork of MAX30100 by StepOne

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers max30102.cpp Source File

max30102.cpp

00001 /*
00002  * Library for the Maxim MAX30102 pulse oximetry system, I modified a copy of the MAX30100 library in May 2016
00003  */
00004 
00005 #include "max30102.h"
00006 #include "functions.h"
00007  
00008 Serial pc(USBTX, USBRX);
00009 
00010 void MAX30102::setLEDs(pulseWidth pw, ledCurrent red, ledCurrent ir){
00011     char data_read[1];
00012     char data_write[1];
00013     i2c_read(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_read, 1);
00014     data_read[0] = data_read[0] & 0xFD;                                 // Set LED_PW to 01
00015     data_write[0] = data_read[0] | pw;
00016     i2c_write(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_write, 1);   // Mask LED_PW
00017     data_write[0] = (red);
00018     i2c_write(MAX30102_ADDRESS, MAX30102_LED_CONFIG_1, data_write, 1);  // write LED1 configs
00019     data_write[0] = (ir);
00020     i2c_write(MAX30102_ADDRESS, MAX30102_LED_CONFIG_2, data_write, 1);  // write LED2 configs
00021 }
00022 
00023 void MAX30102::setSPO2(sampleRate sr, high_resolution hi_res){
00024     char data_read[1];
00025     char data_write[1];
00026     i2c_read(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_read, 1);
00027     data_read[0] = data_read[0] & 0x85;                                 // Set ADC_rge to 00, SPO2_SR to 001 = sr100 and LEDpw to 01 = 118
00028     data_write[0] = data_read[0] | (sr<<2) | (hi_res<<6);
00029     i2c_write(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_write, 1);   // Mask SPO2_SR
00030     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);
00031     data_write[0] = data_read[0] & 0xF8; // Set Mode to 000
00032     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);        // Mask MODE
00033 }
00034 
00035 void MAX30102::setInterruptSPO2(void){
00036     char data_read[1];
00037     char data_write[1];
00038     i2c_read(MAX30102_ADDRESS, MAX30102_INT_ENABLE, data_read, 1);
00039     data_write[0] = data_read[0] & 0x00;                                // Set Interrupt enable for SPO2 | 0x10   // New: disable prox! & ~0x10
00040     i2c_write(MAX30102_ADDRESS, MAX30102_INT_ENABLE, data_write, 1);    // Mask ENB_SPO2_RDY
00041 } 
00042 
00043 int MAX30102::getNumSamp(void){
00044     char data_read[1] = {0};
00045 //    i2c_write(MAX30102_ADDRESS, MAX30102_FIFO_W_POINTER, data_read, 1);
00046 //    i2c_write(MAX30102_ADDRESS, MAX30102_FIFO_R_POINTER, data_read, 1);
00047 //    wait(0.148);
00048     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_W_POINTER, data_read, 1);
00049     char wrPtr = data_read[0];
00050     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_R_POINTER, data_read, 1);
00051     char rdPtr = data_read[0];
00052     return ((int)wrPtr - (int)rdPtr);                                   // New counting
00053  //   return (abs( 16 + (int)wrPtr - (int)rdPtr ) % 16);
00054 }
00055 
00056 void MAX30102::setTemp(void){
00057     char data_read[1];
00058     char data_write[1];
00059     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_CONFIG, data_read, 1);
00060     data_write[0] = data_read[0] | 0x01;    // Enable temperature
00061     i2c_write(MAX30102_ADDRESS, MAX30102_TEMP_CONFIG, data_write, 1);   // Mask MODE
00062     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_CONFIG, data_read, 1);
00063 }
00064 
00065 void MAX30102::setSPO2mode(void){
00066     char data_read[1];
00067     char data_write[1];
00068     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);
00069     data_write[0] = data_read[0] | 0x03;    // Set SPO2 Mode
00070     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);
00071 }
00072 
00073 int MAX30102::readTemp(void){
00074     char data_read[1];
00075     char temp_int, temp_fract;
00076     int temp_measured;
00077     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_INTEGER, data_read, 1);
00078     temp_int = data_read[0];
00079     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_FRACTION, data_read, 1);
00080     temp_fract = data_read[0] & 0x0F;
00081     temp_measured = ((int)temp_int)+(((int)temp_fract) >> 4);
00082     return temp_measured;
00083 }
00084 
00085 void MAX30102::readSensor(void){
00086     char data_read[6] = {0}; 
00087     HR = 0;
00088     SPO2 = 0;
00089     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_DATA_REG, data_read, 6);   // Read six times from the FIFO
00090     HR = (data_read[0]<<16) | (data_read[1]<<8) | data_read[2];         // Combine values to get the actual number
00091     HR = HR>>2;
00092     SPO2 = (data_read[3]<<16) | (data_read[4]<<8) | data_read[5];       // Combine values to get the actual number
00093     SPO2 = SPO2>>2;
00094 }
00095 
00096 void MAX30102::shutdown(void){
00097     char data_read[1];
00098     char data_write[1];
00099     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);          // Get the current register
00100     data_write[0] = data_read[0] | 0x80;
00101     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);        // mask the SHDN bit
00102 }
00103 
00104 void MAX30102::reset(void){
00105     char data_read[1];
00106     char data_write[1];
00107     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);          // Get the current register
00108     data_write[0] = data_read[0] | 0x40;
00109     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);        // mask the RESET bit
00110 }
00111 
00112 void MAX30102::startup(void){
00113     char data_read[1];
00114     char data_write[1];
00115     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);          // Get the current register
00116     data_write[0] = data_read[0] & 0x7F;
00117     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);        // mask the SHDN bit
00118 }
00119 
00120 char MAX30102::getRevID(void){
00121     char data_read[1];
00122     i2c_read(MAX30102_ADDRESS, MAX30102_REVISION_ID, data_read, 1);
00123     return data_read[0];
00124 }
00125 
00126 char MAX30102::getPartID(void){
00127     char data_read[1];
00128     i2c_read(MAX30102_ADDRESS, MAX30102_PART_ID, data_read, 1);
00129     return data_read[0];
00130 }
00131 
00132 void MAX30102::begin(pulseWidth pw, ledCurrent ir, sampleRate sr){
00133     char data_write[1];
00134     data_write[0] = 0x02;
00135     i2c_write(MAX30102_ADDRESS, MAX30102_CONFIG, data_write, 1);        // Heart rate only
00136     data_write[0] = ir;
00137     i2c_write(MAX30102_ADDRESS, MAX30102_LED_CONFIG_1, data_write, 1);
00138     data_write[0] = ((sr<<2)|pw);
00139     i2c_write(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_write, 1);
00140 }
00141 
00142 void MAX30102::init(pulseWidth pw, sampleRate sr, high_resolution hi_res, ledCurrent red, ledCurrent ir){
00143     char data_write[1];
00144     
00145     setLEDs(pw, red, ir);
00146     setSPO2(sr, hi_res);
00147     
00148     data_write[0] = 0x10;
00149     i2c_write(MAX30102_ADDRESS, MAX30102_FIFO_CONFIG, data_write, 1);
00150       
00151 }
00152 
00153 void MAX30102::printRegisters(void){
00154     char data_read[1];
00155     i2c_read(MAX30102_ADDRESS, MAX30102_INT_STATUS, data_read, 1);
00156     pc.printf("INT_STATUS: %#4X\r\n", data_read[0]);
00157     i2c_read(MAX30102_ADDRESS, MAX30102_INT_ENABLE, data_read, 1);
00158     pc.printf("INT_ENABLE: %#4X\r\n", data_read[0]);
00159     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_W_POINTER, data_read, 1);
00160     pc.printf("FIFO_W_POINTER: %#4X\r\n", data_read[0]);
00161     i2c_read(MAX30102_ADDRESS, MAX30102_OVR_COUNTER, data_read, 1);
00162     pc.printf("OVR_COUNTER: %#4X\r\n", data_read[0]);
00163     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_R_POINTER, data_read, 1);
00164     pc.printf("FIFO_R_POINTER: %#4X\r\n", data_read[0]);
00165     i2c_read(MAX30102_ADDRESS, MAX30102_FIFO_DATA_REG, data_read, 1);
00166     pc.printf("FIFO_DATA_REG: %#4X\r\n", data_read[0]);
00167     i2c_read(MAX30102_ADDRESS, MAX30102_CONFIG, data_read, 1);
00168     pc.printf("CONFIG: %#4X\r\n", data_read[0]);
00169     i2c_read(MAX30102_ADDRESS, MAX30102_SPO2_CONFIG, data_read, 1);
00170     pc.printf("SPO2_CONFIG: %#4X\r\n", data_read[0]);
00171     i2c_read(MAX30102_ADDRESS, MAX30102_LED_CONFIG_2, data_read, 1);
00172     pc.printf("LED_CONFIG: %#4X\r\n", data_read[0]);
00173     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_INTEGER, data_read, 1);
00174     pc.printf("TEMP_INTEGER: %#4X\r\n", data_read[0]);
00175     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_FRACTION, data_read, 1);
00176     pc.printf("TEMP_FRACTION: %#4X\r\n", data_read[0]);
00177     i2c_read(MAX30102_ADDRESS, MAX30102_TEMP_CONFIG, data_read, 1);
00178     pc.printf("TEMP_CONFIG: %#4X\r\n", data_read[0]);
00179     i2c_read(MAX30102_ADDRESS, MAX30102_REVISION_ID, data_read, 1);
00180     pc.printf("REVISION_ID: %#4X\r\n", data_read[0]);
00181     i2c_read(MAX30102_ADDRESS, MAX30102_PART_ID, data_read, 1);
00182     pc.printf("PART_ID: %#4X\r\n", data_read[0]);
00183 }