Library for MAX30101, read/write functions for registers implemented.
Dependents: test_MAX30101 testSensor
Diff: MAX30101.cpp
- Revision:
- 2:c465a8d44b9a
- Parent:
- 1:fc677d82d0f1
- Child:
- 4:c6761ad52524
--- a/MAX30101.cpp Tue Dec 29 07:40:53 2015 +0000 +++ b/MAX30101.cpp Mon Mar 27 05:30:28 2017 +0000 @@ -37,6 +37,8 @@ /* Part ID */ #define REG_REV_ID 0xFE /* Revision ID */ #define REG_PART_ID 0xFF /* Part ID: 0x15 */ +/* Depth of FIFO */ +#define FIFO_DEPTH 32 MAX30101::MAX30101(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) { // activate the peripheral @@ -77,10 +79,19 @@ return( value ) ; } +uint16_t MAX30101::getIntEnable(void) +{ + uint8_t res[2] ; + uint16_t value ; + readRegs(REG_INT_ENB_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[0] = REG_INT_ENB_MSB ; res[1] = (mask >> 8) & 0xFF ; res[2] = (mask & 0xFF) ; writeRegs(res, 3) ; @@ -276,7 +287,7 @@ return( data ) ; } -uint8_t MAX30101::getTEMP_FRAM(void) +uint8_t MAX30101::getTEMP_FRAC(void) { uint8_t data ; readRegs(REG_TEMP_FRAC, &data, 1) ; @@ -290,6 +301,26 @@ return( data ) ; } +void MAX30101::setTEMP_EN(void) +{ + uint8_t res[2] ; + res[0] = REG_TEMP_EN ; + res[1] = 1 ; + writeRegs(res, 2) ; +} + +float MAX30101::getTEMP(void) +{ + float temp ; + int temp_int, temp_frac ; + setTEMP_EN() ; + while(getTEMP_EN() == 0x01) { } + temp_int = getTEMP_INT() ; + temp_frac = getTEMP_FRAC() ; + temp = ((float)temp_int)+(((float)temp_frac)/16.0) ; + return( temp ) ; +} + uint8_t MAX30101::getPROX_INT_THR(void) { uint8_t data ; @@ -305,3 +336,43 @@ writeRegs(res, 2) ; } +void MAX30101::clearFIFO(void) +{ + uint8_t res[5] ; + res[0] = REG_FIFO_WR_PTR ; + res[1] = 0x00 ; /* FIFO_WR_PTR */ + res[2] = 0x00 ; /* OVF_COUNTER */ + res[3] = 0x00 ; /* FIFO_RD_PTR */ + res[4] = 0x00 ; /* FIFO_DATA (do we need to clear this?) */ + writeRegs(res, 5) ; +} + +/** + * readFIFO(void) + * FIFO data is always a 3-bytes data + * byte1[1:0] : FIFO_DATA[17]-FIFO_DATA[16] + * byte2[7:0] : FIFO_DATA[15]-FIFO_DATA[8] + * byte3[7:0] : FIFO_DATA[7]-FIFO_DATA[0] + * The data is left aligned, so FIFO_DATA[17] + * is always MSB, although the data length + * can be 18-bit ~ 15-bit + */ +uint32_t MAX30101::readFIFO(void) +{ + uint32_t data = 0 ; + uint8_t res[3] ; + readRegs(REG_FIFO_DATA, res, 3) ; + data = + ((res[0] & 0x03)<<16) + | (res[1] << 8) + | res[2] ; + return( data ) ; +} + +void MAX30101::reset(void) +{ + uint8_t res[2] ; + res[0] = REG_MODE_CONFIG ; + res[1] = 0x40 ; /* reset */ + writeRegs(res, 2) ; +}