Library for MAX30101, read/write functions for registers implemented.
Dependents: test_MAX30101 testSensor
MAX30101.cpp
- Committer:
- Rhyme
- Date:
- 2015-12-29
- Revision:
- 1:fc677d82d0f1
- Parent:
- 0:4ad9373787e8
- Child:
- 2:c465a8d44b9a
File content as of revision 1:fc677d82d0f1:
/** * MAX30101 * High-Sensitivity Pulse Oximeter and * Heart-Rate Sensor for Wearable Health */ #include "mbed.h" #include "MAX30101.h" /* Status */ #define REG_INT_MSB 0x00 /* Interrupt Status 1 */ #define REG_INT_LSB 0x01 /* Interrupt Status 2 */ #define REG_INT_ENB_MSB 0x02 /* Interrupt Enable 1 */ #define REG_INT_ENB_LSB 0x03 /* Interrupt Enable 2 */ /* FIFO */ #define REG_FIFO_WR_PTR 0x04 /* FIFO Write Pointer */ #define REG_OVF_COUNTER 0x05 /* Overflow Counter */ #define REG_FIFO_RD_PTR 0x06 /* FIFO Read Pointer */ #define REG_FIFO_DATA 0x07 /* FIFO Data Register */ /* Configuration */ #define REG_FIFO_CONFIG 0x08 /* FIFO Configuration */ #define REG_MODE_CONFIG 0x09 /* Mode Configuration */ #define REG_SPO2_CONFIG 0x0A /* SpO2 Configuration */ /* reserved 0x0B */ #define REG_LED1_PA 0x0C /* LED Pulse Amplitude 1 */ #define REG_LED2_PA 0x0D /* LED Pulse Amplitude 2 */ #define REG_LED3_PA 0x0E /* LED Pulse Amplitude 3 */ /* reserved 0x0F */ #define REG_PILOT_PA 0x10 /* Proximity LED Pulse Amplitude */ #define REG_SLOT_MSB 0x11 /* Multi-LED Mode Control Registers 2, 1 */ #define REG_SLOT_LSB 0x12 /* Multi-LED Mode Control Registers 4, 3 */ /* DIE Temperature */ #define REG_TEMP_INT 0x1F /* Die Temperature Integer */ #define REG_TEMP_FRAC 0x20 /* Die Temperature Fraction */ #define REG_TEMP_EN 0x21 /* Die Temperature Config */ /* Proximity Function */ #define REG_PROX_INT_THR 0x30 /* Proximity Interrupt Threshold */ /* Part ID */ #define REG_REV_ID 0xFE /* Revision ID */ #define REG_PART_ID 0xFF /* Part ID: 0x15 */ MAX30101::MAX30101(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { // activate the peripheral } MAX30101::~MAX30101() { } void MAX30101::readRegs(int addr, uint8_t * data, int len) { char t[1] = {addr} ; m_i2c.write(m_addr, t, 1, true) ; m_i2c.read(m_addr, (char*)data, len) ; } void MAX30101::writeRegs(uint8_t * data, int len) { m_i2c.write(m_addr, (char *)data, len) ; } uint8_t MAX30101::getID(void) { uint8_t id ; readRegs(REG_PART_ID, &id, 1) ; return( id ) ; } uint8_t MAX30101::getRev(void) { uint8_t rev ; readRegs(REG_REV_ID, &rev, 1) ; return( rev ) ; } uint16_t MAX30101::getIntStatus(void) { uint8_t res[2] ; uint16_t value ; readRegs(REG_INT_MSB, res, 2) ; value = (res[0] << 8) | res[1] ; return( value ) ; } void MAX30101::setIntEnable(uint16_t mask) { uint8_t res[3] ; res[0] = REG_INT_MSB ; res[1] = (mask >> 8) & 0xFF ; res[2] = (mask & 0xFF) ; writeRegs(res, 3) ; } uint8_t MAX30101::getFIFO_WR_PTR(void) { uint8_t data ; readRegs(REG_FIFO_WR_PTR, &data, 1) ; return( data ) ; } void MAX30101::setFIFO_WR_PTR(uint8_t data) { uint8_t res[2] ; res[0] = REG_FIFO_WR_PTR ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getOVF_COUNTER(void) { uint8_t data ; readRegs(REG_OVF_COUNTER, &data, 1) ; return( data ) ; } void MAX30101::setOVF_COUNTER(uint8_t data) { uint8_t res[2] ; res[0] = REG_OVF_COUNTER ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getFIFO_RD_PTR(void) { uint8_t data ; readRegs(REG_FIFO_RD_PTR, &data, 1) ; return( data ) ; } void MAX30101::setFIFO_RD_PTR(uint8_t data) { uint8_t res[2] ; res[0] = REG_FIFO_RD_PTR ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getFIFO_DATA(void) { uint8_t data ; readRegs(REG_FIFO_DATA, &data, 1) ; return( data ) ; } void MAX30101::setFIFO_DATA(uint8_t data) { uint8_t res[2] ; res[0] = REG_FIFO_DATA ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getFIFO_CONFIG(void) { uint8_t data ; readRegs(REG_FIFO_CONFIG, &data, 1) ; return( data ) ; } void MAX30101::setFIFO_CONFIG(uint8_t data) { uint8_t res[2] ; res[0] = REG_FIFO_CONFIG ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getMODE_CONFIG(void) { uint8_t data ; readRegs(REG_MODE_CONFIG, &data, 1) ; return( data ) ; } void MAX30101::setMODE_CONFIG(uint8_t data) { uint8_t res[2] ; res[0] = REG_MODE_CONFIG ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getSPO2_CONFIG(void) { uint8_t data ; readRegs(REG_SPO2_CONFIG, &data, 1) ; return( data ) ; } void MAX30101::setSPO2_CONFIG(uint8_t data) { uint8_t res[2] ; res[0] = REG_SPO2_CONFIG ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getLED1_PA(void) { uint8_t data ; readRegs(REG_LED1_PA, &data, 1) ; return( data ) ; } void MAX30101::setLED1_PA(uint8_t data) { uint8_t res[2] ; res[0] = REG_LED1_PA ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getLED2_PA(void) { uint8_t data ; readRegs(REG_LED2_PA, &data, 1) ; return( data ) ; } void MAX30101::setLED2_PA(uint8_t data) { uint8_t res[2] ; res[0] = REG_LED2_PA ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getLED3_PA(void) { uint8_t data ; readRegs(REG_LED3_PA, &data, 1) ; return( data ) ; } void MAX30101::setLED3_PA(uint8_t data) { uint8_t res[2] ; res[0] = REG_LED3_PA ; res[1] = data ; writeRegs(res, 2) ; } uint8_t MAX30101::getPILOT_PA(void) { uint8_t data ; readRegs(REG_PILOT_PA, &data, 1) ; return( data ) ; } void MAX30101::setPILOT_PA(uint8_t data) { uint8_t res[2] ; res[0] = REG_PILOT_PA ; res[1] = data ; writeRegs(res, 2) ; } uint16_t MAX30101::getSLOT(void) { uint8_t res[2] ; uint16_t data ; readRegs(REG_SLOT_MSB, res, 2) ; data = (res[0] << 8) | res[1] ; return( data ) ; } void MAX30101::setSLOT(uint16_t data) { uint8_t res[3] ; res[0] = REG_SLOT_MSB ; res[1] = (data >> 8) & 0xFF ; res[2] = data & 0xFF ; writeRegs(res, 3) ; } uint8_t MAX30101::getTEMP_INT(void) { uint8_t data ; readRegs(REG_TEMP_INT, &data, 1) ; return( data ) ; } uint8_t MAX30101::getTEMP_FRAM(void) { uint8_t data ; readRegs(REG_TEMP_FRAC, &data, 1) ; return( data ) ; } uint8_t MAX30101::getTEMP_EN(void) { uint8_t data ; readRegs(REG_TEMP_EN, &data, 1) ; return( data ) ; } uint8_t MAX30101::getPROX_INT_THR(void) { uint8_t data ; readRegs(REG_PROX_INT_THR, &data, 1) ; return( data ) ; } void MAX30101::setPROX_INT_THR(uint8_t data) { uint8_t res[2] ; res[0] = REG_PROX_INT_THR ; res[1] = data ; writeRegs(res, 2) ; }