Library for MAX30101, read/write functions for registers implemented.

Dependents:   test_MAX30101 testSensor

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) ;
+}