Gabriel Silva / Mbed OS LOG
Committer:
glsfacom
Date:
Wed Sep 30 09:59:57 2020 -0400
Revision:
3:23ecb85b6e8b
Child:
4:0e3e93c26d83
add tmp117 and delete powercontrol

Who changed what in which revision?

UserRevisionLine numberNew 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 3:23ecb85b6e8b 17 TMP117::TMP117 (uint8_t addr) {
glsfacom 3:23ecb85b6e8b 18
glsfacom 3:23ecb85b6e8b 19 address = addr;
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 3:23ecb85b6e8b 29 void TMP117::init ( void (*_newDataCallback) (void) ) {
glsfacom 3:23ecb85b6e8b 30 setConvMode (CONTINUOUS);
glsfacom 3:23ecb85b6e8b 31 setConvTime (C125mS);
glsfacom 3:23ecb85b6e8b 32 setAveraging (AVE8);
glsfacom 3:23ecb85b6e8b 33 setAlertMode (DATA);
glsfacom 3:23ecb85b6e8b 34 setOffsetTemperature(0);
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 3:23ecb85b6e8b 50 void TMP117::softReset ( void ) {
glsfacom 3:23ecb85b6e8b 51 uint16_t reg_value = 0;
glsfacom 3:23ecb85b6e8b 52 reg_value |= 1UL << 1;
glsfacom 3:23ecb85b6e8b 53 writeConfig ( reg_value );
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 3:23ecb85b6e8b 61 void TMP117::setAlertMode ( TMP117_PMODE mode) {
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 3:23ecb85b6e8b 76 writeConfig ( reg_value );
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 3:23ecb85b6e8b 97 void TMP117::setAllertTemperature (double lowtemp, double hightemp) {
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 3:23ecb85b6e8b 102 i2cWrite2B (TMP117_REG_TEMP_HIGH_LIMIT , high_temp_value);
glsfacom 3:23ecb85b6e8b 103 i2cWrite2B (TMP117_REG_TEMP_LOW_LIMIT , low_temp_value);
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 3:23ecb85b6e8b 111 void TMP117::setConvMode ( TMP117_CMODE cmode) {
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 3:23ecb85b6e8b 115 writeConfig ( reg_value );
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 3:23ecb85b6e8b 123 void TMP117::setConvTime ( TMP117_CONVT convtime ) {
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 3:23ecb85b6e8b 127 writeConfig ( reg_value );
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 3:23ecb85b6e8b 134 void TMP117::setAveraging ( TMP117_AVE ave ) {
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 3:23ecb85b6e8b 138 writeConfig ( reg_value );
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 3:23ecb85b6e8b 146 void TMP117::setOffsetTemperature ( double offset ) {
glsfacom 3:23ecb85b6e8b 147 int16_t offset_temp_value = offset / TMP117_RESOLUTION;
glsfacom 3:23ecb85b6e8b 148 i2cWrite2B (TMP117_REG_TEMPERATURE_OFFSET , offset_temp_value);
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 3:23ecb85b6e8b 156 void TMP117::setTargetTemperature ( double target ) {
glsfacom 3:23ecb85b6e8b 157 double actual_temp = getTemperature ( );
glsfacom 3:23ecb85b6e8b 158 double delta_temp = target - actual_temp;
glsfacom 3:23ecb85b6e8b 159 setOffsetTemperature ( delta_temp );
glsfacom 3:23ecb85b6e8b 160 }
glsfacom 3:23ecb85b6e8b 161
glsfacom 3:23ecb85b6e8b 162 /*!
glsfacom 3:23ecb85b6e8b 163 @brief Read configuration register and handle events.
glsfacom 3:23ecb85b6e8b 164
glsfacom 3:23ecb85b6e8b 165 @return uint16_t read value of the configuration regsiter
glsfacom 3:23ecb85b6e8b 166 */
glsfacom 3:23ecb85b6e8b 167 uint16_t TMP117::readConfig (void) {
glsfacom 3:23ecb85b6e8b 168 uint16_t reg_value = i2cRead2B ( TMP117_REG_CONFIGURATION );
glsfacom 3:23ecb85b6e8b 169 bool high_alert = reg_value >> 15 & 1UL;
glsfacom 3:23ecb85b6e8b 170 bool low_alert = reg_value >> 14 & 1UL;
glsfacom 3:23ecb85b6e8b 171 bool data_ready = reg_value >> 13 & 1UL;
glsfacom 3:23ecb85b6e8b 172 bool eeprom_busy = reg_value >> 12 & 1UL;
glsfacom 3:23ecb85b6e8b 173
glsfacom 3:23ecb85b6e8b 174 if (data_ready && newDataCallback != NULL)
glsfacom 3:23ecb85b6e8b 175 newDataCallback ();
glsfacom 3:23ecb85b6e8b 176
glsfacom 3:23ecb85b6e8b 177 if (reg_value >> 15 & 1UL) {
glsfacom 3:23ecb85b6e8b 178 alert_type = HIGHALERT;
glsfacom 3:23ecb85b6e8b 179 }
glsfacom 3:23ecb85b6e8b 180 else if (reg_value >> 14 & 1UL) {
glsfacom 3:23ecb85b6e8b 181 alert_type = LOWALERT;
glsfacom 3:23ecb85b6e8b 182 }
glsfacom 3:23ecb85b6e8b 183 else {
glsfacom 3:23ecb85b6e8b 184 alert_type = NOALERT;
glsfacom 3:23ecb85b6e8b 185 }
glsfacom 3:23ecb85b6e8b 186
glsfacom 3:23ecb85b6e8b 187 //printConfig ( reg_value );
glsfacom 3:23ecb85b6e8b 188
glsfacom 3:23ecb85b6e8b 189 return reg_value;
glsfacom 3:23ecb85b6e8b 190 }
glsfacom 3:23ecb85b6e8b 191
glsfacom 3:23ecb85b6e8b 192 /*!
glsfacom 3:23ecb85b6e8b 193 @brief Returns the recalculated temperature
glsfacom 3:23ecb85b6e8b 194
glsfacom 3:23ecb85b6e8b 195 @return double temperature in °C
glsfacom 3:23ecb85b6e8b 196 */
glsfacom 3:23ecb85b6e8b 197 double TMP117::getTemperature (void) {
glsfacom 3:23ecb85b6e8b 198 int16_t temp = i2cRead2B( TMP117_REG_TEMPERATURE );
glsfacom 3:23ecb85b6e8b 199 return (temp * TMP117_RESOLUTION);
glsfacom 3:23ecb85b6e8b 200 }
glsfacom 3:23ecb85b6e8b 201 /*!
glsfacom 3:23ecb85b6e8b 202 @brief Get Device Revision
glsfacom 3:23ecb85b6e8b 203
glsfacom 3:23ecb85b6e8b 204 @return uint16_t device revision
glsfacom 3:23ecb85b6e8b 205 */
glsfacom 3:23ecb85b6e8b 206 uint16_t TMP117::getDeviceRev (void) {
glsfacom 3:23ecb85b6e8b 207 // read bits [15:12]
glsfacom 3:23ecb85b6e8b 208 uint16_t raw = i2cRead2B( TMP117_REG_DEVICE_ID );
glsfacom 3:23ecb85b6e8b 209
glsfacom 3:23ecb85b6e8b 210 return ( (raw >> 12) & 0x3);
glsfacom 3:23ecb85b6e8b 211 }
glsfacom 3:23ecb85b6e8b 212
glsfacom 3:23ecb85b6e8b 213 /*!
glsfacom 3:23ecb85b6e8b 214 @brief Get Device ID (always 0x117)
glsfacom 3:23ecb85b6e8b 215
glsfacom 3:23ecb85b6e8b 216 @return uint16_t device ID
glsfacom 3:23ecb85b6e8b 217 */
glsfacom 3:23ecb85b6e8b 218 uint16_t TMP117::getDeviceID (void) {
glsfacom 3:23ecb85b6e8b 219 // read bits [11:0]
glsfacom 3:23ecb85b6e8b 220 uint16_t raw = i2cRead2B( TMP117_REG_DEVICE_ID );
glsfacom 3:23ecb85b6e8b 221 return (raw & 0x0fff);
glsfacom 3:23ecb85b6e8b 222 }
glsfacom 3:23ecb85b6e8b 223
glsfacom 3:23ecb85b6e8b 224 /*!
glsfacom 3:23ecb85b6e8b 225 @brief Returns the information which alert type happend
glsfacom 3:23ecb85b6e8b 226
glsfacom 3:23ecb85b6e8b 227 @return TMP117_ALERT [NoAlert-HighTempAlert-LowTempAlert]
glsfacom 3:23ecb85b6e8b 228 */
glsfacom 3:23ecb85b6e8b 229 TMP117_ALERT TMP117::getAlertType ( void ) {
glsfacom 3:23ecb85b6e8b 230 return alert_type;
glsfacom 3:23ecb85b6e8b 231 }
glsfacom 3:23ecb85b6e8b 232
glsfacom 3:23ecb85b6e8b 233 /*!
glsfacom 3:23ecb85b6e8b 234 @brief Returns the content of the offset register in °C
glsfacom 3:23ecb85b6e8b 235
glsfacom 3:23ecb85b6e8b 236 @return double offset temperature in °C
glsfacom 3:23ecb85b6e8b 237 */
glsfacom 3:23ecb85b6e8b 238 double TMP117::getOffsetTemperature (void) {
glsfacom 3:23ecb85b6e8b 239 int16_t temp = i2cRead2B( TMP117_REG_TEMPERATURE_OFFSET );
glsfacom 3:23ecb85b6e8b 240 return (temp * TMP117_RESOLUTION);
glsfacom 3:23ecb85b6e8b 241 }
glsfacom 3:23ecb85b6e8b 242
glsfacom 3:23ecb85b6e8b 243 /*!
glsfacom 3:23ecb85b6e8b 244 @brief Write data to EEPROM register
glsfacom 3:23ecb85b6e8b 245
glsfacom 3:23ecb85b6e8b 246 @param data data to write to the EEPROM
glsfacom 3:23ecb85b6e8b 247
glsfacom 3:23ecb85b6e8b 248 @param eeprom_nr represents the EEPROM number [1 - 3]
glsfacom 3:23ecb85b6e8b 249 */
glsfacom 3:23ecb85b6e8b 250 void TMP117::writeEEPROM (uint16_t data, uint8_t eeprom_nr) {
glsfacom 3:23ecb85b6e8b 251 if (!EEPROMisBusy()) {
glsfacom 3:23ecb85b6e8b 252 unlockEEPROM();
glsfacom 3:23ecb85b6e8b 253 switch (eeprom_nr) {
glsfacom 3:23ecb85b6e8b 254 case 1 : i2cWrite2B ( TMP117_REG_EEPROM1, data); break;
glsfacom 3:23ecb85b6e8b 255 case 2 : i2cWrite2B ( TMP117_REG_EEPROM2, data); break;
glsfacom 3:23ecb85b6e8b 256 case 3 : i2cWrite2B ( TMP117_REG_EEPROM3, data); break;
glsfacom 3:23ecb85b6e8b 257 default: printf("EEPROM value must be between 1 and 3");
glsfacom 3:23ecb85b6e8b 258 }
glsfacom 3:23ecb85b6e8b 259 lockEEPROM();
glsfacom 3:23ecb85b6e8b 260 }
glsfacom 3:23ecb85b6e8b 261 else {
glsfacom 3:23ecb85b6e8b 262 printf("EEPROM is busy");
glsfacom 3:23ecb85b6e8b 263 }
glsfacom 3:23ecb85b6e8b 264 }
glsfacom 3:23ecb85b6e8b 265
glsfacom 3:23ecb85b6e8b 266 /*!
glsfacom 3:23ecb85b6e8b 267 @brief Read data from EEPROM register
glsfacom 3:23ecb85b6e8b 268
glsfacom 3:23ecb85b6e8b 269 @param eeprom_nr represents the EEPROM number [1 - 3]
glsfacom 3:23ecb85b6e8b 270
glsfacom 3:23ecb85b6e8b 271 @return uint16_t read EEPROM data
glsfacom 3:23ecb85b6e8b 272 */
glsfacom 3:23ecb85b6e8b 273 uint16_t TMP117::readEEPROM (uint8_t eeprom_nr) {
glsfacom 3:23ecb85b6e8b 274 // read the 48 bit number from the EEPROM
glsfacom 3:23ecb85b6e8b 275 if (!EEPROMisBusy()) {
glsfacom 3:23ecb85b6e8b 276 uint16_t eeprom_data = 0;
glsfacom 3:23ecb85b6e8b 277 switch (eeprom_nr) {
glsfacom 3:23ecb85b6e8b 278 case 1 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM1 ); break;
glsfacom 3:23ecb85b6e8b 279 case 2 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM2 ); break;
glsfacom 3:23ecb85b6e8b 280 case 3 : eeprom_data = i2cRead2B( TMP117_REG_EEPROM3 ); break;
glsfacom 3:23ecb85b6e8b 281 default: printf("EEPROM value must be between 1 and 3");
glsfacom 3:23ecb85b6e8b 282 }
glsfacom 3:23ecb85b6e8b 283 return eeprom_data;
glsfacom 3:23ecb85b6e8b 284 }
glsfacom 3:23ecb85b6e8b 285 else {
glsfacom 3:23ecb85b6e8b 286 printf("EEPROM is busy");
glsfacom 3:23ecb85b6e8b 287 return NULL;
glsfacom 3:23ecb85b6e8b 288 }
glsfacom 3:23ecb85b6e8b 289 }
glsfacom 3:23ecb85b6e8b 290
glsfacom 3:23ecb85b6e8b 291
glsfacom 3:23ecb85b6e8b 292 /**************************************************************************/
glsfacom 3:23ecb85b6e8b 293 /* ********************* Library internal functions ******************** */
glsfacom 3:23ecb85b6e8b 294 /**************************************************************************/
glsfacom 3:23ecb85b6e8b 295
glsfacom 3:23ecb85b6e8b 296 /*!
glsfacom 3:23ecb85b6e8b 297 @brief Write two bytes (16 bits) to TMP117 I2C sensor
glsfacom 3:23ecb85b6e8b 298
glsfacom 3:23ecb85b6e8b 299 @param reg target register
glsfacom 3:23ecb85b6e8b 300 @param data data to write
glsfacom 3:23ecb85b6e8b 301 */
glsfacom 3:23ecb85b6e8b 302 void TMP117::i2cWrite2B (uint8_t reg, uint16_t data){
glsfacom 3:23ecb85b6e8b 303 TMP117::i2c.start();
glsfacom 3:23ecb85b6e8b 304 TMP117::i2c.write(reg);
glsfacom 3:23ecb85b6e8b 305 char* w;
glsfacom 3:23ecb85b6e8b 306 w[0] = (char)data>>8;
glsfacom 3:23ecb85b6e8b 307 w[1] = (char)data & 0xff;
glsfacom 3:23ecb85b6e8b 308 TMP117::i2c.write(address, w, 2);
glsfacom 3:23ecb85b6e8b 309 TMP117::i2c.stop();
glsfacom 3:23ecb85b6e8b 310 wait_us(10*1000);
glsfacom 3:23ecb85b6e8b 311 }
glsfacom 3:23ecb85b6e8b 312
glsfacom 3:23ecb85b6e8b 313 /*!
glsfacom 3:23ecb85b6e8b 314 @brief Read two bytes (16 bits) from TMP117 I2C sensor
glsfacom 3:23ecb85b6e8b 315
glsfacom 3:23ecb85b6e8b 316 @param reg target register to read from
glsfacom 3:23ecb85b6e8b 317
glsfacom 3:23ecb85b6e8b 318 @return uint16_t read data
glsfacom 3:23ecb85b6e8b 319 */
glsfacom 3:23ecb85b6e8b 320 uint16_t TMP117::i2cRead2B (uint8_t reg) {
glsfacom 3:23ecb85b6e8b 321 int ACK = 0;
glsfacom 3:23ecb85b6e8b 322 uint8_t read[2] = {0};
glsfacom 3:23ecb85b6e8b 323 int16_t temp = 0;
glsfacom 3:23ecb85b6e8b 324
glsfacom 3:23ecb85b6e8b 325 TMP117::i2c.start();
glsfacom 3:23ecb85b6e8b 326 ACK = TMP117::i2c.write(TMP117::address<<1);
glsfacom 3:23ecb85b6e8b 327 if(!ACK) return -1;
glsfacom 3:23ecb85b6e8b 328 ACK = TMP117::i2c.write((0x0f)&reg);
glsfacom 3:23ecb85b6e8b 329 if(!ACK) return -1;
glsfacom 3:23ecb85b6e8b 330 TMP117::i2c.start();
glsfacom 3:23ecb85b6e8b 331 TMP117::i2c.write((TMP117::address<<1)|0x01);
glsfacom 3:23ecb85b6e8b 332 if(!ACK) return -1;
glsfacom 3:23ecb85b6e8b 333 read[0] = TMP117::i2c.read(ACK);
glsfacom 3:23ecb85b6e8b 334 if(!ACK) return -1;
glsfacom 3:23ecb85b6e8b 335 read[1] = TMP117::i2c.read(ACK);
glsfacom 3:23ecb85b6e8b 336 TMP117::i2c.read(ACK);
glsfacom 3:23ecb85b6e8b 337 temp = (read[0] << 8) | read[1];
glsfacom 3:23ecb85b6e8b 338 msb = read[0];
glsfacom 3:23ecb85b6e8b 339 lsb = read[1];
glsfacom 3:23ecb85b6e8b 340 return temp;
glsfacom 3:23ecb85b6e8b 341 }
glsfacom 3:23ecb85b6e8b 342
glsfacom 3:23ecb85b6e8b 343 /*!
glsfacom 3:23ecb85b6e8b 344 @brief Write configuration to config register
glsfacom 3:23ecb85b6e8b 345
glsfacom 3:23ecb85b6e8b 346 @param config_data configuration
glsfacom 3:23ecb85b6e8b 347 */
glsfacom 3:23ecb85b6e8b 348 void TMP117::writeConfig (uint16_t config_data) {
glsfacom 3:23ecb85b6e8b 349 i2cWrite2B (TMP117_REG_CONFIGURATION, config_data);
glsfacom 3:23ecb85b6e8b 350 }
glsfacom 3:23ecb85b6e8b 351
glsfacom 3:23ecb85b6e8b 352 /*!
glsfacom 3:23ecb85b6e8b 353 @brief Prints configuration in user readable format
glsfacom 3:23ecb85b6e8b 354
glsfacom 3:23ecb85b6e8b 355 @param reg_value configuration value
glsfacom 3:23ecb85b6e8b 356 */
glsfacom 3:23ecb85b6e8b 357 //void TMP117::printConfig (uint16_t reg_value) {
glsfacom 3:23ecb85b6e8b 358 //
glsfacom 3:23ecb85b6e8b 359 //// printf(reg_value, BIN);
glsfacom 3:23ecb85b6e8b 360 //
glsfacom 3:23ecb85b6e8b 361 // printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
glsfacom 3:23ecb85b6e8b 362 // printf ("HIGH alert: ");
glsfacom 3:23ecb85b6e8b 363 // printf( ( reg_value >> 15) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 364 // printf ("LOW alert: ");
glsfacom 3:23ecb85b6e8b 365 // printf( ( reg_value >> 14) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 366 // printf ("Data ready: ");
glsfacom 3:23ecb85b6e8b 367 // printf( ( reg_value >> 13) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 368 // printf ("EEPROM busy: ");
glsfacom 3:23ecb85b6e8b 369 // printf( ( reg_value >> 12) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 370 // printf ("MOD[1:0]: ");
glsfacom 3:23ecb85b6e8b 371 // printf( ( reg_value >> 10) & 0b11 , BIN);
glsfacom 3:23ecb85b6e8b 372 // printf ("CONV[2:0]: ");
glsfacom 3:23ecb85b6e8b 373 // printf( ( reg_value >> 7) & 0b111 , BIN);
glsfacom 3:23ecb85b6e8b 374 // printf ("AVG[1:0]: ");
glsfacom 3:23ecb85b6e8b 375 // printf( ( reg_value >> 5) & 0b11 , BIN);
glsfacom 3:23ecb85b6e8b 376 // printf ("T/nA: ");
glsfacom 3:23ecb85b6e8b 377 // printf( ( reg_value >> 4) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 378 // printf ("POL: ");
glsfacom 3:23ecb85b6e8b 379 // printf( ( reg_value >> 3) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 380 // printf ("DR/Alert: ");
glsfacom 3:23ecb85b6e8b 381 // printf( ( reg_value >> 2) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 382 // printf ("Soft_Reset: ");
glsfacom 3:23ecb85b6e8b 383 // printf( ( reg_value >> 1) & 0b1 , BIN);
glsfacom 3:23ecb85b6e8b 384 //}
glsfacom 3:23ecb85b6e8b 385 /*!
glsfacom 3:23ecb85b6e8b 386 @brief Lock EEPROM, write protection
glsfacom 3:23ecb85b6e8b 387 */
glsfacom 3:23ecb85b6e8b 388 void TMP117::lockEEPROM (void) {
glsfacom 3:23ecb85b6e8b 389 // clear bit 15
glsfacom 3:23ecb85b6e8b 390 uint16_t code = 0;
glsfacom 3:23ecb85b6e8b 391 code &= ~(1UL << 15);
glsfacom 3:23ecb85b6e8b 392 i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code );
glsfacom 3:23ecb85b6e8b 393 wait_us(100*1000);
glsfacom 3:23ecb85b6e8b 394 }
glsfacom 3:23ecb85b6e8b 395
glsfacom 3:23ecb85b6e8b 396 /*!
glsfacom 3:23ecb85b6e8b 397 @brief Unlock EEPROM, remove write protection
glsfacom 3:23ecb85b6e8b 398 */
glsfacom 3:23ecb85b6e8b 399 void TMP117::unlockEEPROM (void) {
glsfacom 3:23ecb85b6e8b 400 // set bit 15
glsfacom 3:23ecb85b6e8b 401 uint16_t code = 0;
glsfacom 3:23ecb85b6e8b 402 code |= 1UL << 15;
glsfacom 3:23ecb85b6e8b 403 i2cWrite2B ( TMP117_REG_EEPROM_UNLOCK, code );
glsfacom 3:23ecb85b6e8b 404 wait_us(100*1000);
glsfacom 3:23ecb85b6e8b 405 }
glsfacom 3:23ecb85b6e8b 406
glsfacom 3:23ecb85b6e8b 407 /*!
glsfacom 3:23ecb85b6e8b 408 @brief States if the EEPROM is busy
glsfacom 3:23ecb85b6e8b 409
glsfacom 3:23ecb85b6e8b 410 @return Ture if the EEPROM is busy, fals else
glsfacom 3:23ecb85b6e8b 411 */
glsfacom 3:23ecb85b6e8b 412 bool TMP117::EEPROMisBusy (void) {
glsfacom 3:23ecb85b6e8b 413 // Bit 14 indicates the busy state of the eeprom
glsfacom 3:23ecb85b6e8b 414 uint16_t code = i2cRead2B ( TMP117_REG_EEPROM_UNLOCK );
glsfacom 3:23ecb85b6e8b 415 return (bool) ((code >> 14) & 0x01);
glsfacom 3:23ecb85b6e8b 416 }
glsfacom 3:23ecb85b6e8b 417
glsfacom 3:23ecb85b6e8b 418