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

Committer:
phonemacro
Date:
Wed Feb 13 22:26:50 2019 +0000
Revision:
8:e310e55a687b
Parent:
7:92004aaa3e4d
Correct logic for negative values.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:4a3d6ac5042d 1 /*******************************************************************************
phonemacro 8:e310e55a687b 2 * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
phonemacro 0:4a3d6ac5042d 3 *
phonemacro 0:4a3d6ac5042d 4 * Permission is hereby granted, free of charge, to any person obtaining a
phonemacro 0:4a3d6ac5042d 5 * copy of this software and associated documentation files (the "Software"),
phonemacro 0:4a3d6ac5042d 6 * to deal in the Software without restriction, including without limitation
phonemacro 0:4a3d6ac5042d 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
phonemacro 0:4a3d6ac5042d 8 * and/or sell copies of the Software, and to permit persons to whom the
phonemacro 0:4a3d6ac5042d 9 * Software is furnished to do so, subject to the following conditions:
phonemacro 0:4a3d6ac5042d 10 *
phonemacro 0:4a3d6ac5042d 11 * The above copyright notice and this permission notice shall be included
phonemacro 0:4a3d6ac5042d 12 * in all copies or substantial portions of the Software.
phonemacro 0:4a3d6ac5042d 13 *
phonemacro 0:4a3d6ac5042d 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
phonemacro 0:4a3d6ac5042d 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
phonemacro 0:4a3d6ac5042d 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
phonemacro 0:4a3d6ac5042d 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
phonemacro 0:4a3d6ac5042d 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
phonemacro 0:4a3d6ac5042d 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
phonemacro 0:4a3d6ac5042d 20 * OTHER DEALINGS IN THE SOFTWARE.
phonemacro 0:4a3d6ac5042d 21 *
phonemacro 0:4a3d6ac5042d 22 * Except as contained in this notice, the name of Maxim Integrated
phonemacro 0:4a3d6ac5042d 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
phonemacro 0:4a3d6ac5042d 24 * Products, Inc. Branding Policy.
phonemacro 0:4a3d6ac5042d 25 *
phonemacro 0:4a3d6ac5042d 26 * The mere transfer of this software does not imply any licenses
phonemacro 0:4a3d6ac5042d 27 * of trade secrets, proprietary technology, copyrights, patents,
phonemacro 0:4a3d6ac5042d 28 * trademarks, maskwork rights, or any other form of intellectual
phonemacro 0:4a3d6ac5042d 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
phonemacro 0:4a3d6ac5042d 30 * ownership rights.
phonemacro 0:4a3d6ac5042d 31 *******************************************************************************
phonemacro 0:4a3d6ac5042d 32 * @file MAX31723.h
phonemacro 0:4a3d6ac5042d 33 *******************************************************************************
phonemacro 0:4a3d6ac5042d 34 */
phonemacro 0:4a3d6ac5042d 35 #ifndef MAX31723_H
phonemacro 0:4a3d6ac5042d 36 #define MAX31723_H
phonemacro 0:4a3d6ac5042d 37
phonemacro 0:4a3d6ac5042d 38 #include "mbed.h"
phonemacro 0:4a3d6ac5042d 39
phonemacro 0:4a3d6ac5042d 40 #define MAX31723_NO_ERROR 0
phonemacro 0:4a3d6ac5042d 41 #define MAX31723_ERROR -1
phonemacro 0:4a3d6ac5042d 42
phonemacro 0:4a3d6ac5042d 43 #define MAX31723_WRITE_MASK 0x80
phonemacro 0:4a3d6ac5042d 44
phonemacro 0:4a3d6ac5042d 45 #define MAX31723_REG_CFG 0x00
phonemacro 0:4a3d6ac5042d 46 #define MAX31723_REG_TEMP_LSB 0x01
phonemacro 0:4a3d6ac5042d 47 #define MAX31723_REG_TEMP_MSB 0x02
phonemacro 3:f39791139435 48 #define MAX31723_REG_TRIP_HI_LSB 0x03
phonemacro 3:f39791139435 49 #define MAX31723_REG_TRIP_HI_MSB 0x04
phonemacro 3:f39791139435 50 #define MAX31723_REG_TRIP_LO_LSB 0x05
phonemacro 3:f39791139435 51 #define MAX31723_REG_TRIP_LO_MSB 0x06
phonemacro 3:f39791139435 52 #define MAX31723_REG_MAX MAX31723_REG_TRIP_LO_MSB
phonemacro 0:4a3d6ac5042d 53
phonemacro 0:4a3d6ac5042d 54 /* Configuration, Status masks */
phonemacro 0:4a3d6ac5042d 55 #define MAX31723_CFG_CONTINUOUS 0x00
phonemacro 0:4a3d6ac5042d 56 #define MAX31723_CFG_STANDBY 0x01
phonemacro 0:4a3d6ac5042d 57
phonemacro 0:4a3d6ac5042d 58 #define MAX31723_CFG_RESOLUTION_9BIT 0x00
phonemacro 0:4a3d6ac5042d 59 #define MAX31723_CFG_RESOLUTION_10BIT 0x02
phonemacro 0:4a3d6ac5042d 60 #define MAX31723_CFG_RESOLUTION_11BIT 0x04
phonemacro 0:4a3d6ac5042d 61 #define MAX31723_CFG_RESOLUTION_12BIT 0x06
phonemacro 6:2e49aa7fa091 62 #define MAX31723_CFG_RESOLUTION_MASK 0x06
phonemacro 0:4a3d6ac5042d 63
phonemacro 0:4a3d6ac5042d 64 #define MAX31723_CFG_TM_MODE_INTERRUPT 0x08
phonemacro 0:4a3d6ac5042d 65 #define MAX31723_CFG_1SHOT 0x10
phonemacro 0:4a3d6ac5042d 66 #define MAX31723_CFG_NVB_NVRAM_BUSY 0x20
phonemacro 0:4a3d6ac5042d 67 #define MAX31723_CFG_MEMW_CFG_WR_EEPROM 0x40
phonemacro 0:4a3d6ac5042d 68
phonemacro 3:f39791139435 69 #define MAX31723_CONV_TIME_MSEC_9BIT 0.025
phonemacro 3:f39791139435 70 #define MAX31723_CONV_TIME_MSEC_10BIT 0.050
phonemacro 3:f39791139435 71 #define MAX31723_CONV_TIME_MSEC_11BIT 0.100
phonemacro 3:f39791139435 72 #define MAX31723_CONV_TIME_MSEC_12BIT 0.200
phonemacro 3:f39791139435 73
phonemacro 3:f39791139435 74 #define MAX31723_NVRAM_WRITE_TIME_MSEC 0.015
phonemacro 3:f39791139435 75
phonemacro 6:2e49aa7fa091 76 #define MAX31723_CF_LSB (0.00390625f)
phonemacro 0:4a3d6ac5042d 77
phonemacro 0:4a3d6ac5042d 78 /**
phonemacro 6:2e49aa7fa091 79 * @brief 9-bit to 12bit device temperature sensor with digital-to-analog converters (DACs)
phonemacro 6:2e49aa7fa091 80 * for the MAX31723.
phonemacro 8:e310e55a687b 81 * @version 1.0000.0004
phonemacro 6:2e49aa7fa091 82 *
phonemacro 6:2e49aa7fa091 83 * @details The MAX31722/MAX31723 provides device temperature readings
phonemacro 6:2e49aa7fa091 84 * for thermostats and thermometers. Communications may be either SPI or
phonemacro 6:2e49aa7fa091 85 * 3-wire. There are two operating modes available: comparator or interrupt.
phonemacro 6:2e49aa7fa091 86 * Temperature limits may be stored in NVRAM so that the TOUT_N pin can be
phonemacro 6:2e49aa7fa091 87 * triggered when the limits are exceeded while in the comparator mode.
phonemacro 6:2e49aa7fa091 88 * Typically applications are for temperature sensitive systems.
phonemacro 6:2e49aa7fa091 89 *
phonemacro 6:2e49aa7fa091 90 * @code
phonemacro 6:2e49aa7fa091 91 * #include "mbed.h"
phonemacro 6:2e49aa7fa091 92 * #include "max32630fthr.h"
phonemacro 6:2e49aa7fa091 93 * #include "max31723.h"
phonemacro 6:2e49aa7fa091 94 * #include "USBSerial.h"
phonemacro 6:2e49aa7fa091 95 *
phonemacro 6:2e49aa7fa091 96 * MAX32630FTHR pegasus(MAX32630FTHR::VIO_1V8);
phonemacro 6:2e49aa7fa091 97 *
phonemacro 6:2e49aa7fa091 98 * DigitalOut gLED(LED2);
phonemacro 6:2e49aa7fa091 99 *
phonemacro 6:2e49aa7fa091 100 * DigitalOut selectPin(P3_0);
phonemacro 6:2e49aa7fa091 101 * SPI spi(P5_1, P5_2, P5_0);
phonemacro 6:2e49aa7fa091 102 *
phonemacro 6:2e49aa7fa091 103 * int main()
phonemacro 6:2e49aa7fa091 104 * {
phonemacro 6:2e49aa7fa091 105 * int i, ret;
phonemacro 6:2e49aa7fa091 106 * float temperature;
phonemacro 6:2e49aa7fa091 107 * DigitalOut gLED(LED2, LED_OFF);
phonemacro 6:2e49aa7fa091 108 * printf("MAX31723 Temperature Sensor example code.\r\n");
phonemacro 6:2e49aa7fa091 109 * printf("\r\n");
phonemacro 6:2e49aa7fa091 110 *
phonemacro 6:2e49aa7fa091 111 * gLED = LED_ON;
phonemacro 6:2e49aa7fa091 112 *
phonemacro 6:2e49aa7fa091 113 * MAX31723 temp_sensor(spi, selectPin);
phonemacro 6:2e49aa7fa091 114 * spi.format(8,3);
phonemacro 6:2e49aa7fa091 115 * spi.frequency(5000000);
phonemacro 6:2e49aa7fa091 116 * ret = temp_sensor.perform_one_shot_int(MAX31723_CFG_RESOLUTION_12BIT);
phonemacro 6:2e49aa7fa091 117 *
phonemacro 6:2e49aa7fa091 118 * for (i = 0; i < 5; i++) {
phonemacro 6:2e49aa7fa091 119 * ret = temp_sensor.perform_one_shot_int(MAX31723_CFG_RESOLUTION_12BIT);
phonemacro 6:2e49aa7fa091 120 * wait(MAX31723_CONV_TIME_MSEC_12BIT);
phonemacro 6:2e49aa7fa091 121 * temperature = temp_sensor.read_temperature();
phonemacro 6:2e49aa7fa091 122 * printf("Temperature = %4.4f Celsius, %4.4f Fahrenheit\r\n",
phonemacro 6:2e49aa7fa091 123 * temperature, temp_sensor.celsius_to_fahrenheit(temperature));
phonemacro 6:2e49aa7fa091 124 * wait(2);
phonemacro 6:2e49aa7fa091 125 * }
phonemacro 6:2e49aa7fa091 126 * printf("Configuration Register = 0x%02Xh \r\n", temp_sensor.read_cfg());
phonemacro 6:2e49aa7fa091 127 * }
phonemacro 6:2e49aa7fa091 128 *
phonemacro 6:2e49aa7fa091 129 */
phonemacro 0:4a3d6ac5042d 130
phonemacro 0:4a3d6ac5042d 131 class MAX31723{
phonemacro 0:4a3d6ac5042d 132 public:
phonemacro 0:4a3d6ac5042d 133
phonemacro 0:4a3d6ac5042d 134 /**************************************************************
phonemacro 0:4a3d6ac5042d 135 * @brief Constructor for MAX31723 Class.
phonemacro 0:4a3d6ac5042d 136 *
phonemacro 0:4a3d6ac5042d 137 * @details Requires an existing SPI object as well as a DigitalOut object.
phonemacro 0:4a3d6ac5042d 138 * The DigitalOut object is used for a chip enable signal
phonemacro 0:4a3d6ac5042d 139 *
phonemacro 0:4a3d6ac5042d 140 * On Entry:
phonemacro 0:4a3d6ac5042d 141 * @param[in] spi - pointer to existing SPI object
phonemacro 0:4a3d6ac5042d 142 * @param[in] ce_pin - pointer to a DigitalOut pin object
phonemacro 0:4a3d6ac5042d 143 *
phonemacro 0:4a3d6ac5042d 144 * On Exit:
phonemacro 0:4a3d6ac5042d 145 *
phonemacro 0:4a3d6ac5042d 146 * @return None
phonemacro 0:4a3d6ac5042d 147 ***************************************************************
phonemacro 0:4a3d6ac5042d 148 */
phonemacro 0:4a3d6ac5042d 149 MAX31723(SPI &spi, DigitalOut &ce_pin);
phonemacro 0:4a3d6ac5042d 150
phonemacro 0:4a3d6ac5042d 151 /**
phonemacro 6:2e49aa7fa091 152 * @brief Reads the register
phonemacro 6:2e49aa7fa091 153 * @param &val - register value
phonemacro 6:2e49aa7fa091 154 * @param reg - address of the register
phonemacro 4:ac75d4d62471 155 * @return 0 on success, negative number on failure
phonemacro 4:ac75d4d62471 156 */
phonemacro 4:ac75d4d62471 157 int read_reg(uint8_t &val, uint8_t reg);
phonemacro 4:ac75d4d62471 158
phonemacro 4:ac75d4d62471 159 /**
phonemacro 6:2e49aa7fa091 160 * @brief Reads the configuration register
phonemacro 6:2e49aa7fa091 161 * @return value of the configuration register
phonemacro 6:2e49aa7fa091 162 */
phonemacro 6:2e49aa7fa091 163 uint8_t read_cfg();
phonemacro 6:2e49aa7fa091 164
phonemacro 6:2e49aa7fa091 165 /**
phonemacro 6:2e49aa7fa091 166 * @brief Reads the temperature register
phonemacro 6:2e49aa7fa091 167 * @return temperature in degrees Celsius
phonemacro 6:2e49aa7fa091 168 */
phonemacro 6:2e49aa7fa091 169 float read_temperature(void);
phonemacro 6:2e49aa7fa091 170
phonemacro 6:2e49aa7fa091 171 /**
phonemacro 6:2e49aa7fa091 172 * @brief Reads the trip low temperature register
phonemacro 6:2e49aa7fa091 173 * @return trip low temperature in degrees Celsius
phonemacro 6:2e49aa7fa091 174 */
phonemacro 6:2e49aa7fa091 175 float read_trip_low(void);
phonemacro 6:2e49aa7fa091 176
phonemacro 6:2e49aa7fa091 177 /**
phonemacro 6:2e49aa7fa091 178 * @brief Reads the trip high temperature register
phonemacro 6:2e49aa7fa091 179 * @return trip high temperature in degrees Celsius
phonemacro 6:2e49aa7fa091 180 */
phonemacro 6:2e49aa7fa091 181 float read_trip_high(void);
phonemacro 6:2e49aa7fa091 182
phonemacro 6:2e49aa7fa091 183 /**
phonemacro 6:2e49aa7fa091 184 * @brief Writes to the configuration register
phonemacro 6:2e49aa7fa091 185 * @param val - the configuration value
phonemacro 0:4a3d6ac5042d 186 * @return 0 on success, negative number on failure
phonemacro 0:4a3d6ac5042d 187 */
phonemacro 6:2e49aa7fa091 188 int write_cfg(uint8_t val);
phonemacro 6:2e49aa7fa091 189
phonemacro 6:2e49aa7fa091 190 /**
phonemacro 6:2e49aa7fa091 191 * @brief Writes to the Tlow register (the write takes 30 msec)
phonemacro 6:2e49aa7fa091 192 * @param temperature - the temperature in Celsius degrees
phonemacro 6:2e49aa7fa091 193 * @return 0 on success, negative number on failure
phonemacro 6:2e49aa7fa091 194 */
phonemacro 6:2e49aa7fa091 195 int write_trip_low(float temperature);
phonemacro 6:2e49aa7fa091 196
phonemacro 6:2e49aa7fa091 197 /**
phonemacro 6:2e49aa7fa091 198 * @brief Writes to the Thigh register (the write takes 30 msec)
phonemacro 6:2e49aa7fa091 199 * @param temperature - the temperature in Celsius degrees
phonemacro 6:2e49aa7fa091 200 * @return 0 on success, negative number on failure
phonemacro 6:2e49aa7fa091 201 */
phonemacro 6:2e49aa7fa091 202 int write_trip_high(float temperature);
phonemacro 0:4a3d6ac5042d 203
phonemacro 0:4a3d6ac5042d 204 /**
phonemacro 3:f39791139435 205 * @brief Reads the temperature registers
phonemacro 6:2e49aa7fa091 206 * @param reg - the address of the temperature register
phonemacro 6:2e49aa7fa091 207 * @return temprature in degrees Celsius
phonemacro 0:4a3d6ac5042d 208 */
phonemacro 3:f39791139435 209 float read_reg_as_temperature(uint8_t reg);
phonemacro 0:4a3d6ac5042d 210
phonemacro 0:4a3d6ac5042d 211 /**
phonemacro 0:4a3d6ac5042d 212 * @brief Configures the device to perform a one-shot temperature reading
phonemacro 2:7a20e65da621 213 * and places the device in standby mode, interrupt mode.
phonemacro 0:4a3d6ac5042d 214 * @param resolution - the resolution of the calculation is set to this
phonemacro 0:4a3d6ac5042d 215 * @return 0 on success, negative number on failure
phonemacro 0:4a3d6ac5042d 216 */
phonemacro 2:7a20e65da621 217 int perform_one_shot_int(uint8_t resolution);
phonemacro 0:4a3d6ac5042d 218
phonemacro 0:4a3d6ac5042d 219 /**
phonemacro 3:f39791139435 220 * @brief Configures the device to perform a one-shot temperature reading
phonemacro 3:f39791139435 221 * and places the device in standby mode, comparator mode.
phonemacro 3:f39791139435 222 * @param resolution - the resolution of the calculation is set to this
phonemacro 3:f39791139435 223 * @return 0 on success, negative number on failure
phonemacro 3:f39791139435 224 */
phonemacro 3:f39791139435 225 int perform_one_shot_comparator(uint8_t resolution);
phonemacro 3:f39791139435 226
phonemacro 3:f39791139435 227 /**
phonemacro 0:4a3d6ac5042d 228 * @brief Converts Celcius degrees to Fahrenheit
phonemacro 0:4a3d6ac5042d 229 * @param temp_c - the temperature in Celsius degrees
phonemacro 0:4a3d6ac5042d 230 * @return 0 on success, negative number on failure
phonemacro 0:4a3d6ac5042d 231 */
phonemacro 0:4a3d6ac5042d 232 float celsius_to_fahrenheit(float temp_c);
phonemacro 0:4a3d6ac5042d 233
phonemacro 0:4a3d6ac5042d 234 /************************************************************
phonemacro 0:4a3d6ac5042d 235 * @brief Default destructor for MAX31723 Class.
phonemacro 0:4a3d6ac5042d 236 *
phonemacro 0:4a3d6ac5042d 237 * @details Destroys SPI object if owner
phonemacro 0:4a3d6ac5042d 238 *
phonemacro 0:4a3d6ac5042d 239 * On Entry:
phonemacro 0:4a3d6ac5042d 240 *
phonemacro 0:4a3d6ac5042d 241 * On Exit:
phonemacro 0:4a3d6ac5042d 242 *
phonemacro 0:4a3d6ac5042d 243 * @return None
phonemacro 0:4a3d6ac5042d 244 *************************************************************
phonemacro 0:4a3d6ac5042d 245 */
phonemacro 0:4a3d6ac5042d 246 ~MAX31723();
phonemacro 6:2e49aa7fa091 247
phonemacro 3:f39791139435 248 protected:
phonemacro 3:f39791139435 249 /**
phonemacro 3:f39791139435 250 * @brief Configures the device to perform a one-shot temperature reading
phonemacro 3:f39791139435 251 * and places the device in standby mode, interrupt mode.
phonemacro 3:f39791139435 252 * @param resolution - the resolution of the calculation is set to this
phonemacro 3:f39791139435 253 * @return 0 on success, negative number on failure
phonemacro 3:f39791139435 254 */
phonemacro 3:f39791139435 255 int perform_one_shot(uint8_t resolution, uint8_t interrupt_mode);
phonemacro 3:f39791139435 256
phonemacro 0:4a3d6ac5042d 257 private:
phonemacro 6:2e49aa7fa091 258 /**
phonemacro 6:2e49aa7fa091 259 * @brief Write a value to a register
phonemacro 6:2e49aa7fa091 260 * @param val - 8-bit value to write to the register
phonemacro 6:2e49aa7fa091 261 * @param reg - register address
phonemacro 6:2e49aa7fa091 262 * @return 0 on success, negative number on failure
phonemacro 6:2e49aa7fa091 263 */
phonemacro 6:2e49aa7fa091 264 int write_reg(uint8_t val, uint8_t reg);
phonemacro 3:f39791139435 265
phonemacro 6:2e49aa7fa091 266 /** @var m_spi
phonemacro 6:2e49aa7fa091 267 * @brief SPI object
phonemacro 6:2e49aa7fa091 268 */
phonemacro 0:4a3d6ac5042d 269 SPI &m_spi;
phonemacro 6:2e49aa7fa091 270
phonemacro 6:2e49aa7fa091 271 /** @var m_chip_enable
phonemacro 6:2e49aa7fa091 272 * @brief Chip Enable pin
phonemacro 6:2e49aa7fa091 273 */
phonemacro 3:f39791139435 274 /* chip enable pin */
phonemacro 6:2e49aa7fa091 275
phonemacro 0:4a3d6ac5042d 276 DigitalOut &m_chip_enable;
phonemacro 0:4a3d6ac5042d 277 };
phonemacro 0:4a3d6ac5042d 278
phonemacro 0:4a3d6ac5042d 279 #endif