Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TMP117.cpp@4:0e3e93c26d83, 2020-10-06 (annotated)
- Committer:
- glsfacom
- Date:
- Tue Oct 06 09:41:35 2020 -0400
- Revision:
- 4:0e3e93c26d83
- Parent:
- 3:23ecb85b6e8b
multiple TMP done, no MLX
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
glsfacom | 3:23ecb85b6e8b | 1 | /*! |
glsfacom | 3:23ecb85b6e8b | 2 | * @file TMP117.cpp |
glsfacom | 3:23ecb85b6e8b | 3 | * @author Nils Minor |
glsfacom | 3:23ecb85b6e8b | 4 | * |
glsfacom | 3:23ecb85b6e8b | 5 | * @license GNU GENERAL PUBLIC LICENSE (see license.txt) |
glsfacom | 3:23ecb85b6e8b | 6 | * |
glsfacom | 3:23ecb85b6e8b | 7 | * v1.0.0 - Initial library version |
glsfacom | 3:23ecb85b6e8b | 8 | * |
glsfacom | 3:23ecb85b6e8b | 9 | * |
glsfacom | 3:23ecb85b6e8b | 10 | */ |
glsfacom | 3:23ecb85b6e8b | 11 | #include "TMP117.h" |
glsfacom | 3:23ecb85b6e8b | 12 | |
glsfacom | 3:23ecb85b6e8b | 13 | /*! |
glsfacom | 3:23ecb85b6e8b | 14 | @brief Constructor |
glsfacom | 3:23ecb85b6e8b | 15 | @param addr device I2C address [0x48 - 0x4B] |
glsfacom | 3:23ecb85b6e8b | 16 | */ |
glsfacom | 4:0e3e93c26d83 | 17 | TMP117::TMP117 (uint8_t tmp_quant) |
glsfacom | 4:0e3e93c26d83 | 18 | { |
glsfacom | 4:0e3e93c26d83 | 19 | TMP117::tmp_quant = tmp_quant; |
glsfacom | 3:23ecb85b6e8b | 20 | alert_pin = -1; |
glsfacom | 3:23ecb85b6e8b | 21 | alert_type = NOALERT; |
glsfacom | 3:23ecb85b6e8b | 22 | newDataCallback = NULL; |
glsfacom | 3:23ecb85b6e8b | 23 | } |
glsfacom | 3:23ecb85b6e8b | 24 | |
glsfacom | 3:23ecb85b6e8b | 25 | /*! |
glsfacom | 3:23ecb85b6e8b | 26 | @brief Initialize in default mode |
glsfacom | 3:23ecb85b6e8b | 27 | @param _newDataCallback callback function will be called when new data is available |
glsfacom | 3:23ecb85b6e8b | 28 | */ |
glsfacom | 4:0e3e93c26d83 | 29 | void TMP117::init ( void (*_newDataCallback) (void), int addr ) { |
glsfacom | 4:0e3e93c26d83 | 30 | setConvMode (CONTINUOUS, addr); |
glsfacom | 4:0e3e93c26d83 | 31 | setConvTime (C125mS, addr); |
glsfacom | 4:0e3e93c26d83 | 32 | setAveraging (AVE8, addr); |
glsfacom | 4:0e3e93c26d83 | 33 | setAlertMode (DATA, addr); |
glsfacom | 4:0e3e93c26d83 | 34 | setOffsetTemperature(0, addr); |
glsfacom | 3:23ecb85b6e8b | 35 | |
glsfacom | 3:23ecb85b6e8b | 36 | newDataCallback = _newDataCallback; |
glsfacom | 3:23ecb85b6e8b | 37 | } |
glsfacom | 3:23ecb85b6e8b | 38 | |
glsfacom | 3:23ecb85b6e8b | 39 | /*! |
glsfacom | 3:23ecb85b6e8b | 40 | @brief Read configuration register and handle events. |
glsfacom | 3:23ecb85b6e8b | 41 | Should be called in loop in order to call callback functions |
glsfacom | 3:23ecb85b6e8b | 42 | */ |
glsfacom | 3:23ecb85b6e8b | 43 | void TMP117::update (void) { |
glsfacom | 3:23ecb85b6e8b | 44 | readConfig (); |
glsfacom | 3:23ecb85b6e8b | 45 | } |
glsfacom | 3:23ecb85b6e8b | 46 | |
glsfacom | 3:23ecb85b6e8b | 47 | /*! |
glsfacom | 3:23ecb85b6e8b | 48 | @brief Performs a soft reset. All default values will be loaded to the configuration register |
glsfacom | 3:23ecb85b6e8b | 49 | */ |
glsfacom | 4:0e3e93c26d83 | 50 | void TMP117::softReset ( int addr ) { |
glsfacom | 3:23ecb85b6e8b | 51 | uint16_t reg_value = 0; |
glsfacom | 3:23ecb85b6e8b | 52 | reg_value |= 1UL << 1; |
glsfacom | 4:0e3e93c26d83 | 53 | writeConfig ( reg_value, addr ); |
glsfacom | 3:23ecb85b6e8b | 54 | } |
glsfacom | 3:23ecb85b6e8b | 55 | |
glsfacom | 3:23ecb85b6e8b | 56 | /*! |
glsfacom | 3:23ecb85b6e8b | 57 | @brief Set alert pin mode |
glsfacom | 3:23ecb85b6e8b | 58 | |
glsfacom | 3:23ecb85b6e8b | 59 | @param mode TMP117_PMODE [Thermal-Alert-Data] |
glsfacom | 3:23ecb85b6e8b | 60 | */ |
glsfacom | 4:0e3e93c26d83 | 61 | void TMP117::setAlertMode ( TMP117_PMODE mode, int addr) { |
glsfacom | 3:23ecb85b6e8b | 62 | uint16_t reg_value = readConfig (); |
glsfacom | 3:23ecb85b6e8b | 63 | if (mode == THERMAL) { |
glsfacom | 3:23ecb85b6e8b | 64 | reg_value |= 1UL << 4; // change to thermal mode |
glsfacom | 3:23ecb85b6e8b | 65 | reg_value &= ~(1UL << 2); // set pin as alert flag |
glsfacom | 3:23ecb85b6e8b | 66 | reg_value &= ~(1UL << 3); // alert pin low active |
glsfacom | 3:23ecb85b6e8b | 67 | } |
glsfacom | 3:23ecb85b6e8b | 68 | else if (mode == ALERT) { |
glsfacom | 3:23ecb85b6e8b | 69 | reg_value &= ~(1UL << 4); // change to alert mode |
glsfacom | 3:23ecb85b6e8b | 70 | reg_value &= ~(1UL << 2); // set pin as alert flag |
glsfacom | 3:23ecb85b6e8b | 71 | reg_value &= ~(1UL << 3); // alert pin low active |
glsfacom | 3:23ecb85b6e8b | 72 | } |
glsfacom | 3:23ecb85b6e8b | 73 | else if (mode == DATA) { |
glsfacom | 3:23ecb85b6e8b | 74 | reg_value |= 1UL << 2; // set pin as data ready flag |
glsfacom | 3:23ecb85b6e8b | 75 | } |
glsfacom | 4:0e3e93c26d83 | 76 | writeConfig ( reg_value, addr ); |
glsfacom | 3:23ecb85b6e8b | 77 | } |
glsfacom | 3:23ecb85b6e8b | 78 | |
glsfacom | 3:23ecb85b6e8b | 79 | ///*! |
glsfacom | 3:23ecb85b6e8b | 80 | // @brief Set alert callback function and ISR pin |
glsfacom | 3:23ecb85b6e8b | 81 | // @param *allert_callback callback function |
glsfacom | 3:23ecb85b6e8b | 82 | // @param pin callback pin (INT?) |
glsfacom | 3:23ecb85b6e8b | 83 | //*/ |
glsfacom | 3:23ecb85b6e8b | 84 | //void TMP117::setAllertCallback (void (*allert_callback)(void), uint8_t pin) { |
glsfacom | 3:23ecb85b6e8b | 85 | // alert_pin = pin; |
glsfacom | 3:23ecb85b6e8b | 86 | // pinMode(pin, INPUT_PULLUP); |
glsfacom | 3:23ecb85b6e8b | 87 | // |
glsfacom | 3:23ecb85b6e8b | 88 | // attachInterrupt(digitalPinToInterrupt(pin), allert_callback, FALLING ); // Sets up pin 2 to trigger "alert" ISR when pin changes H->L and L->H |
glsfacom | 3:23ecb85b6e8b | 89 | //} |
glsfacom | 3:23ecb85b6e8b | 90 | |
glsfacom | 3:23ecb85b6e8b | 91 | /*! |
glsfacom | 3:23ecb85b6e8b | 92 | @brief Set alert temperature |
glsfacom | 3:23ecb85b6e8b | 93 | |
glsfacom | 3:23ecb85b6e8b | 94 | @param lowtemp low boundary alert temperature |
glsfacom | 3:23ecb85b6e8b | 95 | @param hightemp high boundary alert temperature |
glsfacom | 3:23ecb85b6e8b | 96 | */ |
glsfacom | 4:0e3e93c26d83 | 97 | void TMP117::setAllertTemperature (double lowtemp, double hightemp, int addr) { |
glsfacom | 3:23ecb85b6e8b | 98 | |
glsfacom | 3:23ecb85b6e8b | 99 | uint16_t high_temp_value = hightemp / TMP117_RESOLUTION; |
glsfacom | 3:23ecb85b6e8b | 100 | uint16_t low_temp_value = lowtemp / TMP117_RESOLUTION; |
glsfacom | 3:23ecb85b6e8b | 101 | |
glsfacom | 4:0e3e93c26d83 | 102 | i2cWrite2B (TMP117_REG_TEMP_HIGH_LIMIT , high_temp_value, addr); |
glsfacom | 4:0e3e93c26d83 | 103 | i2cWrite2B (TMP117_REG_TEMP_LOW_LIMIT , low_temp_value, addr); |
glsfacom | 3:23ecb85b6e8b | 104 | } |
glsfacom | 3:23ecb85b6e8b | 105 | |
glsfacom | 3:23ecb85b6e8b | 106 | /*! |
glsfacom | 3:23ecb85b6e8b | 107 | @brief Set conversion mode |
glsfacom | 3:23ecb85b6e8b | 108 | |
glsfacom | 3:23ecb85b6e8b | 109 | @param cmode ::TMP117_CMODE [CONTINUOUS-SHUTDOWN-ONESHOT] |
glsfacom | 3:23ecb85b6e8b | 110 | */ |
glsfacom | 4:0e3e93c26d83 | 111 | void TMP117::setConvMode ( TMP117_CMODE cmode, int addr) { |
glsfacom | 3:23ecb85b6e8b | 112 | uint16_t reg_value = readConfig (); |
glsfacom | 3:23ecb85b6e8b | 113 | reg_value &= ~((1UL << 11) | (1UL << 10)); // clear bits |
glsfacom | 3:23ecb85b6e8b | 114 | reg_value = reg_value | ( cmode & 0x03 ) << 10; // set bits |
glsfacom | 4:0e3e93c26d83 | 115 | writeConfig ( reg_value , addr); |
glsfacom | 3:23ecb85b6e8b | 116 | } |
glsfacom | 3:23ecb85b6e8b | 117 | |
glsfacom | 3:23ecb85b6e8b | 118 | /*! |
glsfacom | 3:23ecb85b6e8b | 119 | @brief Set conversion time |
glsfacom | 3:23ecb85b6e8b | 120 | |
glsfacom | 3:23ecb85b6e8b | 121 | @param convtime ::TMP117_CONVT [C15mS5-C125mS-C250mS-C500mS-C1S-C4S-C8S-C16S] |
glsfacom | 3:23ecb85b6e8b | 122 | */ |
glsfacom | 4:0e3e93c26d83 | 123 | void TMP117::setConvTime ( TMP117_CONVT convtime, int addr ) { |
glsfacom | 3:23ecb85b6e8b | 124 | uint16_t reg_value = readConfig (); |
glsfacom | 3:23ecb85b6e8b | 125 | reg_value &= ~((1UL << 9) | (1UL << 8) | (1UL << 7)); // clear bits |
glsfacom | 3:23ecb85b6e8b | 126 | reg_value = reg_value | ( convtime & 0x07 ) << 7; // set bits |
glsfacom | 4:0e3e93c26d83 | 127 | writeConfig ( reg_value, addr ); |
glsfacom | 3:23ecb85b6e8b | 128 | } |
glsfacom | 3:23ecb85b6e8b | 129 | /*! |
glsfacom | 3:23ecb85b6e8b | 130 | @brief Set averaging mode |
glsfacom | 3:23ecb85b6e8b | 131 | |
glsfacom | 3:23ecb85b6e8b | 132 | @param ave ::TMP117_AVE [NOAVE-AVE8-AVE32-AVE64] |
glsfacom | 3:23ecb85b6e8b | 133 | */ |
glsfacom | 4:0e3e93c26d83 | 134 | void TMP117::setAveraging ( TMP117_AVE ave, int addr ) { |
glsfacom | 3:23ecb85b6e8b | 135 | uint16_t reg_value = readConfig (); |
glsfacom | 3:23ecb85b6e8b | 136 | reg_value &= ~((1UL << 6) | (1UL << 5) ); // clear bits |
glsfacom | 3:23ecb85b6e8b | 137 | reg_value = reg_value | ( ave & 0x03 ) << 5; // set bits |
glsfacom | 4:0e3e93c26d83 | 138 | writeConfig ( reg_value, addr ); |
glsfacom | 3:23ecb85b6e8b | 139 | } |
glsfacom | 3:23ecb85b6e8b | 140 | |
glsfacom | 3:23ecb85b6e8b | 141 | /*! |
glsfacom | 3:23ecb85b6e8b | 142 | @brief Set offset temperature |
glsfacom | 3:23ecb85b6e8b | 143 | |
glsfacom | 3:23ecb85b6e8b | 144 | @param double target offset temperature in the range of ±256°C |
glsfacom | 3:23ecb85b6e8b | 145 | */ |
glsfacom | 4:0e3e93c26d83 | 146 | void TMP117::setOffsetTemperature ( double offset, int addr ) { |
glsfacom | 3:23ecb85b6e8b | 147 | int16_t offset_temp_value = offset / TMP117_RESOLUTION; |
glsfacom | 4:0e3e93c26d83 | 148 | i2cWrite2B (TMP117_REG_TEMPERATURE_OFFSET , offset_temp_value, addr); |
glsfacom | 3:23ecb85b6e8b | 149 | } |
glsfacom | 3:23ecb85b6e8b | 150 | |
glsfacom | 3:23ecb85b6e8b | 151 | /*! |
glsfacom | 3:23ecb85b6e8b | 152 | @brief Set target temperature for calibration purpose |
glsfacom | 3:23ecb85b6e8b | 153 | |
glsfacom | 3:23ecb85b6e8b | 154 | @param double target temperature to calibrate to in the range of ±256°C |
glsfacom | 3:23ecb85b6e8b | 155 | */ |
glsfacom | 4:0e3e93c26d83 | 156 | void TMP117::setTargetTemperature ( double target, int addr ) { |
glsfacom | 4:0e3e93c26d83 | 157 | getTemperatures(); |
glsfacom | 4:0e3e93c26d83 | 158 | double actual_temp = temps[addr]; |
glsfacom | 3:23ecb85b6e8b | 159 | double delta_temp = target - actual_temp; |
glsfacom | 4:0e3e93c26d83 | 160 | setOffsetTemperature ( delta_temp, addr ); |
glsfacom | 4:0e3e93c26d83 | 161 | } |
glsfacom | 3:23ecb85b6e8b | 162 | |
glsfacom | 3:23ecb85b6e8b | 163 | /*! |
glsfacom | 3:23ecb85b6e8b | 164 | @brief Read configuration register and handle events. |
glsfacom | 3:23ecb85b6e8b | 165 | |
glsfacom | 3:23ecb85b6e8b | 166 | @return uint16_t read value of the configuration regsiter |
glsfacom | 3:23ecb85b6e8b | 167 | */ |
glsfacom | 3:23ecb85b6e8b | 168 | uint16_t TMP117::readConfig (void) { |
glsfacom | 3:23ecb85b6e8b | 169 | uint16_t reg_value = i2cRead2B ( TMP117_REG_CONFIGURATION ); |
glsfacom | 3:23ecb85b6e8b | 170 | bool high_alert = reg_value >> 15 & 1UL; |
glsfacom | 3:23ecb85b6e8b | 171 | bool low_alert = reg_value >> 14 & 1UL; |
glsfacom | 3:23ecb85b6e8b | 172 | bool data_ready = reg_value >> 13 & 1UL; |
glsfacom | 3:23ecb85b6e8b | 173 | bool eeprom_busy = reg_value >> 12 & 1UL; |
glsfacom | 3:23ecb85b6e8b | 174 | |
glsfacom | 3:23ecb85b6e8b | 175 | if (data_ready && newDataCallback != NULL) |
glsfacom | 3:23ecb85b6e8b | 176 | newDataCallback (); |
glsfacom | 3:23ecb85b6e8b | 177 | |
glsfacom | 3:23ecb85b6e8b | 178 | if (reg_value >> 15 & 1UL) { |
glsfacom | 3:23ecb85b6e8b | 179 | alert_type = HIGHALERT; |
glsfacom | 3:23ecb85b6e8b | 180 | } |
glsfacom | 3:23ecb85b6e8b | 181 | else if (reg_value >> 14 & 1UL) { |
glsfacom | 3:23ecb85b6e8b | 182 | alert_type = LOWALERT; |
glsfacom | 3:23ecb85b6e8b | 183 | } |
glsfacom | 3:23ecb85b6e8b | 184 | else { |
glsfacom | 3:23ecb85b6e8b | 185 | alert_type = NOALERT; |
glsfacom | 3:23ecb85b6e8b | 186 | } |
glsfacom | 3:23ecb85b6e8b | 187 | |
glsfacom | 3:23ecb85b6e8b | 188 | //printConfig ( reg_value ); |
glsfacom | 3:23ecb85b6e8b | 189 | |
glsfacom | 3:23ecb85b6e8b | 190 | return reg_value; |
glsfacom | 3:23ecb85b6e8b | 191 | } |
glsfacom | 3:23ecb85b6e8b | 192 | |
glsfacom | 4:0e3e93c26d83 | 193 | |
glsfacom | 3:23ecb85b6e8b | 194 | /*! |
glsfacom | 3:23ecb85b6e8b | 195 | @brief Returns the recalculated temperature |
glsfacom | 3:23ecb85b6e8b | 196 | |
glsfacom | 3:23ecb85b6e8b | 197 | @return double temperature in °C |
glsfacom | 3:23ecb85b6e8b | 198 | */ |
glsfacom | 4:0e3e93c26d83 | 199 | void TMP117::getTemperatures (void) { |
glsfacom | 4:0e3e93c26d83 | 200 | for(int i = 0; i < tmp_quant; i++) |
glsfacom | 4:0e3e93c26d83 | 201 | { |
glsfacom | 4:0e3e93c26d83 | 202 | temps[i] = (double)i2cRead2B( TMP117_REG_TEMPERATURE, TMP117_BASE_ADDR + i ) * TMP117_RESOLUTION; |
glsfacom | 4:0e3e93c26d83 | 203 | } |
glsfacom | 3:23ecb85b6e8b | 204 | } |
glsfacom | 3:23ecb85b6e8b | 205 | /*! |
glsfacom | 3:23ecb85b6e8b | 206 | @brief Get Device Revision |
glsfacom | 3:23ecb85b6e8b | 207 | |
glsfacom | 3:23ecb85b6e8b | 208 | @return uint16_t device revision |
glsfacom | 3:23ecb85b6e8b | 209 | */ |
glsfacom | 3:23ecb85b6e8b | 210 | uint16_t TMP117::getDeviceRev (void) { |
glsfacom | 3:23ecb85b6e8b | 211 | // read bits [15:12] |
glsfacom | 3:23ecb85b6e8b | 212 | uint16_t raw = i2cRead2B( TMP117_REG_DEVICE_ID ); |
glsfacom | 3:23ecb85b6e8b | 213 | |
glsfacom | 3:23ecb85b6e8b | 214 | return ( (raw >> 12) & 0x3); |
glsfacom | 3:23ecb85b6e8b | 215 | } |
glsfacom | 3:23ecb85b6e8b | 216 | |
glsfacom | 3:23ecb85b6e8b | 217 | /*! |
glsfacom | 3:23ecb85b6e8b | 218 | @brief Get Device ID (always 0x117) |
glsfacom | 3:23ecb85b6e8b | 219 | |
glsfacom | 3:23ecb85b6e8b | 220 | @return uint16_t device ID |
glsfacom | 3:23ecb85b6e8b | 221 | */ |
glsfacom | 3:23ecb85b6e8b | 222 | uint16_t TMP117::getDeviceID (void) { |
glsfacom | 3:23ecb85b6e8b | 223 | // read bits [11:0] |
glsfacom | 3:23ecb85b6e8b | 224 | uint16_t raw = i2cRead2B( TMP117_REG_DEVICE_ID ); |
glsfacom | 3:23ecb85b6e8b | 225 | return (raw & 0x0fff); |
glsfacom | 3:23ecb85b6e8b | 226 | } |
glsfacom | 3:23ecb85b6e8b | 227 | |
glsfacom | 3:23ecb85b6e8b | 228 | /*! |
glsfacom | 3:23ecb85b6e8b | 229 | @brief Returns the information which alert type happend |
glsfacom | 3:23ecb85b6e8b | 230 | |
glsfacom | 3:23ecb85b6e8b | 231 | @return TMP117_ALERT [NoAlert-HighTempAlert-LowTempAlert] |
glsfacom | 3:23ecb85b6e8b | 232 | */ |
glsfacom | 3:23ecb85b6e8b | 233 | TMP117_ALERT TMP117::getAlertType ( void ) { |
glsfacom | 3:23ecb85b6e8b | 234 | return alert_type; |
glsfacom | 3:23ecb85b6e8b | 235 | } |
glsfacom | 3:23ecb85b6e8b | 236 | |
glsfacom | 3:23ecb85b6e8b | 237 | /*! |
glsfacom | 3:23ecb85b6e8b | 238 | @brief Returns the content of the offset register in °C |
glsfacom | 3:23ecb85b6e8b | 239 | |
glsfacom | 3:23ecb85b6e8b | 240 | @return double offset temperature in °C |
glsfacom | 3:23ecb85b6e8b | 241 | */ |
glsfacom | 3:23ecb85b6e8b | 242 | double TMP117::getOffsetTemperature (void) { |
glsfacom | 3:23ecb85b6e8b | 243 | int16_t temp = i2cRead2B( TMP117_REG_TEMPERATURE_OFFSET ); |
glsfacom | 3:23ecb85b6e8b | 244 | return (temp * TMP117_RESOLUTION); |
glsfacom | 3:23ecb85b6e8b | 245 | } |
glsfacom | 3:23ecb85b6e8b | 246 | |
glsfacom | 3:23ecb85b6e8b | 247 | /*! |
glsfacom | 3:23ecb85b6e8b | 248 | @brief Write data to EEPROM register |
glsfacom | 3:23ecb85b6e8b | 249 | |
glsfacom | 3:23ecb85b6e8b | 250 | @param data data to write to the EEPROM |
glsfacom | 3:23ecb85b6e8b | 251 | |
glsfacom | 3:23ecb85b6e8b | 252 | @param eeprom_nr represents the EEPROM number [1 - 3] |
glsfacom | 3:23ecb85b6e8b | 253 | */ |
glsfacom | 4:0e3e93c26d83 | 254 | void TMP117::writeEEPROM (uint16_t data, uint8_t eeprom_nr, int addr) { |
glsfacom | 3:23ecb85b6e8b | 255 | if (!EEPROMisBusy()) { |
glsfacom | 4:0e3e93c26d83 | 256 | unlockEEPROM(addr); |
glsfacom | 3:23ecb85b6e8b | 257 | switch (eeprom_nr) { |
glsfacom | 4:0e3e93c26d83 | 258 | case 1 : i2cWrite2B ( TMP117_REG_EEPROM1, data, addr); break; |
glsfacom | 4:0e3e93c26d83 | 259 | case 2 : i2cWrite2B ( TMP117_REG_EEPROM2, data, addr); break; |
glsfacom | 4:0e3e93c26d83 | 260 | case 3 : i2cWrite2B ( TMP117_REG_EEPROM3, data, addr); break; |
glsfacom | 3:23ecb85b6e8b | 261 | default: printf("EEPROM value must be between 1 and 3"); |
glsfacom | 3:23ecb85b6e8b | 262 | } |
glsfacom | 4:0e3e93c26d83 | 263 | lockEEPROM(addr); |
glsfacom | 3:23ecb85b6e8b | 264 | } |
glsfacom | 3:23ecb85b6e8b | 265 | else { |
glsfacom | 3:23ecb85b6e8b | 266 | printf("EEPROM is busy"); |
glsfacom | 3:23ecb85b6e8b | 267 | } |
glsfacom | 3:23ecb85b6e8b | 268 | } |
glsfacom | 3:23ecb85b6e8b | 269 | |
glsfacom | 3:23ecb85b6e8b | 270 | /*! |
glsfacom | 3:23ecb85b6e8b | 271 | @brief Read data from EEPROM register |
glsfacom | 3:23ecb85b6e8b | 272 | |
glsfacom | 3:23ecb85b6e8b | 273 | @param eeprom_nr represents the EEPROM number [1 - 3] |
glsfacom | 3:23ecb85b6e8b | 274 | |
glsfacom | 3:23ecb85b6e8b | 275 | @return uint16_t read EEPROM data |
glsfacom | 3:23ecb85b6e8b | 276 | */ |
glsfacom | 3:23ecb85b6e8b | 277 | uint16_t TMP117::readEEPROM (uint8_t eeprom_nr) { |
glsfacom | 3:23ecb85b6e8b | 278 | // read the 48 bit number from the EEPROM |
glsfacom | 3:23ecb85b6e8b | 279 | if (!EEPROMisBusy()) { |
glsfacom | 3:23ecb85b6e8b | 280 | uint16_t eeprom_data = 0; |
glsfacom | 3:23ecb85b6e8b | 281 | switch (eeprom_nr) { |
glsfacom | 3:23ecb85b6e8b | 282 | case 1 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM1 ); break; |
glsfacom | 3:23ecb85b6e8b | 283 | case 2 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM2 ); break; |
glsfacom | 3:23ecb85b6e8b | 284 | case 3 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM3 ); break; |
glsfacom | 3:23ecb85b6e8b | 285 | default: printf("EEPROM value must be between 1 and 3"); |
glsfacom | 3:23ecb85b6e8b | 286 | } |
glsfacom | 3:23ecb85b6e8b | 287 | return eeprom_data; |
glsfacom | 3:23ecb85b6e8b | 288 | } |
glsfacom | 3:23ecb85b6e8b | 289 | else { |
glsfacom | 3:23ecb85b6e8b | 290 | printf("EEPROM is busy"); |
glsfacom | 3:23ecb85b6e8b | 291 | return NULL; |
glsfacom | 3:23ecb85b6e8b | 292 | } |
glsfacom | 3:23ecb85b6e8b | 293 | } |
glsfacom | 3:23ecb85b6e8b | 294 | |
glsfacom | 3:23ecb85b6e8b | 295 | |
glsfacom | 3:23ecb85b6e8b | 296 | /**************************************************************************/ |
glsfacom | 3:23ecb85b6e8b | 297 | /* ********************* Library internal functions ******************** */ |
glsfacom | 3:23ecb85b6e8b | 298 | /**************************************************************************/ |
glsfacom | 3:23ecb85b6e8b | 299 | |
glsfacom | 3:23ecb85b6e8b | 300 | /*! |
glsfacom | 3:23ecb85b6e8b | 301 | @brief Write two bytes (16 bits) to TMP117 I2C sensor |
glsfacom | 3:23ecb85b6e8b | 302 | |
glsfacom | 3:23ecb85b6e8b | 303 | @param reg target register |
glsfacom | 3:23ecb85b6e8b | 304 | @param data data to write |
glsfacom | 3:23ecb85b6e8b | 305 | */ |
glsfacom | 4:0e3e93c26d83 | 306 | void TMP117::i2cWrite2B (uint8_t reg, uint16_t data, int addr ){ |
glsfacom | 3:23ecb85b6e8b | 307 | TMP117::i2c.start(); |
glsfacom | 3:23ecb85b6e8b | 308 | TMP117::i2c.write(reg); |
glsfacom | 3:23ecb85b6e8b | 309 | char* w; |
glsfacom | 3:23ecb85b6e8b | 310 | w[0] = (char)data>>8; |
glsfacom | 3:23ecb85b6e8b | 311 | w[1] = (char)data & 0xff; |
glsfacom | 4:0e3e93c26d83 | 312 | TMP117::i2c.write(addr, w, 2); |
glsfacom | 3:23ecb85b6e8b | 313 | TMP117::i2c.stop(); |
glsfacom | 3:23ecb85b6e8b | 314 | wait_us(10*1000); |
glsfacom | 3:23ecb85b6e8b | 315 | } |
glsfacom | 3:23ecb85b6e8b | 316 | |
glsfacom | 3:23ecb85b6e8b | 317 | /*! |
glsfacom | 3:23ecb85b6e8b | 318 | @brief Read two bytes (16 bits) from TMP117 I2C sensor |
glsfacom | 3:23ecb85b6e8b | 319 | |
glsfacom | 3:23ecb85b6e8b | 320 | @param reg target register to read from |
glsfacom | 3:23ecb85b6e8b | 321 | |
glsfacom | 3:23ecb85b6e8b | 322 | @return uint16_t read data |
glsfacom | 3:23ecb85b6e8b | 323 | */ |
glsfacom | 3:23ecb85b6e8b | 324 | uint16_t TMP117::i2cRead2B (uint8_t reg) { |
glsfacom | 3:23ecb85b6e8b | 325 | int ACK = 0; |
glsfacom | 3:23ecb85b6e8b | 326 | uint8_t read[2] = {0}; |
glsfacom | 3:23ecb85b6e8b | 327 | int16_t temp = 0; |
glsfacom | 3:23ecb85b6e8b | 328 | |
glsfacom | 3:23ecb85b6e8b | 329 | TMP117::i2c.start(); |
glsfacom | 4:0e3e93c26d83 | 330 | ACK = TMP117::i2c.write(TMP117_BASE_ADDR<<1); |
glsfacom | 3:23ecb85b6e8b | 331 | if(!ACK) return -1; |
glsfacom | 3:23ecb85b6e8b | 332 | ACK = TMP117::i2c.write((0x0f)®); |
glsfacom | 3:23ecb85b6e8b | 333 | if(!ACK) return -1; |
glsfacom | 3:23ecb85b6e8b | 334 | TMP117::i2c.start(); |
glsfacom | 4:0e3e93c26d83 | 335 | TMP117::i2c.write((TMP117_BASE_ADDR<<1)|0x01); |
glsfacom | 4:0e3e93c26d83 | 336 | if(!ACK) return -1; |
glsfacom | 4:0e3e93c26d83 | 337 | read[0] = TMP117::i2c.read(ACK); |
glsfacom | 4:0e3e93c26d83 | 338 | if(!ACK) return -1; |
glsfacom | 4:0e3e93c26d83 | 339 | read[1] = TMP117::i2c.read(ACK); |
glsfacom | 4:0e3e93c26d83 | 340 | TMP117::i2c.read(ACK); |
glsfacom | 4:0e3e93c26d83 | 341 | temp = (read[0] << 8) | read[1]; |
glsfacom | 4:0e3e93c26d83 | 342 | msb = read[0]; |
glsfacom | 4:0e3e93c26d83 | 343 | lsb = read[1]; |
glsfacom | 4:0e3e93c26d83 | 344 | return temp; |
glsfacom | 4:0e3e93c26d83 | 345 | } |
glsfacom | 4:0e3e93c26d83 | 346 | |
glsfacom | 4:0e3e93c26d83 | 347 | /*! |
glsfacom | 4:0e3e93c26d83 | 348 | @brief Read two bytes (16 bits) from TMP117 I2C sensor |
glsfacom | 4:0e3e93c26d83 | 349 | |
glsfacom | 4:0e3e93c26d83 | 350 | @param reg target register to read from |
glsfacom | 4:0e3e93c26d83 | 351 | |
glsfacom | 4:0e3e93c26d83 | 352 | @return uint16_t read data |
glsfacom | 4:0e3e93c26d83 | 353 | */ |
glsfacom | 4:0e3e93c26d83 | 354 | uint16_t TMP117::i2cRead2B (uint8_t reg, uint8_t addr) { |
glsfacom | 4:0e3e93c26d83 | 355 | int ACK = 0; |
glsfacom | 4:0e3e93c26d83 | 356 | uint8_t read[2] = {0}; |
glsfacom | 4:0e3e93c26d83 | 357 | int16_t temp = 0; |
glsfacom | 4:0e3e93c26d83 | 358 | |
glsfacom | 4:0e3e93c26d83 | 359 | TMP117::i2c.start(); |
glsfacom | 4:0e3e93c26d83 | 360 | ACK = TMP117::i2c.write(addr<<1); |
glsfacom | 4:0e3e93c26d83 | 361 | if(!ACK) return -1; |
glsfacom | 4:0e3e93c26d83 | 362 | ACK = TMP117::i2c.write((0x0f)®); |
glsfacom | 4:0e3e93c26d83 | 363 | if(!ACK) return -1; |
glsfacom | 4:0e3e93c26d83 | 364 | TMP117::i2c.start(); |
glsfacom | 4:0e3e93c26d83 | 365 | TMP117::i2c.write((addr<<1)|0x01); |
glsfacom | 3:23ecb85b6e8b | 366 | if(!ACK) return -1; |
glsfacom | 3:23ecb85b6e8b | 367 | read[0] = TMP117::i2c.read(ACK); |
glsfacom | 3:23ecb85b6e8b | 368 | if(!ACK) return -1; |
glsfacom | 3:23ecb85b6e8b | 369 | read[1] = TMP117::i2c.read(ACK); |
glsfacom | 3:23ecb85b6e8b | 370 | TMP117::i2c.read(ACK); |
glsfacom | 3:23ecb85b6e8b | 371 | temp = (read[0] << 8) | read[1]; |
glsfacom | 3:23ecb85b6e8b | 372 | msb = read[0]; |
glsfacom | 3:23ecb85b6e8b | 373 | lsb = read[1]; |
glsfacom | 3:23ecb85b6e8b | 374 | return temp; |
glsfacom | 3:23ecb85b6e8b | 375 | } |
glsfacom | 3:23ecb85b6e8b | 376 | |
glsfacom | 3:23ecb85b6e8b | 377 | /*! |
glsfacom | 3:23ecb85b6e8b | 378 | @brief Write configuration to config register |
glsfacom | 3:23ecb85b6e8b | 379 | |
glsfacom | 3:23ecb85b6e8b | 380 | @param config_data configuration |
glsfacom | 3:23ecb85b6e8b | 381 | */ |
glsfacom | 4:0e3e93c26d83 | 382 | void TMP117::writeConfig (uint16_t config_data, int addr) { |
glsfacom | 4:0e3e93c26d83 | 383 | i2cWrite2B (TMP117_REG_CONFIGURATION, config_data, addr); |
glsfacom | 3:23ecb85b6e8b | 384 | } |
glsfacom | 3:23ecb85b6e8b | 385 | |
glsfacom | 3:23ecb85b6e8b | 386 | /*! |
glsfacom | 3:23ecb85b6e8b | 387 | @brief Prints configuration in user readable format |
glsfacom | 3:23ecb85b6e8b | 388 | |
glsfacom | 3:23ecb85b6e8b | 389 | @param reg_value configuration value |
glsfacom | 3:23ecb85b6e8b | 390 | */ |
glsfacom | 3:23ecb85b6e8b | 391 | //void TMP117::printConfig (uint16_t reg_value) { |
glsfacom | 3:23ecb85b6e8b | 392 | // |
glsfacom | 3:23ecb85b6e8b | 393 | //// printf(reg_value, BIN); |
glsfacom | 3:23ecb85b6e8b | 394 | // |
glsfacom | 3:23ecb85b6e8b | 395 | // printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); |
glsfacom | 3:23ecb85b6e8b | 396 | // printf ("HIGH alert: "); |
glsfacom | 3:23ecb85b6e8b | 397 | // printf( ( reg_value >> 15) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 398 | // printf ("LOW alert: "); |
glsfacom | 3:23ecb85b6e8b | 399 | // printf( ( reg_value >> 14) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 400 | // printf ("Data ready: "); |
glsfacom | 3:23ecb85b6e8b | 401 | // printf( ( reg_value >> 13) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 402 | // printf ("EEPROM busy: "); |
glsfacom | 3:23ecb85b6e8b | 403 | // printf( ( reg_value >> 12) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 404 | // printf ("MOD[1:0]: "); |
glsfacom | 3:23ecb85b6e8b | 405 | // printf( ( reg_value >> 10) & 0b11 , BIN); |
glsfacom | 3:23ecb85b6e8b | 406 | // printf ("CONV[2:0]: "); |
glsfacom | 3:23ecb85b6e8b | 407 | // printf( ( reg_value >> 7) & 0b111 , BIN); |
glsfacom | 3:23ecb85b6e8b | 408 | // printf ("AVG[1:0]: "); |
glsfacom | 3:23ecb85b6e8b | 409 | // printf( ( reg_value >> 5) & 0b11 , BIN); |
glsfacom | 3:23ecb85b6e8b | 410 | // printf ("T/nA: "); |
glsfacom | 3:23ecb85b6e8b | 411 | // printf( ( reg_value >> 4) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 412 | // printf ("POL: "); |
glsfacom | 3:23ecb85b6e8b | 413 | // printf( ( reg_value >> 3) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 414 | // printf ("DR/Alert: "); |
glsfacom | 3:23ecb85b6e8b | 415 | // printf( ( reg_value >> 2) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 416 | // printf ("Soft_Reset: "); |
glsfacom | 3:23ecb85b6e8b | 417 | // printf( ( reg_value >> 1) & 0b1 , BIN); |
glsfacom | 3:23ecb85b6e8b | 418 | //} |
glsfacom | 3:23ecb85b6e8b | 419 | /*! |
glsfacom | 3:23ecb85b6e8b | 420 | @brief Lock EEPROM, write protection |
glsfacom | 3:23ecb85b6e8b | 421 | */ |
glsfacom | 4:0e3e93c26d83 | 422 | void TMP117::lockEEPROM ( int addr) { |
glsfacom | 3:23ecb85b6e8b | 423 | // clear bit 15 |
glsfacom | 3:23ecb85b6e8b | 424 | uint16_t code = 0; |
glsfacom | 3:23ecb85b6e8b | 425 | code &= ~(1UL << 15); |
glsfacom | 4:0e3e93c26d83 | 426 | i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code, addr ); |
glsfacom | 3:23ecb85b6e8b | 427 | wait_us(100*1000); |
glsfacom | 3:23ecb85b6e8b | 428 | } |
glsfacom | 3:23ecb85b6e8b | 429 | |
glsfacom | 3:23ecb85b6e8b | 430 | /*! |
glsfacom | 3:23ecb85b6e8b | 431 | @brief Unlock EEPROM, remove write protection |
glsfacom | 3:23ecb85b6e8b | 432 | */ |
glsfacom | 4:0e3e93c26d83 | 433 | void TMP117::unlockEEPROM ( int addr) { |
glsfacom | 3:23ecb85b6e8b | 434 | // set bit 15 |
glsfacom | 3:23ecb85b6e8b | 435 | uint16_t code = 0; |
glsfacom | 3:23ecb85b6e8b | 436 | code |= 1UL << 15; |
glsfacom | 4:0e3e93c26d83 | 437 | i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code, addr ); |
glsfacom | 3:23ecb85b6e8b | 438 | wait_us(100*1000); |
glsfacom | 3:23ecb85b6e8b | 439 | } |
glsfacom | 3:23ecb85b6e8b | 440 | |
glsfacom | 3:23ecb85b6e8b | 441 | /*! |
glsfacom | 3:23ecb85b6e8b | 442 | @brief States if the EEPROM is busy |
glsfacom | 3:23ecb85b6e8b | 443 | |
glsfacom | 3:23ecb85b6e8b | 444 | @return Ture if the EEPROM is busy, fals else |
glsfacom | 3:23ecb85b6e8b | 445 | */ |
glsfacom | 3:23ecb85b6e8b | 446 | bool TMP117::EEPROMisBusy (void) { |
glsfacom | 3:23ecb85b6e8b | 447 | // Bit 14 indicates the busy state of the eeprom |
glsfacom | 3:23ecb85b6e8b | 448 | uint16_t code = i2cRead2B ( TMP117_REG_EEPROM_UNLOCK ); |
glsfacom | 3:23ecb85b6e8b | 449 | return (bool) ((code >> 14) & 0x01); |
glsfacom | 3:23ecb85b6e8b | 450 | } |
glsfacom | 3:23ecb85b6e8b | 451 | |
glsfacom | 3:23ecb85b6e8b | 452 |