Maxim Integrated MAX30205 C, C++ source code driver software: MAX30205 is accurate to +-0.1°C over the range of 37.0°C to 39.0°C. One-shot, shutdown modes are available for reduced power usage. Thermostat thresholds allow for temperature hysteresis or for alarm settings. The MAX30205 is available in a compact 3x3 mm, 8-pin TDFN package. Operating supply voltage range is 2.7V to 3.3V. Typical applications are for clinical digital thermometers, thermostats with hysteresis, and temperature alarms.

Dependents:   MAX30205_Human_Body_Temperature_Sensor

Files at this revision

API Documentation at this revision

Comitter:
j3
Date:
Thu Apr 06 00:05:03 2017 +0000
Parent:
0:cdad7a9ef486
Child:
2:a659724f496a
Commit message:
reworked a little more

Changed in this revision

MAX30205.cpp Show annotated file Show diff for this revision Revisions of this file
MAX30205.h Show annotated file Show diff for this revision Revisions of this file
--- a/MAX30205.cpp	Mon Apr 03 23:11:58 2017 +0000
+++ b/MAX30205.cpp	Thu Apr 06 00:05:03 2017 +0000
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -30,40 +30,115 @@
  * ownership rights.
  *******************************************************************************
  */
+ 
+ 
 #include "MAX30205.h"
 
+
 //******************************************************************************
-MAX30205::MAX30205(PinName sda, PinName scl, uint8_t slaveAddress): 
-m_i2c(sda, scl), m_writeAddress(slaveAddress << 1), m_readAddress((slaveAddress << 1) | 1)
+MAX30205::MAX30205(PinName sda, PinName scl, uint8_t slaveAddress, PinName os): 
+m_i2c(sda, scl), m_writeAddress(slaveAddress << 1), 
+m_readAddress((slaveAddress << 1) | 1), m_os(os, PullUp)
 {
 }
 
+
 //******************************************************************************
-MAX30205::MAX30205(I2C& i2c, uint8_t slaveAddress): 
-m_i2c(i2c), m_writeAddress(slaveAddress << 1), m_readAddress((slaveAddress << 1) | 1)
+MAX30205::MAX30205(I2C &i2c, uint8_t slaveAddress, PinName os): 
+m_i2c(i2c), m_writeAddress(slaveAddress << 1), 
+m_readAddress((slaveAddress << 1) | 1), m_os(os, PullUp)
 {
 }
 
+
 //******************************************************************************
 MAX30205::~MAX30205(void) 
 {
   //empty block
 }
 
+
 //******************************************************************************
