C++ driver software code for Maxim Integrated MAX31723/MAX31722 device temperature sensor. The MAX31723 provides 9 to 12 bits of resolution.
Dependents: MAX31723_Thermostat_Thermometer_Sensor
Revision 4:ac75d4d62471, committed 2019-01-30
- Comitter:
- phonemacro
- Date:
- Wed Jan 30 02:13:05 2019 +0000
- Parent:
- 3:f39791139435
- Child:
- 5:8e70ec0923e2
- Commit message:
- correct calculations for signed temperatures
Changed in this revision
| max31723.cpp | Show annotated file Show diff for this revision Revisions of this file |
| max31723.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/max31723.cpp Mon Jan 28 00:39:50 2019 +0000
+++ b/max31723.cpp Wed Jan 30 02:13:05 2019 +0000
@@ -37,7 +37,8 @@
uint8_t lsb;
uint8_t msb;
};
- uint16_t wrd;
+ uint16_t uwrd;
+ int16_t swrd;
};
MAX31723::MAX31723(SPI &spi, DigitalOut &ce_pin) : m_spi(spi), m_chip_enable(ce_pin)
@@ -47,20 +48,33 @@
int MAX31723::write_reg(uint8_t val, uint8_t reg)
{
- m_chip_enable = 1;
- m_spi.write(reg);
- m_spi.write(val);
- m_chip_enable = 0;
- return MAX31723_NO_ERROR;
+ if (reg == (MAX31723_REG_CFG | MAX31723_WRITE_MASK) ||
+ (reg >= (MAX31723_REG_TRIP_HI_LSB | MAX31723_WRITE_MASK) &&
+ reg <= (MAX31723_REG_MAX | MAX31723_WRITE_MASK)) ) {
+ m_chip_enable = 1;
+ m_spi.write(reg);
+ m_spi.write(val);
+ m_chip_enable = 0;
+ return MAX31723_NO_ERROR;
+ } else {
+ printf("Input write_reg is invalid, 0x%02X \r\n", reg);
+ return MAX31723_ERROR;
+ }
}
int MAX31723::read_reg(uint8_t &val, uint8_t reg)
{
- m_chip_enable = 1;
- m_spi.write(reg);
- val = m_spi.write(0);
- m_chip_enable = 0;
- return MAX31723_NO_ERROR;
+ if (reg <= MAX31723_REG_MAX) {
+ m_chip_enable = 1;
+ wait(.001);
+ m_spi.write(reg);
+ val = m_spi.write(0);
+ m_chip_enable = 0;
+ return MAX31723_NO_ERROR;
+ } else {
+ printf("Input read_reg is invalid, 0x%02X \r\n", reg);
+ return MAX31723_ERROR;
+ }
}
int MAX31723::perform_one_shot(uint8_t resolution, uint8_t interrupt_mode)
@@ -103,8 +117,8 @@
if (reg >= MAX31723_REG_TEMP_LSB && reg <= MAX31723_REG_MAX) {
read_reg(raw.lsb, reg);
read_reg(raw.msb, reg+1);
- raw.wrd = raw.wrd >> MAX31723_UNUSED_BITS;
- temperature = raw.wrd * MAX31723_CF_LSB;
+ raw.swrd = raw.swrd >> MAX31723_UNUSED_BITS;
+ temperature = raw.swrd * MAX31723_CF_LSB;
return temperature;
} else {
printf("Input read_registers_as_temperature is invalid, %d r\n",
--- a/max31723.h Mon Jan 28 00:39:50 2019 +0000
+++ b/max31723.h Wed Jan 30 02:13:05 2019 +0000
@@ -72,7 +72,7 @@
#define MAX31723_NVRAM_WRITE_TIME_MSEC 0.015
-#define MAX31723_CF_LSB 0.0625f
+#define MAX31723_CF_LSB 0.0625
#define MAX31723_UNUSED_BITS 4
/**
@@ -111,6 +111,14 @@
MAX31723(SPI &spi, DigitalOut &ce_pin);
/**
+ * @brief Read a value from a register
+ * @param val - 8-bit value read from the register
+ * @param reg - register address
+ * @return 0 on success, negative number on failure
+ */
+ int read_reg(uint8_t &val, uint8_t reg);
+
+ /**
* @brief Write a value to a register
* @param val - 8-bit value to write to the register
* @param reg - register address
@@ -141,6 +149,12 @@
*/
int perform_one_shot_comparator(uint8_t resolution);
+
+ /**
+ * @brief Reads the configuration register
+ * @return value of the configuration register
+ */
+ uint8_t read_cfg();
/**
* @brief Converts Celcius degrees to Fahrenheit
* @param temp_c - the temperature in Celsius degrees
@@ -148,13 +162,6 @@
*/
float celsius_to_fahrenheit(float temp_c);
- /**
- * @brief Reads the configuration register
- * @return value of the configuration register
- */
- uint8_t read_cfg();
-
-
/************************************************************
* @brief Default destructor for MAX31723 Class.
*
@@ -179,13 +186,6 @@
private:
- /**
- * @brief Read a value from a register
- * @param val - 8-bit value read from the register
- * @param reg - register address
- * @return 0 on success, negative number on failure
- */
- int read_reg(uint8_t &val, uint8_t reg);
/* SPI object */
SPI &m_spi;