±0.5°C Maximum Accuracy Digital Temperature Sensor

Dependents:   mbed-os5-F303-18650-Manager-tp4056

Committer:
mcm
Date:
Thu Apr 25 10:39:40 2019 +0000
Revision:
2:da266f1b2273
Parent:
0:6a0fe4376e0f
Child:
3:54515d036e93
Function file is ready to be tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:da266f1b2273 1 /**
mcm 2:da266f1b2273 2 * @brief MCP9808.cpp
mcm 2:da266f1b2273 3 * @details ±0.5°C Maximum Accuracy Digital Temperature Sensor.
mcm 2:da266f1b2273 4 * Function file.
mcm 2:da266f1b2273 5 *
mcm 2:da266f1b2273 6 *
mcm 2:da266f1b2273 7 * @return N/A
mcm 2:da266f1b2273 8 *
mcm 2:da266f1b2273 9 * @author Manuel Caballero
mcm 2:da266f1b2273 10 * @date 25/April/2019
mcm 2:da266f1b2273 11 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 12 * @pre N/A.
mcm 2:da266f1b2273 13 * @warning N/A
mcm 2:da266f1b2273 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). All rights reserved.
mcm 2:da266f1b2273 15 */
mcm 2:da266f1b2273 16
mcm 2:da266f1b2273 17 #include "MCP9808.h"
mcm 2:da266f1b2273 18
mcm 2:da266f1b2273 19
mcm 2:da266f1b2273 20 MCP9808::MCP9808 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:da266f1b2273 21 : _i2c ( sda, scl )
mcm 2:da266f1b2273 22 , _MCP9808_Addr ( addr )
mcm 2:da266f1b2273 23 {
mcm 2:da266f1b2273 24 _i2c.frequency( freq );
mcm 2:da266f1b2273 25 }
mcm 2:da266f1b2273 26
mcm 2:da266f1b2273 27
mcm 2:da266f1b2273 28 MCP9808::~MCP9808()
mcm 2:da266f1b2273 29 {
mcm 2:da266f1b2273 30 }
mcm 2:da266f1b2273 31
mcm 2:da266f1b2273 32
mcm 2:da266f1b2273 33
mcm 2:da266f1b2273 34 /**
mcm 2:da266f1b2273 35 * @brief MCP9808_GetCONFIG ( MCP9808_config_reg_t* )
mcm 2:da266f1b2273 36 *
mcm 2:da266f1b2273 37 * @details It gets CONFIG register value.
mcm 2:da266f1b2273 38 *
mcm 2:da266f1b2273 39 * @param[in] N/A.
mcm 2:da266f1b2273 40 *
mcm 2:da266f1b2273 41 * @param[out] myCONFIG: CONFIG register value.
mcm 2:da266f1b2273 42 *
mcm 2:da266f1b2273 43 *
mcm 2:da266f1b2273 44 * @return Status of MCP9808_GetCONFIG.
mcm 2:da266f1b2273 45 *
mcm 2:da266f1b2273 46 *
mcm 2:da266f1b2273 47 * @author Manuel Caballero
mcm 2:da266f1b2273 48 * @date 25/April/2019
mcm 2:da266f1b2273 49 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 50 * @pre N/A
mcm 2:da266f1b2273 51 * @warning N/A.
mcm 2:da266f1b2273 52 */
mcm 2:da266f1b2273 53 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetCONFIG ( MCP9808_config_reg_t* myCONFIG )
mcm 2:da266f1b2273 54 {
mcm 2:da266f1b2273 55 char cmd[2] = { 0U };
mcm 2:da266f1b2273 56 uint16_t myConfigAux = 0U;
mcm 2:da266f1b2273 57 uint32_t aux;
mcm 2:da266f1b2273 58
mcm 2:da266f1b2273 59 /* Read the register */
mcm 2:da266f1b2273 60 cmd[0] = MCP9808_CONFIG;
mcm 2:da266f1b2273 61 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], 1U, true );
mcm 2:da266f1b2273 62 aux = _i2c.read ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:da266f1b2273 63
mcm 2:da266f1b2273 64 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 65 myConfigAux = cmd[0];
mcm 2:da266f1b2273 66 myConfigAux <<= 8U;
mcm 2:da266f1b2273 67 myConfigAux |= cmd[1];
mcm 2:da266f1b2273 68
mcm 2:da266f1b2273 69 myCONFIG->t_hyst = (MCP9808_config_thyst_t)( myConfigAux & CONFIG_T_HYST_MASK );
mcm 2:da266f1b2273 70 myCONFIG->shdn = (MCP9808_config_shdn_t)( myConfigAux & CONFIG_SHDN_MASK );
mcm 2:da266f1b2273 71 myCONFIG->t_crit = (MCP9808_config_crit_lock_t)( myConfigAux & CONFIG_CRIT_LOCK_MASK );
mcm 2:da266f1b2273 72 myCONFIG->t_win_lock = (MCP9808_config_win_lock_t)( myConfigAux & CONFIG_WIN_LOCK_MASK );
mcm 2:da266f1b2273 73 myCONFIG->int_clear = (MCP9808_conf_int_clear_t)( myConfigAux & CONFIG_INT_CLEAR_MASK );
mcm 2:da266f1b2273 74 myCONFIG->alert_stat = (MCP9808_config_alert_stat_t)( myConfigAux & CONFIG_ALERT_STAT_MASK );
mcm 2:da266f1b2273 75 myCONFIG->alert_cnt = (MCP9808_config_alert_cnt_t)( myConfigAux & CONFIG_ALERT_CNT_MASK );
mcm 2:da266f1b2273 76 myCONFIG->alert_sel = (MCP9808_config_alert_sel_t)( myConfigAux & CONFIG_ALERT_SEL_MASK );
mcm 2:da266f1b2273 77 myCONFIG->alert_pol = (MCP9808_config_alert_pol_t)( myConfigAux & CONFIG_ALERT_POL_MASK );
mcm 2:da266f1b2273 78 myCONFIG->alert_mod = (MCP9808_config_alert_mod_t)( myConfigAux & CONFIG_ALERT_MOD_MASK );
mcm 2:da266f1b2273 79
mcm 2:da266f1b2273 80
mcm 2:da266f1b2273 81
mcm 2:da266f1b2273 82 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 83 {
mcm 2:da266f1b2273 84 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 85 }
mcm 2:da266f1b2273 86 else
mcm 2:da266f1b2273 87 {
mcm 2:da266f1b2273 88 return MCP9808_FAILURE;
mcm 2:da266f1b2273 89 }
mcm 2:da266f1b2273 90 }
mcm 2:da266f1b2273 91
mcm 2:da266f1b2273 92
mcm 2:da266f1b2273 93
mcm 2:da266f1b2273 94 /**
mcm 2:da266f1b2273 95 * @brief MCP9808_SetCONFIG ( MCP9808_config_reg_t )
mcm 2:da266f1b2273 96 *
mcm 2:da266f1b2273 97 * @details It sets CONFIG register value.
mcm 2:da266f1b2273 98 *
mcm 2:da266f1b2273 99 * @param[in] myCONFIG: CONFIG register value.
mcm 2:da266f1b2273 100 *
mcm 2:da266f1b2273 101 * @param[out] N/A.
mcm 2:da266f1b2273 102 *
mcm 2:da266f1b2273 103 *
mcm 2:da266f1b2273 104 * @return Status of MCP9808_SetCONFIG.
mcm 2:da266f1b2273 105 *
mcm 2:da266f1b2273 106 *
mcm 2:da266f1b2273 107 * @author Manuel Caballero
mcm 2:da266f1b2273 108 * @date 25/April/2019
mcm 2:da266f1b2273 109 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 110 * @pre MCP9808_GetCONFIG function should be called first to mask the bits.
mcm 2:da266f1b2273 111 * @warning Be aware that some commands can NOT be written depending on Crit.Lock and/or Win.Lock values.
mcm 2:da266f1b2273 112 */
mcm 2:da266f1b2273 113 MCP9808::MCP9808_status_t MCP9808::MCP9808_SetCONFIG ( MCP9808_config_reg_t myCONFIG )
mcm 2:da266f1b2273 114 {
mcm 2:da266f1b2273 115 char cmd[3] = { 0U };
mcm 2:da266f1b2273 116 uint16_t myConfigAux = 0U;
mcm 2:da266f1b2273 117 uint32_t aux;
mcm 2:da266f1b2273 118
mcm 2:da266f1b2273 119 /* Update CONFI register */
mcm 2:da266f1b2273 120 myConfigAux = ( myCONFIG.t_hyst | myCONFIG.shdn | myCONFIG.t_crit | myCONFIG.t_win_lock | myCONFIG.int_clear |
mcm 2:da266f1b2273 121 myCONFIG.alert_stat | myCONFIG.alert_cnt | myCONFIG.alert_sel | myCONFIG.alert_pol | myCONFIG.alert_mod );
mcm 2:da266f1b2273 122
mcm 2:da266f1b2273 123 cmd[0] = MCP9808_CONFIG;
mcm 2:da266f1b2273 124 cmd[1] = (char)( myConfigAux >> 8U );
mcm 2:da266f1b2273 125 cmd[2] = (char)( myConfigAux & 0xFF );
mcm 2:da266f1b2273 126 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:da266f1b2273 127
mcm 2:da266f1b2273 128
mcm 2:da266f1b2273 129
mcm 2:da266f1b2273 130
mcm 2:da266f1b2273 131 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 132 {
mcm 2:da266f1b2273 133 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 134 }
mcm 2:da266f1b2273 135 else
mcm 2:da266f1b2273 136 {
mcm 2:da266f1b2273 137 return MCP9808_FAILURE;
mcm 2:da266f1b2273 138 }
mcm 2:da266f1b2273 139 }
mcm 2:da266f1b2273 140
mcm 2:da266f1b2273 141
mcm 2:da266f1b2273 142
mcm 2:da266f1b2273 143 /**
mcm 2:da266f1b2273 144 * @brief MCP9808_GetRawTA ( MCP9808_data_t* )
mcm 2:da266f1b2273 145 *
mcm 2:da266f1b2273 146 * @details It gets ambient temperature register ( raw value ).
mcm 2:da266f1b2273 147 *
mcm 2:da266f1b2273 148 * @param[in] N/A
mcm 2:da266f1b2273 149 *
mcm 2:da266f1b2273 150 * @param[out] myRawTA: Raw T_A data.
mcm 2:da266f1b2273 151 *
mcm 2:da266f1b2273 152 *
mcm 2:da266f1b2273 153 * @return Status of MCP9808_GetRawTA.
mcm 2:da266f1b2273 154 *
mcm 2:da266f1b2273 155 *
mcm 2:da266f1b2273 156 * @author Manuel Caballero
mcm 2:da266f1b2273 157 * @date 25/April/2019
mcm 2:da266f1b2273 158 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 159 * @pre N/A
mcm 2:da266f1b2273 160 * @warning N/A.
mcm 2:da266f1b2273 161 */
mcm 2:da266f1b2273 162 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetRawTA ( MCP9808_data_t* myRawTA )
mcm 2:da266f1b2273 163 {
mcm 2:da266f1b2273 164 char cmd[2] = { 0U };
mcm 2:da266f1b2273 165 uint32_t aux;
mcm 2:da266f1b2273 166
mcm 2:da266f1b2273 167 /* Read the register */
mcm 2:da266f1b2273 168 cmd[0] = MCP9808_TA;
mcm 2:da266f1b2273 169 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], 1U, true );
mcm 2:da266f1b2273 170 aux = _i2c.read ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:da266f1b2273 171
mcm 2:da266f1b2273 172 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 173 myRawTA->t_a_raw = cmd[0];
mcm 2:da266f1b2273 174 myRawTA->t_a_raw <<= 8U;
mcm 2:da266f1b2273 175 myRawTA->t_a_raw |= cmd[1];
mcm 2:da266f1b2273 176
mcm 2:da266f1b2273 177
mcm 2:da266f1b2273 178
mcm 2:da266f1b2273 179
mcm 2:da266f1b2273 180 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 181 {
mcm 2:da266f1b2273 182 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 183 }
mcm 2:da266f1b2273 184 else
mcm 2:da266f1b2273 185 {
mcm 2:da266f1b2273 186 return MCP9808_FAILURE;
mcm 2:da266f1b2273 187 }
mcm 2:da266f1b2273 188 }
mcm 2:da266f1b2273 189
mcm 2:da266f1b2273 190
mcm 2:da266f1b2273 191
mcm 2:da266f1b2273 192 /**
mcm 2:da266f1b2273 193 * @brief MCP9808_GetTA ( MCP9808_data_t* )
mcm 2:da266f1b2273 194 *
mcm 2:da266f1b2273 195 * @details It gets ambient temperature register ( Celsius degrees ).
mcm 2:da266f1b2273 196 *
mcm 2:da266f1b2273 197 * @param[in] N/A
mcm 2:da266f1b2273 198 *
mcm 2:da266f1b2273 199 * @param[out] myTA: T_A value and flags.
mcm 2:da266f1b2273 200 *
mcm 2:da266f1b2273 201 *
mcm 2:da266f1b2273 202 * @return Status of MCP9808_GetTA.
mcm 2:da266f1b2273 203 *
mcm 2:da266f1b2273 204 *
mcm 2:da266f1b2273 205 * @author Manuel Caballero
mcm 2:da266f1b2273 206 * @date 25/April/2019
mcm 2:da266f1b2273 207 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 208 * @pre This function also updates the comparison flags.
mcm 2:da266f1b2273 209 * @warning N/A.
mcm 2:da266f1b2273 210 */
mcm 2:da266f1b2273 211 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetTA ( MCP9808_data_t* myTA )
mcm 2:da266f1b2273 212 {
mcm 2:da266f1b2273 213 char myUpperByte = 0U;
mcm 2:da266f1b2273 214 char myLowerByte = 0U;
mcm 2:da266f1b2273 215 MCP9808::MCP9808_status_t aux;
mcm 2:da266f1b2273 216
mcm 2:da266f1b2273 217 /* Read the register */
mcm 2:da266f1b2273 218 aux = MCP9808::MCP9808_GetRawTA ( &(*myTA) );
mcm 2:da266f1b2273 219
mcm 2:da266f1b2273 220 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 221 /* Mask the flags */
mcm 2:da266f1b2273 222 myTA->ta_vs_tcrit = (MCP9808_t_a_ta_vs_tcrit_t)( myTA->t_a_raw & T_A_TA_VS_TCRIT_MASK );
mcm 2:da266f1b2273 223 myTA->ta_vs_tupper = (MCP9808_t_a_ta_vs_tupper_t)( myTA->t_a_raw & T_A_TA_VS_TUPPER_MASK );
mcm 2:da266f1b2273 224 myTA->t_lower = (MCP9808_t_a_ta_vs_tlower_t)( myTA->t_a_raw & T_A_TA_VS_TLOWER_MASK );
mcm 2:da266f1b2273 225 myTA->t_a_sign = (MCP9808_t_a_sign_t)( myTA->t_a_raw & T_A_TA_SIGN_MASK );
mcm 2:da266f1b2273 226
mcm 2:da266f1b2273 227 /* Mask the ambient temperature value */
mcm 2:da266f1b2273 228 myUpperByte = (char)( myTA->t_a_raw >> 8U );
mcm 2:da266f1b2273 229 myLowerByte = (char)( myTA->t_a_raw & 0xFF );
mcm 2:da266f1b2273 230
mcm 2:da266f1b2273 231 /* Clean the flags */
mcm 2:da266f1b2273 232 myUpperByte &= ~(char)( ( T_A_TA_VS_TCRIT_MASK | T_A_TA_VS_TUPPER_MASK | T_A_TA_VS_TLOWER_MASK ) >> 8U );
mcm 2:da266f1b2273 233
mcm 2:da266f1b2273 234 /* Check if T_A is negative/positive */
mcm 2:da266f1b2273 235 if ( myTA->t_a_sign == T_A_TA_SIGN_NEGATIVE )
mcm 2:da266f1b2273 236 {
mcm 2:da266f1b2273 237 /* Ambient temperature is NEGATIVE */
mcm 2:da266f1b2273 238 myUpperByte &= ~(char)( T_A_TA_SIGN_MASK >> 8U ); // Clear the SIGN flag
mcm 2:da266f1b2273 239 myTA->t_a = 256.0f - (float)( ( myUpperByte * 16.0f ) + ( myLowerByte / 16.0f ) ); // Ambient temperature value
mcm 2:da266f1b2273 240 }
mcm 2:da266f1b2273 241 else
mcm 2:da266f1b2273 242 {
mcm 2:da266f1b2273 243 /* Ambient temperature is POSITIVE */
mcm 2:da266f1b2273 244 myTA->t_a = (float)( ( myUpperByte * 16.0f ) + ( myLowerByte / 16.0f ) ); // Ambient temperature value
mcm 2:da266f1b2273 245 }
mcm 2:da266f1b2273 246
mcm 2:da266f1b2273 247
mcm 2:da266f1b2273 248 return aux;
mcm 2:da266f1b2273 249 }
mcm 2:da266f1b2273 250
mcm 2:da266f1b2273 251
mcm 2:da266f1b2273 252
mcm 2:da266f1b2273 253 /**
mcm 2:da266f1b2273 254 * @brief MCP9808_GetManufacturerID ( MCP9808_data_t* )
mcm 2:da266f1b2273 255 *
mcm 2:da266f1b2273 256 * @details It gets manufacturer ID.
mcm 2:da266f1b2273 257 *
mcm 2:da266f1b2273 258 * @param[in] N/A.
mcm 2:da266f1b2273 259 *
mcm 2:da266f1b2273 260 * @param[out] myManufacturerID: Manufacturer ID code
mcm 2:da266f1b2273 261 *
mcm 2:da266f1b2273 262 *
mcm 2:da266f1b2273 263 * @return Status of MCP9808_GetManufacturerID.
mcm 2:da266f1b2273 264 *
mcm 2:da266f1b2273 265 *
mcm 2:da266f1b2273 266 * @author Manuel Caballero
mcm 2:da266f1b2273 267 * @date 25/April/2019
mcm 2:da266f1b2273 268 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 269 * @pre It should be 0x0054 ( hexadecimal ).
mcm 2:da266f1b2273 270 * @warning N/A.
mcm 2:da266f1b2273 271 */
mcm 2:da266f1b2273 272 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetManufacturerID ( MCP9808_data_t* myManufacturerID )
mcm 2:da266f1b2273 273 {
mcm 2:da266f1b2273 274 char cmd[2] = { 0U };
mcm 2:da266f1b2273 275 uint32_t aux;
mcm 2:da266f1b2273 276
mcm 2:da266f1b2273 277 /* Read the register */
mcm 2:da266f1b2273 278 cmd[0] = MCP9808_MANUFACTURER_ID;
mcm 2:da266f1b2273 279 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], 1U, true );
mcm 2:da266f1b2273 280 aux = _i2c.read ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:da266f1b2273 281
mcm 2:da266f1b2273 282 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 283 myManufacturerID->manufacturerID = cmd[0];
mcm 2:da266f1b2273 284 myManufacturerID->manufacturerID <<= 8U;
mcm 2:da266f1b2273 285 myManufacturerID->manufacturerID |= cmd[1];
mcm 2:da266f1b2273 286
mcm 2:da266f1b2273 287
mcm 2:da266f1b2273 288
mcm 2:da266f1b2273 289 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 290 {
mcm 2:da266f1b2273 291 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 292 }
mcm 2:da266f1b2273 293 else
mcm 2:da266f1b2273 294 {
mcm 2:da266f1b2273 295 return MCP9808_FAILURE;
mcm 2:da266f1b2273 296 }
mcm 2:da266f1b2273 297 }
mcm 2:da266f1b2273 298
mcm 2:da266f1b2273 299
mcm 2:da266f1b2273 300
mcm 2:da266f1b2273 301 /**
mcm 2:da266f1b2273 302 * @brief MCP9808_GetDeviceID ( MCP9808_data_t* )
mcm 2:da266f1b2273 303 *
mcm 2:da266f1b2273 304 * @details It gets device ID and device revision.
mcm 2:da266f1b2273 305 *
mcm 2:da266f1b2273 306 * @param[in] N/A
mcm 2:da266f1b2273 307 *
mcm 2:da266f1b2273 308 * @param[out] myDeviceID: Both device ID and device revision
mcm 2:da266f1b2273 309 *
mcm 2:da266f1b2273 310 *
mcm 2:da266f1b2273 311 * @return Status of MCP9808_GetDeviceID.
mcm 2:da266f1b2273 312 *
mcm 2:da266f1b2273 313 *
mcm 2:da266f1b2273 314 * @author Manuel Caballero
mcm 2:da266f1b2273 315 * @date 25/April/2019
mcm 2:da266f1b2273 316 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 317 * @pre Device ID should be 0x04 ( hexadecimal ).
mcm 2:da266f1b2273 318 * @warning N/A.
mcm 2:da266f1b2273 319 */
mcm 2:da266f1b2273 320 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetDeviceID ( MCP9808_data_t* myDeviceID )
mcm 2:da266f1b2273 321 {
mcm 2:da266f1b2273 322 char cmd[2] = { 0U };
mcm 2:da266f1b2273 323 uint32_t aux;
mcm 2:da266f1b2273 324
mcm 2:da266f1b2273 325 /* Read the register */
mcm 2:da266f1b2273 326 cmd[0] = MCP9808_DEVICE_ID;
mcm 2:da266f1b2273 327 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], 1U, true );
mcm 2:da266f1b2273 328 aux = _i2c.read ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:da266f1b2273 329
mcm 2:da266f1b2273 330 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 331 myDeviceID->deviceID = cmd[0];
mcm 2:da266f1b2273 332 myDeviceID->deviceRevision = cmd[1];
mcm 2:da266f1b2273 333
mcm 2:da266f1b2273 334
mcm 2:da266f1b2273 335
mcm 2:da266f1b2273 336 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 337 {
mcm 2:da266f1b2273 338 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 339 }
mcm 2:da266f1b2273 340 else
mcm 2:da266f1b2273 341 {
mcm 2:da266f1b2273 342 return MCP9808_FAILURE;
mcm 2:da266f1b2273 343 }
mcm 2:da266f1b2273 344 }
mcm 2:da266f1b2273 345
mcm 2:da266f1b2273 346
mcm 2:da266f1b2273 347
mcm 2:da266f1b2273 348 /**
mcm 2:da266f1b2273 349 * @brief MCP9808_SetResolution ( MCP9808_data_t )
mcm 2:da266f1b2273 350 *
mcm 2:da266f1b2273 351 * @details It sets the sensor resolution.
mcm 2:da266f1b2273 352 *
mcm 2:da266f1b2273 353 * @param[in] myResolution: Device resolution.
mcm 2:da266f1b2273 354 *
mcm 2:da266f1b2273 355 * @param[out] N/A
mcm 2:da266f1b2273 356 *
mcm 2:da266f1b2273 357 *
mcm 2:da266f1b2273 358 * @return Status of MCP9808_SetResolution.
mcm 2:da266f1b2273 359 *
mcm 2:da266f1b2273 360 *
mcm 2:da266f1b2273 361 * @author Manuel Caballero
mcm 2:da266f1b2273 362 * @date 25/April/2019
mcm 2:da266f1b2273 363 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 364 * @pre Resolution vs timing conversion:
mcm 2:da266f1b2273 365 * · Resolution: +0.5°C ( t_CONV = 30ms typical )
mcm 2:da266f1b2273 366 * · Resolution: +0.25°C ( t_CONV = 65ms typical )
mcm 2:da266f1b2273 367 * · Resolution: +0.125°C ( t_CONV = 130ms typical )
mcm 2:da266f1b2273 368 * · Resolution: +0.0625°C ( power-up default, t_CONV = 250ms typical )
mcm 2:da266f1b2273 369 * @warning N/A.
mcm 2:da266f1b2273 370 */
mcm 2:da266f1b2273 371 MCP9808::MCP9808_status_t MCP9808::MCP9808_SetResolution ( MCP9808_data_t myResolution )
mcm 2:da266f1b2273 372 {
mcm 2:da266f1b2273 373 char cmd[2] = { 0U };
mcm 2:da266f1b2273 374 uint32_t aux;
mcm 2:da266f1b2273 375
mcm 2:da266f1b2273 376 /* Read the register */
mcm 2:da266f1b2273 377 cmd[0] = MCP9808_RESOLUTION;
mcm 2:da266f1b2273 378 cmd[1] = myResolution.resolution;
mcm 2:da266f1b2273 379 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:da266f1b2273 380
mcm 2:da266f1b2273 381
mcm 2:da266f1b2273 382
mcm 2:da266f1b2273 383 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 384 {
mcm 2:da266f1b2273 385 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 386 }
mcm 2:da266f1b2273 387 else
mcm 2:da266f1b2273 388 {
mcm 2:da266f1b2273 389 return MCP9808_FAILURE;
mcm 2:da266f1b2273 390 }
mcm 2:da266f1b2273 391 }
mcm 2:da266f1b2273 392
mcm 2:da266f1b2273 393
mcm 2:da266f1b2273 394
mcm 2:da266f1b2273 395 /**
mcm 2:da266f1b2273 396 * @brief MCP9808_GetResolution ( MCP9808_data_t* )
mcm 2:da266f1b2273 397 *
mcm 2:da266f1b2273 398 * @details It gets the sensor resolution.
mcm 2:da266f1b2273 399 *
mcm 2:da266f1b2273 400 * @param[in] N/A.
mcm 2:da266f1b2273 401 *
mcm 2:da266f1b2273 402 * @param[out] myResolution: Device resolution.
mcm 2:da266f1b2273 403 *
mcm 2:da266f1b2273 404 *
mcm 2:da266f1b2273 405 * @return Status of MCP9808_GetResolution.
mcm 2:da266f1b2273 406 *
mcm 2:da266f1b2273 407 *
mcm 2:da266f1b2273 408 * @author Manuel Caballero
mcm 2:da266f1b2273 409 * @date 25/April/2019
mcm 2:da266f1b2273 410 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 411 * @pre Resolution vs timing conversion:
mcm 2:da266f1b2273 412 * · Resolution: +0.5°C ( t_CONV = 30ms typical )
mcm 2:da266f1b2273 413 * · Resolution: +0.25°C ( t_CONV = 65ms typical )
mcm 2:da266f1b2273 414 * · Resolution: +0.125°C ( t_CONV = 130ms typical )
mcm 2:da266f1b2273 415 * · Resolution: +0.0625°C ( power-up default, t_CONV = 250ms typical )
mcm 2:da266f1b2273 416 * @warning N/A.
mcm 2:da266f1b2273 417 */
mcm 2:da266f1b2273 418 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetResolution ( MCP9808_data_t* myResolution )
mcm 2:da266f1b2273 419 {
mcm 2:da266f1b2273 420 char cmd = 0U;
mcm 2:da266f1b2273 421 uint32_t aux;
mcm 2:da266f1b2273 422
mcm 2:da266f1b2273 423 /* Read the register */
mcm 2:da266f1b2273 424 cmd = MCP9808_RESOLUTION;
mcm 2:da266f1b2273 425 aux = _i2c.write ( _MCP9808_Addr, &cmd, 1U, true );
mcm 2:da266f1b2273 426 aux = _i2c.read ( _MCP9808_Addr, &cmd, 1U );
mcm 2:da266f1b2273 427
mcm 2:da266f1b2273 428 /* Mask it and update it with the new value */
mcm 2:da266f1b2273 429 myResolution->resolution = (MCP9808_resolution_t)cmd;
mcm 2:da266f1b2273 430
mcm 2:da266f1b2273 431
mcm 2:da266f1b2273 432
mcm 2:da266f1b2273 433 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 434 {
mcm 2:da266f1b2273 435 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 436 }
mcm 2:da266f1b2273 437 else
mcm 2:da266f1b2273 438 {
mcm 2:da266f1b2273 439 return MCP9808_FAILURE;
mcm 2:da266f1b2273 440 }
mcm 2:da266f1b2273 441 }
mcm 2:da266f1b2273 442
mcm 2:da266f1b2273 443
mcm 2:da266f1b2273 444
mcm 2:da266f1b2273 445 /**
mcm 2:da266f1b2273 446 * @brief MCP9808_SetT_Limit ( MCP9808_registers_t, MCP9808_data_t )
mcm 2:da266f1b2273 447 *
mcm 2:da266f1b2273 448 * @details It sets temperature limit for: T_UPPER, T_LOWER or T_CRIT.
mcm 2:da266f1b2273 449 *
mcm 2:da266f1b2273 450 * @param[in] myTLimit: Temperature limit register: T_UPPER, T_LOWER or T_CRIT.
mcm 2:da266f1b2273 451 * @param[in] myTValue_Limit: Temperature limit value.
mcm 2:da266f1b2273 452 *
mcm 2:da266f1b2273 453 * @param[out] N/A.
mcm 2:da266f1b2273 454 *
mcm 2:da266f1b2273 455 *
mcm 2:da266f1b2273 456 * @return Status of MCP9808_SetT_Limit.
mcm 2:da266f1b2273 457 *
mcm 2:da266f1b2273 458 *
mcm 2:da266f1b2273 459 * @author Manuel Caballero
mcm 2:da266f1b2273 460 * @date 25/April/2019
mcm 2:da266f1b2273 461 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 462 * @pre N/A.
mcm 2:da266f1b2273 463 * @warning N/A.
mcm 2:da266f1b2273 464 */
mcm 2:da266f1b2273 465 MCP9808::MCP9808_status_t MCP9808::MCP9808_SetT_Limit ( MCP9808_registers_t myTLimit, MCP9808_data_t myTValue_Limit )
mcm 2:da266f1b2273 466 {
mcm 2:da266f1b2273 467 char cmd[2] = { 0U };
mcm 2:da266f1b2273 468 int8_t myDecimal = 0U;
mcm 2:da266f1b2273 469 char myIntegral = 0U;
mcm 2:da266f1b2273 470 uint32_t aux;
mcm 2:da266f1b2273 471
mcm 2:da266f1b2273 472 /* Only temperature limit registers can keep going */
mcm 2:da266f1b2273 473 if ( ( myTLimit != MCP9808_TUPPER ) || ( myTLimit != MCP9808_TLOWER ) || ( myTLimit != MCP9808_TCRIT ) )
mcm 2:da266f1b2273 474 {
mcm 2:da266f1b2273 475 return MCP9808_FAILURE;
mcm 2:da266f1b2273 476 }
mcm 2:da266f1b2273 477 else
mcm 2:da266f1b2273 478 {
mcm 2:da266f1b2273 479 /* Parse the data */
mcm 2:da266f1b2273 480 myIntegral = (int8_t)myTValue_Limit.t_upper;
mcm 2:da266f1b2273 481 myDecimal = (char)( ( myTValue_Limit.t_upper - myIntegral ) * 100.0f );
mcm 2:da266f1b2273 482
mcm 2:da266f1b2273 483 /* Check the decimal part is correct; Valid decimal values: 0.00, 0.25, 0.50 or 0.75 */
mcm 2:da266f1b2273 484 myIntegral <<= 4U;
mcm 2:da266f1b2273 485 myDecimal <<= 2U;
mcm 2:da266f1b2273 486 if( ( myDecimal != TEMPERATURE_LIMIT_DECIMAL_PART_0_00C ) || ( myDecimal != TEMPERATURE_LIMIT_DECIMAL_PART_0_25C ) ||
mcm 2:da266f1b2273 487 ( myDecimal != TEMPERATURE_LIMIT_DECIMAL_PART_0_50C ) || ( myDecimal != TEMPERATURE_LIMIT_DECIMAL_PART_0_50C ) )
mcm 2:da266f1b2273 488 {
mcm 2:da266f1b2273 489 return MCP9808_FAILURE;
mcm 2:da266f1b2273 490 }
mcm 2:da266f1b2273 491 else
mcm 2:da266f1b2273 492 {
mcm 2:da266f1b2273 493 /* Update the register with the new value */
mcm 2:da266f1b2273 494 cmd[0] = myTLimit;
mcm 2:da266f1b2273 495 cmd[1] = ( myIntegral | myDecimal );
mcm 2:da266f1b2273 496 aux = _i2c.write ( _MCP9808_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:da266f1b2273 497
mcm 2:da266f1b2273 498
mcm 2:da266f1b2273 499 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 500 {
mcm 2:da266f1b2273 501 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 502 }
mcm 2:da266f1b2273 503 else
mcm 2:da266f1b2273 504 {
mcm 2:da266f1b2273 505 return MCP9808_FAILURE;
mcm 2:da266f1b2273 506 }
mcm 2:da266f1b2273 507 }
mcm 2:da266f1b2273 508 }
mcm 2:da266f1b2273 509 }
mcm 2:da266f1b2273 510
mcm 2:da266f1b2273 511
mcm 2:da266f1b2273 512
mcm 2:da266f1b2273 513 /**
mcm 2:da266f1b2273 514 * @brief MCP9808_GetT_Limit ( MCP9808_registers_t, MCP9808_data_t* )
mcm 2:da266f1b2273 515 *
mcm 2:da266f1b2273 516 * @details It gets temperature limit for: T_UPPER, T_LOWER or T_CRIT.
mcm 2:da266f1b2273 517 *
mcm 2:da266f1b2273 518 * @param[in] myTLimit: Temperature limit register: T_UPPER, T_LOWER or T_CRIT.
mcm 2:da266f1b2273 519 *
mcm 2:da266f1b2273 520 * @param[out] myTValue_Limit: Temperature limit value for the chosen register.
mcm 2:da266f1b2273 521 *
mcm 2:da266f1b2273 522 *
mcm 2:da266f1b2273 523 * @return Status of MCP9808_GetT_Limit.
mcm 2:da266f1b2273 524 *
mcm 2:da266f1b2273 525 *
mcm 2:da266f1b2273 526 * @author Manuel Caballero
mcm 2:da266f1b2273 527 * @date 25/April/2019
mcm 2:da266f1b2273 528 * @version 25/April/2019 The ORIGIN
mcm 2:da266f1b2273 529 * @pre N/A.
mcm 2:da266f1b2273 530 * @warning N/A.
mcm 2:da266f1b2273 531 */
mcm 2:da266f1b2273 532 MCP9808::MCP9808_status_t MCP9808::MCP9808_GetT_Limit ( MCP9808_registers_t myTLimit, MCP9808_data_t* myTValue_Limit )
mcm 2:da266f1b2273 533 {
mcm 2:da266f1b2273 534 char cmd = 0U;
mcm 2:da266f1b2273 535 char myDecimal = 0U;
mcm 2:da266f1b2273 536 float myAuxValue = 0U;
mcm 2:da266f1b2273 537 uint32_t aux;
mcm 2:da266f1b2273 538
mcm 2:da266f1b2273 539 /* Only temperature limit registers can keep going */
mcm 2:da266f1b2273 540 if ( ( myTLimit != MCP9808_TUPPER ) || ( myTLimit != MCP9808_TLOWER ) || ( myTLimit != MCP9808_TCRIT ) )
mcm 2:da266f1b2273 541 {
mcm 2:da266f1b2273 542 return MCP9808_FAILURE;
mcm 2:da266f1b2273 543 }
mcm 2:da266f1b2273 544 else
mcm 2:da266f1b2273 545 {
mcm 2:da266f1b2273 546 /* Read the register */
mcm 2:da266f1b2273 547 cmd = myTLimit;
mcm 2:da266f1b2273 548 aux = _i2c.write ( _MCP9808_Addr, &cmd, 1U, true );
mcm 2:da266f1b2273 549 aux = _i2c.read ( _MCP9808_Addr, &cmd, 1U );
mcm 2:da266f1b2273 550
mcm 2:da266f1b2273 551 /* Process the data */
mcm 2:da266f1b2273 552 myAuxValue = (float)( ( cmd & TEMPERATURE_LIMIT_INTEGRAL_PART_MASK ) >> 4U );
mcm 2:da266f1b2273 553 myDecimal = ( ( cmd & TEMPERATURE_LIMIT_DECIMAL_PART_MASK ) >> 2U );
mcm 2:da266f1b2273 554
mcm 2:da266f1b2273 555 /* Process the decimal part */
mcm 2:da266f1b2273 556 for( cmd = ( TEMPERATURE_LIMIT_DECIMAL_PART_0_00C >> 2U ); cmd < myDecimal; cmd++ )
mcm 2:da266f1b2273 557 {
mcm 2:da266f1b2273 558 myAuxValue += 0.25f;
mcm 2:da266f1b2273 559 }
mcm 2:da266f1b2273 560
mcm 2:da266f1b2273 561 /* Parse the data */
mcm 2:da266f1b2273 562 switch( myTLimit )
mcm 2:da266f1b2273 563 {
mcm 2:da266f1b2273 564 case MCP9808_TUPPER:
mcm 2:da266f1b2273 565 myTValue_Limit->t_upper = (float)myAuxValue;
mcm 2:da266f1b2273 566 break;
mcm 2:da266f1b2273 567
mcm 2:da266f1b2273 568 case MCP9808_TLOWER:
mcm 2:da266f1b2273 569 myTValue_Limit->t_lower = (float)myAuxValue;
mcm 2:da266f1b2273 570 break;
mcm 2:da266f1b2273 571
mcm 2:da266f1b2273 572 case MCP9808_TCRIT:
mcm 2:da266f1b2273 573 myTValue_Limit->t_crit = (float)myAuxValue;
mcm 2:da266f1b2273 574 break;
mcm 2:da266f1b2273 575
mcm 2:da266f1b2273 576 default:
mcm 2:da266f1b2273 577 return MCP9808_FAILURE;
mcm 2:da266f1b2273 578 break;
mcm 2:da266f1b2273 579 }
mcm 2:da266f1b2273 580
mcm 2:da266f1b2273 581
mcm 2:da266f1b2273 582
mcm 2:da266f1b2273 583 if ( aux == I2C_SUCCESS )
mcm 2:da266f1b2273 584 {
mcm 2:da266f1b2273 585 return MCP9808_SUCCESS;
mcm 2:da266f1b2273 586 }
mcm 2:da266f1b2273 587 else
mcm 2:da266f1b2273 588 {
mcm 2:da266f1b2273 589 return MCP9808_FAILURE;
mcm 2:da266f1b2273 590 }
mcm 2:da266f1b2273 591 }
mcm 2:da266f1b2273 592 }