-int32_t MAX30205::reg_write(Registers reg, uint8_t value) 
+int32_t MAX30205::readTemperature(uint16_t &value) 
+{
+  return readRegister(MAX30205::Temperature, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readConfiguration(Config &config)
 {
-  int32_t result;
-  
-  char cmdData[2] = {reg, value};
-  
-  result = m_i2c.write(m_writeAddress, cmdData, 2);
-  
-  return result;
+    uint16_t data;
+    
+    int32_t result = readRegister(MAX30205::Configuration, data);
+    if(result == 0)
+    {
+        config.all = (0x00FF & data);
+    }
+    
+    return result;
+    
+}
+
+
+//******************************************************************************    
+int32_t MAX30205::writeConfiguration(const Config config)
+{
+    uint16_t local_config = (0x00FF & config.all);
+    
+    return writeRegister(MAX30205::Configuration, local_config);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readTHYST(uint16_t &value) 
+{
+  return readRegister(MAX30205::THYST, value);
 }
 
+
 //******************************************************************************
-int32_t MAX30205::reg_write16(Registers reg, uint16_t value) 
+int32_t MAX30205::writeTHYST(uint16_t value) 
+{
+  return writeRegister(MAX30205::THYST, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::readTOS(uint16_t &value)
+{
+    return readRegister(MAX30205::TOS, value);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeTOS(const uint16_t value)
+{
+    return writeRegister(MAX30205::TOS, value);
+}
+
+
+//******************************************************************************
+float MAX30205::toCelsius(uint32_t rawTemp) 
+{
+  float val1, val2;
+  
+  val1 = static_cast<float>(rawTemp >> 8);
+  val2 = static_cast<float>(rawTemp & 0xFF);
+  
+  return(val2 + (val1 / 256.0F));
+}
+
+
+//******************************************************************************
+float MAX30205::toFahrenheit(float temperatureC) 
+{
+  return((temperatureC * 1.8F) + 32.0f);
+}
+
+
+//******************************************************************************
+int32_t MAX30205::writeRegister(Registers reg, uint16_t value) 
 {
   int32_t result;
   
@@ -76,29 +151,9 @@
   return result;
 }
 
-//******************************************************************************
-int32_t MAX30205::reg_read(Registers reg, uint8_t& value) 
-{
-  int32_t result;
-  
-  char cmdData[1] = {reg};
-  char readData;
-
-  result = m_i2c.write(m_writeAddress, cmdData, 1);
-  if(result == 0)
-  {
-      result = m_i2c.read(m_readAddress, &readData, 1);
-      if(result == 0)
-      {
-          value = readData;
-      }
-  }
-  
-  return result;
-}
 
 //******************************************************************************
-int32_t MAX30205::reg_read16(Registers reg, uint16_t& value) 
+int32_t MAX30205::readRegister(Registers reg, uint16_t &value) 
 {
   int32_t result;
   
@@ -117,40 +172,3 @@
   
   return result;
 }
-
-//******************************************************************************
-int32_t MAX30205::readTemperature(uint16_t& value) 
-{
-  int32_t result = reg_read16(MAX30205::Temperature, value);
-  
-  return result;
-}
-
-//******************************************************************************
-float MAX30205::toCelsius(uint32_t rawTemp) 
-{
-  float val1, val2;
-  
-  val1 = static_cast<float>(rawTemp >> 8);
-  val2 = static_cast<float>(rawTemp & 0xFF);
-  
-  return(val2 + (val1 / 256.0F));
-}
-
-//******************************************************************************
-float MAX30205::toFahrenheit(float temperatureC) 
-{
-  return((temperatureC * 1.8F) + 32.0f);
-}
-
-//******************************************************************************
-int32_t MAX30205::reg_THYST_Read(uint16_t& value) 
-{
-  return reg_read16(MAX30205::THYST, value);
-}
-
-//******************************************************************************
-int32_t MAX30205::reg_THYST_Write(uint16_t value) 
-{
-  return reg_write16(MAX30205::THYST, value);
-}
--- a/MAX30205.h	Mon Apr 03 23:11:58 2017 +0000
+++ b/MAX30205.h	Thu Apr 06 00:05:03 2017 +0000
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -64,6 +64,22 @@
         THYST = 0x02,
         TOS = 0x03
     };
+    
+    ///MAX30205 Configuration register bitfields
+    union Config
+    {
+        uint8_t all;
+        struct BitField
+        {
+            uint8_t shutdown    : 1;
+            uint8_t comp_int    : 1;
+            uint8_t os_polarity : 1;
+            uint8_t fault_queue : 2;
+            uint8_t data_format : 1;
+            uint8_t timeout     : 1;
+            uint8_t one_shot    : 1;
+        }bits;
+    };
 
     /**
     * @brief  Constructor using I2C PinNames
@@ -71,69 +87,66 @@
     * @param scl - Pinname for scl
     * @param slaveAddress - 7-bit I2C address
     */
-    MAX30205(PinName sda, PinName scl, uint8_t slaveAddress);
+    MAX30205(PinName sda, PinName scl, uint8_t slaveAddress, PinName os = NC);
     
     /**
     * @brief  Constructor using reference to I2C object
     * @param i2c - Reference to I2C object
     * @param slaveAddress - 7-bit I2C address
     */
-    MAX30205(I2C& i2c, uint8_t slaveAddress);
+    MAX30205(I2C &i2c, uint8_t slaveAddress, PinName os = NC);
 
     /** @brief Destructor */
     ~MAX30205(void);
 
-    /** @brief Write register of device at slave address
-    * @param reg - Register address
-    * @param value - Value to write
-    * @return 0 on success, non-zero on failure
-    */
-    int32_t reg_write(Registers reg, uint8_t value);
-
-    /**
-    * @brief  Read register of device at slave address
-    * @param reg - Register address
-    * @param[out] value - Read data on success
-    * @return 0 on success, non-zero on failure
-    */
-    int32_t reg_read(Registers reg, uint8_t& value);
-
-    /**
-    * @brief Write a 16-bit value into device at slave address
-    * @param reg - Register address
-    * @param value - 16-bit value to write
-    * @return 0 on success, non-zero on failure
-    */
-    int32_t reg_write16(Registers reg, uint16_t value);
-
-    /**
-    * @brief Read a 16-bit value from a device at a slave address
-    * @param reg - Register address
-    * @param[out] value - Read data on success
-    * @return 0 on success, non-zero on failure
-    */
-    int32_t reg_read16(Registers reg, uint16_t& value);
-
     /**
     * @brief Read the temperature from the device into a 16 bit value
     * @param[out] value - Raw temperature data on success
     * @return 0 on success, non-zero on failure
     */
-    int32_t readTemperature(uint16_t& value);
+    int32_t readTemperature(uint16_t &value);
+    
+    /**
+    * @brief Read the configuration register
+    * @param config - Reference to Configuration type
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t readConfiguration(Config &config);
+    
+    /**
+    * @brief Write the configuration register with given configuration
+    * @param config - Configuration to write
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t writeConfiguration(const Config config);
 
     /**
     * @brief Read the THYST value from a specified device instance
     * @param[out] value - THYST register value on success
     * @return 0 on success, non-zero on failure
     */
-    int32_t reg_THYST_Read(uint16_t& value);
+    int32_t readTHYST(uint16_t &value);
 
     /**
     * @brief Write the THYST to a device instance
     * @param value - 16-bit value to write
     * @return 0 on success, non-zero on failure
     */
-    int32_t reg_THYST_Write(uint16_t value);
+    int32_t writeTHYST(const uint16_t value);
+    
+    /**
+    * @brief Read the TOS value from device
+    * @param[out] value - TOS register value on success
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t readTOS(uint16_t &value);
+
+    /**
+    * @brief Write the TOS register
+    * @param value - 16-bit value to write
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t writeTOS(const uint16_t value);
 
     /**
     * @brief Convert a raw temperature value into a float
@@ -148,12 +161,32 @@
     * @returns Returns the converted Fahrenheit value
     */
     float toFahrenheit(float temperatureC);
+    
+protected:
+
+    /** 
+    * @brief Write register of device at slave address
+    * @param reg - Register address
+    * @param value - Value to write
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t writeRegister(Registers reg, uint16_t value);
+
+    /**
+    * @brief  Read register of device at slave address
+    * @param reg - Register address
+    * @param[out] value - Read data on success
+    * @return 0 on success, non-zero on failure
+    */
+    int32_t readRegister(Registers reg, uint16_t &value);
 
 private:
     /// I2C object
     I2C m_i2c;
     /// Device slave address
     uint8_t m_writeAddress, m_readAddress;
+    /// Over temperature shutdown interrupt pin
+    DigitalIn m_os;
 };
 
 #endif /* __MAX30205_H_ */