Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MAX30100 by
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 }
Generated on Tue Jul 12 2022 21:40:38 by
1.7.2
