Gabriel Silva / Mbed OS LOG
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?

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 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)&reg);
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)&reg);
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