C code and C++ library, driver software for the low-power small WLP package MAX31875 temperature sensor. Code supports one-shot, shut-down/standby, hysteresis, alarm limits.

Dependents:   MAX31875_Temperature_Sensor_Small_WLP Click-Sensor-MAX31875 NuMaker-mbed-Sensor-MAX31875

Revision:
4:a27a0ee318bd
Parent:
3:3528e660168c
Child:
5:228e67722322
--- a/max31875_cpp.cpp	Mon Feb 04 23:32:38 2019 +0000
+++ b/max31875_cpp.cpp	Wed Feb 13 05:01:35 2019 +0000
@@ -44,9 +44,9 @@
 MAX31875::MAX31875(I2C &i2c_bus, uint8_t slave_address):
 m_i2c(i2c_bus), 
 m_write_address(slave_address <<1),
-m_read_address ((slave_address << 1) | 1),
-m_extended_format(0)
+m_read_address ((slave_address << 1) | 1)
 {
+    m_extended_format = 0;
 }
  
 /******************************************************************************/
@@ -69,9 +69,9 @@
         if (ret == 0) {
             ret = m_i2c.read(m_read_address, data, 2, false);
             if (ret == 0) {
-                tmp.msb = data[0];  /* MSB */
-                tmp.lsb = data[1];  /* LSB */
-                *value = tmp.swrd;
+                tmp.msb = data[0];
+                tmp.lsb = data[1];
+                *value = tmp.uwrd;
                 return MAX31875_NO_ERROR;
             } else {
                 printf(
@@ -94,14 +94,19 @@
     max31875_raw_data tmp;
     float temperature;
     if (reg == MAX31875_REG_TEMPERATURE ||
-        reg == MAX31875_REG_THYST || reg == MAX31875_REG_TOS) {
+        reg == MAX31875_REG_THYST_LOW_TRIP || reg == MAX31875_REG_TOS_HIGH_TRIP) {
         read_reg(&tmp.uwrd, reg);
-        temperature = (float)tmp.swrd;
+//printf("RD %02x %02x exted fmt %d \n\r", tmp.msb, tmp.lsb, m_extended_format);
+        temperature = (float)tmp.magnitude_bits;
+//printf("RD temp %d \n\r", temperature);
         if (m_extended_format)
             temperature *= MAX31875_CF_EXTENDED_FORMAT;
         else
             temperature *= MAX31875_CF_NORMAL_FORMAT;
+        if (tmp.sign_bit)
+            temperature = -temperature;
         return temperature;
+        
     } else {
         printf("%s: register is invalid, %d r\n", __func__, reg);
         return 0;
@@ -122,10 +127,11 @@
         cmd[2] = tmp.lsb;
         ret = m_i2c.write(m_write_address, cmd, 3, false);
         if (ret == 0) {
-            if (tmp.uwrd & MAX31875_CFG_EXTENDED_FORMAT)
-                m_extended_format = 1;
-            else 
+            if (MAX31875_REG_CONFIGURATION == reg) {
                 m_extended_format = 0;
+                if (tmp.uwrd & MAX31875_CFG_EXTENDED_FORMAT)
+                    m_extended_format = 1;
+            }
             return MAX31875_NO_ERROR;
         } else {
             printf("%s: I2C write error %d\r\n",__func__, ret);
@@ -147,24 +153,32 @@
 int MAX31875::write_trip_low(float temperature)
 {
     max31875_raw_data raw;
+    if (temperature < 0) {
+        raw.sign_bit = 1;
+        temperature = -temperature;
+    }
     if (m_extended_format)
         temperature /= MAX31875_CF_EXTENDED_FORMAT;
     else
         temperature /= MAX31875_CF_NORMAL_FORMAT;
-    raw.uwrd = uint16_t(temperature);
-    return write_reg(raw.uwrd, MAX31875_REG_THYST);
+    raw.magnitude_bits= uint16_t(temperature);
+    return write_reg(raw.uwrd, MAX31875_REG_THYST_LOW_TRIP);
 }
 
 /******************************************************************************/
 int MAX31875::write_trip_high(float temperature)
 {
     max31875_raw_data raw;
+    if (temperature < 0) {
+        raw.sign_bit = 1;
+        temperature = -temperature;
+    }
     if (m_extended_format)
         temperature /= MAX31875_CF_EXTENDED_FORMAT;
     else
         temperature /= MAX31875_CF_NORMAL_FORMAT;
-    raw.uwrd = uint16_t(temperature);
-    return write_reg(raw.uwrd, MAX31875_REG_TOS);
+    raw.magnitude_bits= uint16_t(temperature);
+    return write_reg(raw.uwrd, MAX31875_REG_TOS_HIGH_TRIP);
 }
 
 /******************************************************************************/