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
Diff: max30100.cpp
- Revision:
- 0:e1e1947a9882
- Child:
- 1:7d90c51393c9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/max30100.cpp Sun Apr 03 13:43:19 2016 +0000
@@ -0,0 +1,167 @@
+/*
+ Library for the Maxim MAX30100 pulse oximetry system
+ */
+
+#include "max30100.h"
+#include "functions.h"
+
+static Serial pc(SERIAL_TX, SERIAL_RX);
+
+void MAX30100::setLEDs(pulseWidth pw, ledCurrent red, ledCurrent ir){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_read, 1);
+ data_read[0] = data_read[0] & 0xFC; // Set LED_PW to 00
+ data_write[0] = data_read[0] | pw;
+ i2c_write(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_write, 1); // Mask LED_PW
+ data_write[0] = ((red<<4) | ir);
+ i2c_write(MAX30100_ADDRESS, MAX30100_LED_CONFIG, data_write, 1); // write LED configs
+}
+
+void MAX30100::setSPO2(sampleRate sr, high_resolution hi_res){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_read, 1);
+ data_read[0] = data_read[0] & 0xA3; // Set SPO2_SR to 000 and SPO2_HI_RES_EN to 0
+ data_write[0] = data_read[0] | (sr<<2) | (hi_res<<6);
+ i2c_write(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_write, 1); // Mask SPO2_SR
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1);
+ data_write[0] = data_read[0] & 0xF8; // Set Mode to 000
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // Mask MODE
+}
+
+void MAX30100::setInterruptSPO2(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_INT_ENABLE, data_read, 1);
+ data_write[0] = data_read[0] | 0x10; // Set Interrupt enable for SPO2
+ i2c_write(MAX30100_ADDRESS, MAX30100_INT_ENABLE, data_write, 1); // Mask ENB_SPO2_RDY
+}
+
+int MAX30100::getNumSamp(void){
+ char data_read[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_W_POINTER, data_read, 1);
+ char wrPtr = data_read[0];
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_R_POINTER, data_read, 1);
+ char rdPtr = data_read[0];
+ return (abs( 16 + (int)wrPtr - (int)rdPtr ) % 16);
+}
+
+void MAX30100::setTemp(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1);
+ data_write[0] = data_read[0] | 0x0B; // Set SPO2 Mode and enable temperature
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // Mask MODE
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1);
+}
+
+void MAX30100::setSPO2mode(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1);
+ data_write[0] = data_read[0] | 0x03; // Set SPO2 Mode
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1);
+}
+
+int MAX30100::readTemp(void){
+ char data_read[1];
+ char temp_int, temp_fract;
+ int temp_measured;
+ i2c_read(MAX30100_ADDRESS, MAX30100_TEMP_INTEGER, data_read, 1);
+ temp_int = data_read[0];
+ i2c_read(MAX30100_ADDRESS, MAX30100_TEMP_FRACTION, data_read, 1);
+ temp_fract = data_read[0] & 0x0F;
+ temp_measured = ((int)temp_int)+(((int)temp_fract) >> 4);
+ return temp_measured;
+}
+
+void MAX30100::readSensor(void){
+ char data_read[4];
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_DATA_REG, data_read, 4); // Read four times from the FIFO
+ HR = (data_read[0]<<8) | data_read[1]; // Combine values to get the actual number
+ SPO2 = (data_read[2]<<8) | data_read[3]; // Combine values to get the actual number
+}
+
+void MAX30100::shutdown(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1); // Get the current register
+ data_write[0] = data_read[0] | 0x80;
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // mask the SHDN bit
+}
+
+void MAX30100::reset(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1); // Get the current register
+ data_write[0] = data_read[0] | 0x40;
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // mask the RESET bit
+}
+
+void MAX30100::startup(void){
+ char data_read[1];
+ char data_write[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1); // Get the current register
+ data_write[0] = data_read[0] & 0x7F;
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // mask the SHDN bit
+}
+
+char MAX30100::getRevID(void){
+ char data_read[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_REVISION_ID, data_read, 1);
+ return data_read[0];
+}
+
+char MAX30100::getPartID(void){
+ char data_read[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_PART_ID, data_read, 1);
+ return data_read[0];
+}
+
+void MAX30100::begin(pulseWidth pw, ledCurrent ir, sampleRate sr){
+ char data_write[1];
+ data_write[0] = 0x03;
+ i2c_write(MAX30100_ADDRESS, MAX30100_CONFIG, data_write, 1); // Heart rate only
+ data_write[0] = ir;
+ i2c_write(MAX30100_ADDRESS, MAX30100_LED_CONFIG, data_write, 1);
+ data_write[0] = ((sr<<2)|pw);
+ i2c_write(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_write, 1);
+}
+
+void MAX30100::init(pulseWidth pw, sampleRate sr, high_resolution hi_res, ledCurrent red, ledCurrent ir){
+
+ setLEDs(pw, red, ir);
+ setSPO2(sr, hi_res);
+
+}
+
+void MAX30100::printRegisters(void){
+ char data_read[1];
+ i2c_read(MAX30100_ADDRESS, MAX30100_INT_STATUS, data_read, 1);
+ pc.printf("INT_STATUS: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_INT_ENABLE, data_read, 1);
+ pc.printf("INT_ENABLE: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_W_POINTER, data_read, 1);
+ pc.printf("FIFO_W_POINTER: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_OVR_COUNTER, data_read, 1);
+ pc.printf("OVR_COUNTER: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_R_POINTER, data_read, 1);
+ pc.printf("FIFO_R_POINTER: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_FIFO_DATA_REG, data_read, 1);
+ pc.printf("FIFO_DATA_REG: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_CONFIG, data_read, 1);
+ pc.printf("CONFIG: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_SPO2_CONFIG, data_read, 1);
+ pc.printf("SPO2_CONFIG: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_LED_CONFIG, data_read, 1);
+ pc.printf("LED_CONFIG: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_TEMP_INTEGER, data_read, 1);
+ pc.printf("TEMP_INTEGER: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_TEMP_FRACTION, data_read, 1);
+ pc.printf("TEMP_FRACTION: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_REVISION_ID, data_read, 1);
+ pc.printf("REVISION_ID: %#4X\r\n", data_read[0]);
+ i2c_read(MAX30100_ADDRESS, MAX30100_PART_ID, data_read, 1);
+ pc.printf("PART_ID: %#4X\r\n", data_read[0]);
+}
