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:
6:2e49aa7fa091
Correct logic for negative values.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:4a3d6ac5042d 1 /*******************************************************************************
phonemacro 0:4a3d6ac5042d 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 */
phonemacro 0:4a3d6ac5042d 33 #include "max31723.h"
phonemacro 6:2e49aa7fa091 34 #include "USBSerial.h"
phonemacro 3:f39791139435 35 union max31723_raw_data {
phonemacro 3:f39791139435 36 struct {
phonemacro 3:f39791139435 37 uint8_t lsb;
phonemacro 3:f39791139435 38 uint8_t msb;
phonemacro 3:f39791139435 39 };
phonemacro 8:e310e55a687b 40 struct {
phonemacro 8:e310e55a687b 41 uint16_t magnitude_bits:15;
phonemacro 8:e310e55a687b 42 uint16_t sign_bit:1;
phonemacro 8:e310e55a687b 43 };
phonemacro 4:ac75d4d62471 44 uint16_t uwrd;
phonemacro 4:ac75d4d62471 45 int16_t swrd;
phonemacro 3:f39791139435 46 };
phonemacro 0:4a3d6ac5042d 47
phonemacro 0:4a3d6ac5042d 48 MAX31723::MAX31723(SPI &spi, DigitalOut &ce_pin) : m_spi(spi), m_chip_enable(ce_pin)
phonemacro 0:4a3d6ac5042d 49 {
phonemacro 0:4a3d6ac5042d 50 m_chip_enable = 0;
phonemacro 0:4a3d6ac5042d 51 }
phonemacro 0:4a3d6ac5042d 52
phonemacro 6:2e49aa7fa091 53
phonemacro 6:2e49aa7fa091 54 int MAX31723::read_reg(uint8_t &val, uint8_t reg)
phonemacro 6:2e49aa7fa091 55 {
phonemacro 6:2e49aa7fa091 56 if (reg <= MAX31723_REG_MAX) {
phonemacro 6:2e49aa7fa091 57 m_chip_enable = 1;
phonemacro 6:2e49aa7fa091 58 m_spi.write(reg);
phonemacro 6:2e49aa7fa091 59 val = m_spi.write(0);
phonemacro 6:2e49aa7fa091 60 m_chip_enable = 0;
phonemacro 6:2e49aa7fa091 61 return MAX31723_NO_ERROR;
phonemacro 6:2e49aa7fa091 62 } else {
phonemacro 6:2e49aa7fa091 63 printf("Input read_reg is invalid, 0x%02X \r\n", reg);
phonemacro 6:2e49aa7fa091 64 return MAX31723_ERROR;
phonemacro 6:2e49aa7fa091 65 }
phonemacro 6:2e49aa7fa091 66 }
phonemacro 6:2e49aa7fa091 67
phonemacro 6:2e49aa7fa091 68 uint8_t MAX31723::read_cfg()
phonemacro 6:2e49aa7fa091 69 {
phonemacro 6:2e49aa7fa091 70 uint8_t cfg;
phonemacro 6:2e49aa7fa091 71 read_reg(cfg, MAX31723_REG_CFG);
phonemacro 6:2e49aa7fa091 72 return cfg;
phonemacro 6:2e49aa7fa091 73 }
phonemacro 6:2e49aa7fa091 74
phonemacro 6:2e49aa7fa091 75 float MAX31723::read_reg_as_temperature(uint8_t reg)
phonemacro 6:2e49aa7fa091 76 {
phonemacro 8:e310e55a687b 77 max31723_raw_data tmp;
phonemacro 6:2e49aa7fa091 78 float temperature;
phonemacro 6:2e49aa7fa091 79 if (reg >= MAX31723_REG_TEMP_LSB && reg <= MAX31723_REG_MAX) {
phonemacro 8:e310e55a687b 80 read_reg(tmp.lsb, reg);
phonemacro 8:e310e55a687b 81 read_reg(tmp.msb, reg+1);
phonemacro 8:e310e55a687b 82 temperature = tmp.magnitude_bits * MAX31723_CF_LSB;
phonemacro 8:e310e55a687b 83 if (tmp.sign_bit)
phonemacro 8:e310e55a687b 84 temperature = -temperature;
phonemacro 6:2e49aa7fa091 85 return temperature;
phonemacro 6:2e49aa7fa091 86 } else {
phonemacro 6:2e49aa7fa091 87 printf("Input read_registers_as_temperature is invalid, %d r\n",
phonemacro 6:2e49aa7fa091 88 reg);
phonemacro 6:2e49aa7fa091 89 return 0;
phonemacro 6:2e49aa7fa091 90 }
phonemacro 6:2e49aa7fa091 91 }
phonemacro 6:2e49aa7fa091 92
phonemacro 6:2e49aa7fa091 93 float MAX31723::read_temperature(void)
phonemacro 6:2e49aa7fa091 94 {
phonemacro 6:2e49aa7fa091 95 return read_reg_as_temperature(MAX31723_REG_TEMP_LSB);
phonemacro 6:2e49aa7fa091 96 }
phonemacro 6:2e49aa7fa091 97
phonemacro 6:2e49aa7fa091 98 float MAX31723::read_trip_low(void)
phonemacro 6:2e49aa7fa091 99 {
phonemacro 6:2e49aa7fa091 100 return read_reg_as_temperature(MAX31723_REG_TRIP_LO_LSB);
phonemacro 6:2e49aa7fa091 101 }
phonemacro 6:2e49aa7fa091 102
phonemacro 6:2e49aa7fa091 103 float MAX31723::read_trip_high(void)
phonemacro 6:2e49aa7fa091 104 {
phonemacro 6:2e49aa7fa091 105 return read_reg_as_temperature(MAX31723_REG_TRIP_HI_LSB);
phonemacro 6:2e49aa7fa091 106 }
phonemacro 6:2e49aa7fa091 107
phonemacro 0:4a3d6ac5042d 108 int MAX31723::write_reg(uint8_t val, uint8_t reg)
phonemacro 0:4a3d6ac5042d 109 {
phonemacro 4:ac75d4d62471 110 if (reg == (MAX31723_REG_CFG | MAX31723_WRITE_MASK) ||
phonemacro 4:ac75d4d62471 111 (reg >= (MAX31723_REG_TRIP_HI_LSB | MAX31723_WRITE_MASK) &&
phonemacro 4:ac75d4d62471 112 reg <= (MAX31723_REG_MAX | MAX31723_WRITE_MASK)) ) {
phonemacro 4:ac75d4d62471 113 m_chip_enable = 1;
phonemacro 4:ac75d4d62471 114 m_spi.write(reg);
phonemacro 4:ac75d4d62471 115 m_spi.write(val);
phonemacro 4:ac75d4d62471 116 m_chip_enable = 0;
phonemacro 4:ac75d4d62471 117 return MAX31723_NO_ERROR;
phonemacro 4:ac75d4d62471 118 } else {
phonemacro 4:ac75d4d62471 119 printf("Input write_reg is invalid, 0x%02X \r\n", reg);
phonemacro 4:ac75d4d62471 120 return MAX31723_ERROR;
phonemacro 4:ac75d4d62471 121 }
phonemacro 0:4a3d6ac5042d 122 }
phonemacro 0:4a3d6ac5042d 123
phonemacro 6:2e49aa7fa091 124 int MAX31723::write_cfg(uint8_t val)
phonemacro 0:4a3d6ac5042d 125 {
phonemacro 4:ac75d4d62471 126 m_chip_enable = 1;
phonemacro 6:2e49aa7fa091 127 m_spi.write(MAX31723_REG_CFG );
phonemacro 6:2e49aa7fa091 128 m_spi.write(val);
phonemacro 4:ac75d4d62471 129 m_chip_enable = 0;
phonemacro 4:ac75d4d62471 130 return MAX31723_NO_ERROR;
phonemacro 6:2e49aa7fa091 131 }
phonemacro 6:2e49aa7fa091 132
phonemacro 6:2e49aa7fa091 133
phonemacro 6:2e49aa7fa091 134 int MAX31723::write_trip_low(float temperature)
phonemacro 6:2e49aa7fa091 135 {
phonemacro 6:2e49aa7fa091 136 int ret;
phonemacro 6:2e49aa7fa091 137 max31723_raw_data raw;
phonemacro 8:e310e55a687b 138 raw.uwrd = 0;
phonemacro 8:e310e55a687b 139 if (temperature < 0) {
phonemacro 8:e310e55a687b 140 raw.sign_bit = 1;
phonemacro 8:e310e55a687b 141 temperature = -temperature;
phonemacro 8:e310e55a687b 142 }
phonemacro 6:2e49aa7fa091 143 temperature /= MAX31723_CF_LSB;
phonemacro 8:e310e55a687b 144 raw.magnitude_bits = uint16_t(temperature);
phonemacro 6:2e49aa7fa091 145 ret = write_reg(raw.lsb, MAX31723_WRITE_MASK | MAX31723_REG_TRIP_LO_LSB);
phonemacro 6:2e49aa7fa091 146 wait(.015);
phonemacro 6:2e49aa7fa091 147 ret = write_reg(raw.msb, MAX31723_WRITE_MASK | MAX31723_REG_TRIP_LO_MSB);
phonemacro 6:2e49aa7fa091 148 wait(.015);
phonemacro 6:2e49aa7fa091 149 return ret;
phonemacro 0:4a3d6ac5042d 150 }
phonemacro 0:4a3d6ac5042d 151
phonemacro 6:2e49aa7fa091 152 int MAX31723::write_trip_high(float temperature)
phonemacro 6:2e49aa7fa091 153 {
phonemacro 6:2e49aa7fa091 154 int ret;
phonemacro 6:2e49aa7fa091 155 max31723_raw_data raw;
phonemacro 8:e310e55a687b 156 raw.uwrd = 0;
phonemacro 8:e310e55a687b 157 if (temperature < 0) {
phonemacro 8:e310e55a687b 158 raw.sign_bit = 1;
phonemacro 8:e310e55a687b 159 temperature = -temperature;
phonemacro 8:e310e55a687b 160 }
phonemacro 6:2e49aa7fa091 161 temperature /= MAX31723_CF_LSB;
phonemacro 8:e310e55a687b 162 raw.magnitude_bits = uint16_t(temperature);
phonemacro 6:2e49aa7fa091 163 ret = write_reg(raw.lsb, MAX31723_WRITE_MASK | MAX31723_REG_TRIP_HI_LSB);
phonemacro 6:2e49aa7fa091 164 wait(.015);
phonemacro 6:2e49aa7fa091 165 ret = write_reg(raw.msb, MAX31723_WRITE_MASK | MAX31723_REG_TRIP_HI_MSB);
phonemacro 6:2e49aa7fa091 166 wait(.015);
phonemacro 6:2e49aa7fa091 167 return ret;
phonemacro 6:2e49aa7fa091 168 }
phonemacro 6:2e49aa7fa091 169
phonemacro 6:2e49aa7fa091 170
phonemacro 3:f39791139435 171 int MAX31723::perform_one_shot(uint8_t resolution, uint8_t interrupt_mode)
phonemacro 0:4a3d6ac5042d 172 {
phonemacro 2:7a20e65da621 173 if (resolution <= MAX31723_CFG_RESOLUTION_12BIT) {
phonemacro 2:7a20e65da621 174 write_reg(0, MAX31723_REG_CFG | MAX31723_WRITE_MASK);
phonemacro 3:f39791139435 175 write_reg(interrupt_mode | MAX31723_CFG_1SHOT |
phonemacro 2:7a20e65da621 176 resolution | MAX31723_CFG_STANDBY,
phonemacro 0:4a3d6ac5042d 177 MAX31723_REG_CFG | MAX31723_WRITE_MASK);
phonemacro 2:7a20e65da621 178 } else
phonemacro 0:4a3d6ac5042d 179 return MAX31723_ERROR;
phonemacro 0:4a3d6ac5042d 180 return MAX31723_NO_ERROR;
phonemacro 0:4a3d6ac5042d 181 }
phonemacro 0:4a3d6ac5042d 182
phonemacro 3:f39791139435 183 int MAX31723::perform_one_shot_int(uint8_t resolution)
phonemacro 0:4a3d6ac5042d 184 {
phonemacro 3:f39791139435 185 int ret;
phonemacro 3:f39791139435 186 ret = perform_one_shot(resolution, MAX31723_CFG_TM_MODE_INTERRUPT);
phonemacro 3:f39791139435 187 return ret;
phonemacro 3:f39791139435 188 }
phonemacro 3:f39791139435 189
phonemacro 3:f39791139435 190 int MAX31723::perform_one_shot_comparator(uint8_t resolution)
phonemacro 3:f39791139435 191 {
phonemacro 3:f39791139435 192 int ret;
phonemacro 3:f39791139435 193 ret = perform_one_shot(resolution, 0);
phonemacro 3:f39791139435 194 return ret;
phonemacro 0:4a3d6ac5042d 195 }
phonemacro 0:4a3d6ac5042d 196
phonemacro 0:4a3d6ac5042d 197
phonemacro 0:4a3d6ac5042d 198 float MAX31723::celsius_to_fahrenheit(float temp_c)
phonemacro 0:4a3d6ac5042d 199 {
phonemacro 0:4a3d6ac5042d 200 float temp_f;
phonemacro 0:4a3d6ac5042d 201 temp_f = ((temp_c * 9)/5) + 32;
phonemacro 0:4a3d6ac5042d 202 return temp_f;
phonemacro 0:4a3d6ac5042d 203 }
phonemacro 0:4a3d6ac5042d 204
phonemacro 0:4a3d6ac5042d 205 MAX31723::~MAX31723(void)
phonemacro 0:4a3d6ac5042d 206 {
phonemacro 0:4a3d6ac5042d 207 //empty block
phonemacro 0:4a3d6ac5042d 208 }
phonemacro 0:4a3d6ac5042d 209