Digital Thermometer and Memory

Committer:
mcm
Date:
Tue Feb 06 11:12:40 2018 +0000
Revision:
4:61eb7429c086
Parent:
3:3a26cd3cd594
The driver was completed and tested, it works as expected ( NUCLEO-L152RE platform was used for test )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:fc952e73a23e 1 /**
mcm 1:fc952e73a23e 2 * @brief DS1624.h
mcm 1:fc952e73a23e 3 * @details Digital Thermometer and Memory.
mcm 1:fc952e73a23e 4 * Function file.
mcm 1:fc952e73a23e 5 *
mcm 1:fc952e73a23e 6 *
mcm 1:fc952e73a23e 7 * @return NA
mcm 1:fc952e73a23e 8 *
mcm 1:fc952e73a23e 9 * @author Manuel Caballero
mcm 1:fc952e73a23e 10 * @date 31/January/2018
mcm 1:fc952e73a23e 11 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 12 * @pre NaN.
mcm 1:fc952e73a23e 13 * @warning NaN
mcm 1:fc952e73a23e 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 1:fc952e73a23e 15 */
mcm 1:fc952e73a23e 16
mcm 1:fc952e73a23e 17 #include "DS1624.h"
mcm 1:fc952e73a23e 18
mcm 1:fc952e73a23e 19
mcm 1:fc952e73a23e 20 DS1624::DS1624 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 1:fc952e73a23e 21 : _i2c ( sda, scl )
mcm 1:fc952e73a23e 22 , _DS1624_Addr ( addr )
mcm 1:fc952e73a23e 23 {
mcm 1:fc952e73a23e 24 _i2c.frequency( freq );
mcm 1:fc952e73a23e 25 }
mcm 1:fc952e73a23e 26
mcm 1:fc952e73a23e 27
mcm 1:fc952e73a23e 28 DS1624::~DS1624()
mcm 1:fc952e73a23e 29 {
mcm 1:fc952e73a23e 30 }
mcm 1:fc952e73a23e 31
mcm 1:fc952e73a23e 32
mcm 1:fc952e73a23e 33
mcm 1:fc952e73a23e 34 /**
mcm 1:fc952e73a23e 35 * @brief DS1624_StartConvertTemperature ( void )
mcm 1:fc952e73a23e 36 *
mcm 1:fc952e73a23e 37 * @details It triggers a new temperature conversion.
mcm 1:fc952e73a23e 38 *
mcm 1:fc952e73a23e 39 * @param[in] N/A.
mcm 1:fc952e73a23e 40 *
mcm 1:fc952e73a23e 41 * @param[out] N/A.
mcm 1:fc952e73a23e 42 *
mcm 1:fc952e73a23e 43 *
mcm 1:fc952e73a23e 44 * @return Status of DS1624_StartConvertTemperature.
mcm 1:fc952e73a23e 45 *
mcm 1:fc952e73a23e 46 *
mcm 1:fc952e73a23e 47 * @author Manuel Caballero
mcm 1:fc952e73a23e 48 * @date 31/January/2018
mcm 1:fc952e73a23e 49 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 50 * @pre Temperature Conversion Time ( t_TC ) 200ms maximum.
mcm 1:fc952e73a23e 51 * @warning N/A.
mcm 1:fc952e73a23e 52 */
mcm 1:fc952e73a23e 53 DS1624::DS1624_status_t DS1624::DS1624_StartConvertTemperature ( void )
mcm 1:fc952e73a23e 54 {
mcm 1:fc952e73a23e 55 char cmd = DS1624_START_CONVERT_T;
mcm 1:fc952e73a23e 56 uint32_t aux = 0;
mcm 1:fc952e73a23e 57
mcm 1:fc952e73a23e 58
mcm 1:fc952e73a23e 59 // It triggers a new temperature conversion
mcm 1:fc952e73a23e 60 aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false );
mcm 1:fc952e73a23e 61
mcm 1:fc952e73a23e 62
mcm 1:fc952e73a23e 63
mcm 1:fc952e73a23e 64
mcm 1:fc952e73a23e 65 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 66 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 67 else
mcm 1:fc952e73a23e 68 return DS1624_FAILURE;
mcm 1:fc952e73a23e 69 }
mcm 1:fc952e73a23e 70
mcm 1:fc952e73a23e 71
mcm 1:fc952e73a23e 72 /**
mcm 1:fc952e73a23e 73 * @brief DS1624_StopConvertTemperature ( void )
mcm 1:fc952e73a23e 74 *
mcm 1:fc952e73a23e 75 * @details It halts the temperature conversion.
mcm 1:fc952e73a23e 76 *
mcm 1:fc952e73a23e 77 * @param[in] N/A.
mcm 1:fc952e73a23e 78 *
mcm 1:fc952e73a23e 79 * @param[out] N/A.
mcm 1:fc952e73a23e 80 *
mcm 1:fc952e73a23e 81 *
mcm 1:fc952e73a23e 82 * @return Status of DS1624_StopConvertTemperature.
mcm 1:fc952e73a23e 83 *
mcm 1:fc952e73a23e 84 *
mcm 1:fc952e73a23e 85 * @author Manuel Caballero
mcm 1:fc952e73a23e 86 * @date 31/January/2018
mcm 1:fc952e73a23e 87 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 88 * @pre In continuous conversion mode, a StopConvertT command halt
mcm 1:fc952e73a23e 89 * a continuous conversion. To restart, the StartConvertT
mcm 1:fc952e73a23e 90 * command must be issued. In one-shot mode, a StartConvertT command
mcm 1:fc952e73a23e 91 * must be issued for every temperature reading desired.
mcm 1:fc952e73a23e 92 * @warning N/A.
mcm 1:fc952e73a23e 93 */
mcm 1:fc952e73a23e 94 DS1624::DS1624_status_t DS1624::DS1624_StopConvertTemperature ( void )
mcm 1:fc952e73a23e 95 {
mcm 1:fc952e73a23e 96 char cmd = DS1624_STOP_CONVERT_T;
mcm 1:fc952e73a23e 97 uint32_t aux = 0;
mcm 1:fc952e73a23e 98
mcm 1:fc952e73a23e 99
mcm 1:fc952e73a23e 100 // It sends the command
mcm 1:fc952e73a23e 101 aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false );
mcm 1:fc952e73a23e 102
mcm 1:fc952e73a23e 103
mcm 1:fc952e73a23e 104
mcm 1:fc952e73a23e 105
mcm 1:fc952e73a23e 106 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 107 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 108 else
mcm 1:fc952e73a23e 109 return DS1624_FAILURE;
mcm 1:fc952e73a23e 110 }
mcm 1:fc952e73a23e 111
mcm 1:fc952e73a23e 112
mcm 1:fc952e73a23e 113
mcm 1:fc952e73a23e 114 /**
mcm 1:fc952e73a23e 115 * @brief DS1624_ReadRawTemperature ( DS1624_vector_data_t* )
mcm 1:fc952e73a23e 116 *
mcm 1:fc952e73a23e 117 * @details It reads the last raw temperature conversion result.
mcm 1:fc952e73a23e 118 *
mcm 1:fc952e73a23e 119 * @param[in] N/A.
mcm 1:fc952e73a23e 120 *
mcm 1:fc952e73a23e 121 * @param[out] myRawTemperature: Raw temperature ( two bytes ).
mcm 1:fc952e73a23e 122 *
mcm 1:fc952e73a23e 123 *
mcm 1:fc952e73a23e 124 * @return Status of DS1624_ReadRawTemperature.
mcm 1:fc952e73a23e 125 *
mcm 1:fc952e73a23e 126 *
mcm 1:fc952e73a23e 127 * @author Manuel Caballero
mcm 1:fc952e73a23e 128 * @date 31/January/2018
mcm 1:fc952e73a23e 129 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 130 * @pre DONE bit needs to be checked before calling this function.
mcm 1:fc952e73a23e 131 * @warning N/A.
mcm 1:fc952e73a23e 132 */
mcm 1:fc952e73a23e 133 DS1624::DS1624_status_t DS1624::DS1624_ReadRawTemperature ( DS1624_vector_data_t* myRawTemperature )
mcm 1:fc952e73a23e 134 {
mcm 1:fc952e73a23e 135 char cmd[] = { DS1624_READ_TEMPERATURE, 0 };
mcm 1:fc952e73a23e 136 uint32_t aux = 0;
mcm 1:fc952e73a23e 137
mcm 1:fc952e73a23e 138
mcm 1:fc952e73a23e 139
mcm 1:fc952e73a23e 140 // It sends the command and gets the result otherwise
mcm 1:fc952e73a23e 141 aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
mcm 1:fc952e73a23e 142 aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:fc952e73a23e 143
mcm 1:fc952e73a23e 144
mcm 1:fc952e73a23e 145 // Parse the data
mcm 1:fc952e73a23e 146 myRawTemperature->MSBTemperature = cmd[0];
mcm 1:fc952e73a23e 147 myRawTemperature->LSBTemperature = cmd[1];
mcm 1:fc952e73a23e 148
mcm 1:fc952e73a23e 149
mcm 1:fc952e73a23e 150
mcm 1:fc952e73a23e 151
mcm 1:fc952e73a23e 152 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 153 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 154 else
mcm 1:fc952e73a23e 155 return DS1624_FAILURE;
mcm 1:fc952e73a23e 156 }
mcm 1:fc952e73a23e 157
mcm 1:fc952e73a23e 158
mcm 1:fc952e73a23e 159
mcm 1:fc952e73a23e 160 /**
mcm 1:fc952e73a23e 161 * @brief DS1624_ReadTemperature ( DS1624_vector_data_t* )
mcm 1:fc952e73a23e 162 *
mcm 1:fc952e73a23e 163 * @details It reads the last current temperature conversion result.
mcm 1:fc952e73a23e 164 *
mcm 1:fc952e73a23e 165 * @param[in] N/A.
mcm 1:fc952e73a23e 166 *
mcm 1:fc952e73a23e 167 * @param[out] myTemperature: Current temperature.
mcm 1:fc952e73a23e 168 *
mcm 1:fc952e73a23e 169 *
mcm 1:fc952e73a23e 170 * @return Status of DS1624_ReadTemperature.
mcm 1:fc952e73a23e 171 *
mcm 1:fc952e73a23e 172 *
mcm 1:fc952e73a23e 173 * @author Manuel Caballero
mcm 1:fc952e73a23e 174 * @date 31/January/2018
mcm 1:fc952e73a23e 175 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 176 * @pre This function updates the raw temperature variables.
mcm 1:fc952e73a23e 177 * @pre DONE bit needs to be checked before calling this function.
mcm 1:fc952e73a23e 178 * @warning N/A.
mcm 1:fc952e73a23e 179 */
mcm 1:fc952e73a23e 180 DS1624::DS1624_status_t DS1624::DS1624_ReadTemperature ( DS1624_vector_data_t* myTemperature )
mcm 1:fc952e73a23e 181 {
mcm 1:fc952e73a23e 182 char cmd[] = { DS1624_READ_TEMPERATURE, 0 };
mcm 1:fc952e73a23e 183 uint32_t aux = 0;
mcm 1:fc952e73a23e 184 uint32_t i = 0;
mcm 1:fc952e73a23e 185
mcm 1:fc952e73a23e 186
mcm 1:fc952e73a23e 187
mcm 1:fc952e73a23e 188 // It sends the command and gets the result otherwise
mcm 1:fc952e73a23e 189 aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
mcm 1:fc952e73a23e 190 aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:fc952e73a23e 191
mcm 1:fc952e73a23e 192
mcm 1:fc952e73a23e 193 // Update the raw temperature value
mcm 1:fc952e73a23e 194 myTemperature->MSBTemperature = cmd[0];
mcm 1:fc952e73a23e 195 myTemperature->LSBTemperature = cmd[1];
mcm 1:fc952e73a23e 196
mcm 1:fc952e73a23e 197
mcm 1:fc952e73a23e 198 // Calculate the current temperature
mcm 1:fc952e73a23e 199 // Check if the temperature is positive or negative
mcm 1:fc952e73a23e 200 if ( ( myTemperature->MSBTemperature & MSB_TEMPERATURE_SIGN_BIT_MASK ) == MSB_TEMPERATURE_SIGN_BIT_NEGATIVE )
mcm 1:fc952e73a23e 201 {
mcm 1:fc952e73a23e 202 // The temperature is NEGATIVE
mcm 1:fc952e73a23e 203 myTemperature->MSBTemperature -= 1;
mcm 1:fc952e73a23e 204 myTemperature->MSBTemperature = ~myTemperature->MSBTemperature;
mcm 1:fc952e73a23e 205
mcm 1:fc952e73a23e 206 myTemperature->LSBTemperature -= 1;
mcm 1:fc952e73a23e 207 myTemperature->LSBTemperature = ( ~myTemperature->LSBTemperature & 0xF0 );
mcm 1:fc952e73a23e 208
mcm 1:fc952e73a23e 209 myTemperature->Temperature = ( -1.0 * myTemperature->MSBTemperature );
mcm 1:fc952e73a23e 210 }
mcm 1:fc952e73a23e 211 else
mcm 1:fc952e73a23e 212 {
mcm 1:fc952e73a23e 213 // The temperature is POSITIVE
mcm 1:fc952e73a23e 214 myTemperature->Temperature = myTemperature->MSBTemperature;
mcm 1:fc952e73a23e 215 }
mcm 1:fc952e73a23e 216
mcm 1:fc952e73a23e 217
mcm 1:fc952e73a23e 218 // Update the decimal value
mcm 1:fc952e73a23e 219 for ( i = 0; i < ( myTemperature->LSBTemperature >> 4 ); i++ )
mcm 1:fc952e73a23e 220 myTemperature->Temperature += DS1624_TEMPERATURE_RESOLUTION;
mcm 1:fc952e73a23e 221
mcm 1:fc952e73a23e 222
mcm 1:fc952e73a23e 223
mcm 1:fc952e73a23e 224
mcm 1:fc952e73a23e 225
mcm 1:fc952e73a23e 226
mcm 1:fc952e73a23e 227 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 228 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 229 else
mcm 1:fc952e73a23e 230 return DS1624_FAILURE;
mcm 1:fc952e73a23e 231 }
mcm 1:fc952e73a23e 232
mcm 1:fc952e73a23e 233
mcm 1:fc952e73a23e 234
mcm 1:fc952e73a23e 235 /**
mcm 1:fc952e73a23e 236 * @brief DS1624_GetStatusRegister ( DS1624_vector_data_t* )
mcm 1:fc952e73a23e 237 *
mcm 1:fc952e73a23e 238 * @details It reads the CONFIGURATION/STATUS register.
mcm 1:fc952e73a23e 239 *
mcm 1:fc952e73a23e 240 * @param[in] N/A.
mcm 1:fc952e73a23e 241 *
mcm 1:fc952e73a23e 242 * @param[out] myStatusRegister: Current Status register value.
mcm 1:fc952e73a23e 243 *
mcm 1:fc952e73a23e 244 *
mcm 1:fc952e73a23e 245 * @return Status of DS1624_GetStatusRegister.
mcm 1:fc952e73a23e 246 *
mcm 1:fc952e73a23e 247 *
mcm 1:fc952e73a23e 248 * @author Manuel Caballero
mcm 1:fc952e73a23e 249 * @date 31/January/2018
mcm 1:fc952e73a23e 250 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 251 * @pre N/A.
mcm 1:fc952e73a23e 252 * @warning N/A.
mcm 1:fc952e73a23e 253 */
mcm 1:fc952e73a23e 254 DS1624::DS1624_status_t DS1624::DS1624_GetStatusRegister ( DS1624_vector_data_t* myStatusRegister )
mcm 1:fc952e73a23e 255 {
mcm 1:fc952e73a23e 256 char cmd = DS1624_ACCESS_CONFIG;
mcm 1:fc952e73a23e 257 uint32_t aux = 0;
mcm 1:fc952e73a23e 258
mcm 1:fc952e73a23e 259
mcm 1:fc952e73a23e 260 // It sends the command and gets the result
mcm 1:fc952e73a23e 261 aux = _i2c.write ( _DS1624_Addr, &cmd, 1, true );
mcm 1:fc952e73a23e 262 aux = _i2c.read ( _DS1624_Addr, &myStatusRegister->Control_Status_Register, 1 );
mcm 1:fc952e73a23e 263
mcm 1:fc952e73a23e 264
mcm 1:fc952e73a23e 265
mcm 1:fc952e73a23e 266
mcm 1:fc952e73a23e 267
mcm 1:fc952e73a23e 268 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 269 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 270 else
mcm 1:fc952e73a23e 271 return DS1624_FAILURE;
mcm 1:fc952e73a23e 272 }
mcm 1:fc952e73a23e 273
mcm 1:fc952e73a23e 274
mcm 1:fc952e73a23e 275
mcm 1:fc952e73a23e 276 /**
mcm 1:fc952e73a23e 277 * @brief DS1624_SetConversionMode ( DS1624_access_config_1shot_t )
mcm 1:fc952e73a23e 278 *
mcm 1:fc952e73a23e 279 * @details It sets 1SHOT/Continuous temperature conversion mode.
mcm 1:fc952e73a23e 280 *
mcm 1:fc952e73a23e 281 * @param[in] myConversionMode: ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION: 1SHOT temperature conversion mode
mcm 1:fc952e73a23e 282 * ACCESS_CONFIG_1SHOT_CONTINUOUSLY_TEMPERATURE_CONVERSION: Continuous temperature conversion mode.
mcm 1:fc952e73a23e 283 *
mcm 1:fc952e73a23e 284 * @param[out] N/A.
mcm 1:fc952e73a23e 285 *
mcm 1:fc952e73a23e 286 *
mcm 1:fc952e73a23e 287 * @return Status of DS1624_SetConversionMode.
mcm 1:fc952e73a23e 288 *
mcm 1:fc952e73a23e 289 *
mcm 1:fc952e73a23e 290 * @author Manuel Caballero
mcm 1:fc952e73a23e 291 * @date 31/January/2018
mcm 1:fc952e73a23e 292 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 293 * @pre N/A
mcm 1:fc952e73a23e 294 * @warning Since the configuration register is implemented in
mcm 1:fc952e73a23e 295 * EEPROM, writes to the register require 10ms to complete.
mcm 1:fc952e73a23e 296 * After issuing a command to write to the configuration register,
mcm 1:fc952e73a23e 297 * no further accesses to the DS1624 should be made for at least 10ms.
mcm 1:fc952e73a23e 298 */
mcm 1:fc952e73a23e 299 DS1624::DS1624_status_t DS1624::DS1624_SetConversionMode ( DS1624_access_config_1shot_t myConversionMode )
mcm 1:fc952e73a23e 300 {
mcm 1:fc952e73a23e 301 char cmd[] = { DS1624_ACCESS_CONFIG, 0 };
mcm 1:fc952e73a23e 302 uint32_t aux = 0;
mcm 1:fc952e73a23e 303
mcm 1:fc952e73a23e 304
mcm 1:fc952e73a23e 305 // It sends the command and gets the result
mcm 1:fc952e73a23e 306 aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
mcm 1:fc952e73a23e 307 aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 );
mcm 1:fc952e73a23e 308
mcm 1:fc952e73a23e 309
mcm 1:fc952e73a23e 310 // Mask the bit and check which mode to use
mcm 1:fc952e73a23e 311 cmd[1] &= ~ACCESS_CONFIG_1SHOT_MASK;
mcm 1:fc952e73a23e 312
mcm 1:fc952e73a23e 313 if ( myConversionMode == ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION )
mcm 1:fc952e73a23e 314 {
mcm 1:fc952e73a23e 315 // 1SHOT Mode
mcm 1:fc952e73a23e 316 cmd[1] |= ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION;
mcm 1:fc952e73a23e 317 }
mcm 1:fc952e73a23e 318 else
mcm 1:fc952e73a23e 319 {
mcm 1:fc952e73a23e 320 // Continuously Mode
mcm 1:fc952e73a23e 321 cmd[1] &= ~ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION;
mcm 1:fc952e73a23e 322 }
mcm 1:fc952e73a23e 323
mcm 1:fc952e73a23e 324
mcm 1:fc952e73a23e 325 // Update the CONFIGURATION/STATUS register
mcm 1:fc952e73a23e 326 aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 1:fc952e73a23e 327
mcm 1:fc952e73a23e 328
mcm 1:fc952e73a23e 329
mcm 1:fc952e73a23e 330
mcm 1:fc952e73a23e 331 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 332 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 333 else
mcm 1:fc952e73a23e 334 return DS1624_FAILURE;
mcm 1:fc952e73a23e 335 }
mcm 1:fc952e73a23e 336
mcm 1:fc952e73a23e 337
mcm 1:fc952e73a23e 338
mcm 1:fc952e73a23e 339 /**
mcm 1:fc952e73a23e 340 * @brief DS1624_IsTemperatureConversionDone ( DS1624_vector_data_t* )
mcm 1:fc952e73a23e 341 *
mcm 1:fc952e73a23e 342 * @details It checks if a temperature conversion is done.
mcm 1:fc952e73a23e 343 *
mcm 1:fc952e73a23e 344 * @param[in] N/A.
mcm 1:fc952e73a23e 345 *
mcm 1:fc952e73a23e 346 * @param[out] myTemperatureConversionStatus: Temperature conversion bit:
mcm 1:fc952e73a23e 347 * ACCESS_CONFIG_DONE_CONVERSION_COMPLETE
mcm 1:fc952e73a23e 348 * ACCESS_CONFIG_DONE_CONVERSION_IN_PROGRESS.
mcm 1:fc952e73a23e 349 *
mcm 1:fc952e73a23e 350 *
mcm 1:fc952e73a23e 351 * @return Status of DS1624_IsTemperatureConversionDone.
mcm 1:fc952e73a23e 352 *
mcm 1:fc952e73a23e 353 *
mcm 1:fc952e73a23e 354 * @author Manuel Caballero
mcm 1:fc952e73a23e 355 * @date 31/January/2018
mcm 1:fc952e73a23e 356 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 357 * @pre N/A.
mcm 1:fc952e73a23e 358 * @warning N/A.
mcm 1:fc952e73a23e 359 */
mcm 1:fc952e73a23e 360 DS1624::DS1624_status_t DS1624::DS1624_IsTemperatureConversionDone ( DS1624_access_config_done_t* myTemperatureConversionStatus )
mcm 1:fc952e73a23e 361 {
mcm 1:fc952e73a23e 362 char cmd[] = { DS1624_ACCESS_CONFIG, 0 };
mcm 1:fc952e73a23e 363 uint32_t aux = 0;
mcm 1:fc952e73a23e 364
mcm 1:fc952e73a23e 365
mcm 1:fc952e73a23e 366 // It sends the command and gets the result
mcm 1:fc952e73a23e 367 aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
mcm 1:fc952e73a23e 368 aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 );
mcm 1:fc952e73a23e 369
mcm 1:fc952e73a23e 370
mcm 1:fc952e73a23e 371 // Update the value
mcm 1:fc952e73a23e 372 *myTemperatureConversionStatus = ( DS1624_access_config_done_t )( cmd[1] & ACCESS_CONFIG_DONE_MASK );
mcm 1:fc952e73a23e 373
mcm 1:fc952e73a23e 374
mcm 1:fc952e73a23e 375
mcm 1:fc952e73a23e 376 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 377 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 378 else
mcm 1:fc952e73a23e 379 return DS1624_FAILURE;
mcm 1:fc952e73a23e 380 }
mcm 1:fc952e73a23e 381
mcm 1:fc952e73a23e 382
mcm 1:fc952e73a23e 383
mcm 1:fc952e73a23e 384 /**
mcm 3:3a26cd3cd594 385 * @brief DS1624_ReadBytesEEPROM ( char , char* , uint8_t )
mcm 1:fc952e73a23e 386 *
mcm 1:fc952e73a23e 387 * @details It reads a certain number of bytes from EEPROM memory.
mcm 1:fc952e73a23e 388 *
mcm 1:fc952e73a23e 389 * @param[in] myStartingAddress: Starting address to read the EEPROM memory.
mcm 1:fc952e73a23e 390 * @param[in] myLength: Amount of bytes to read.
mcm 1:fc952e73a23e 391 *
mcm 1:fc952e73a23e 392 * @param[out] myReadBytesEEPROM: Read values from EEPROM memory.
mcm 1:fc952e73a23e 393 *
mcm 1:fc952e73a23e 394 *
mcm 1:fc952e73a23e 395 * @return Status of DS1624_ReadBytesEEPROM.
mcm 1:fc952e73a23e 396 *
mcm 1:fc952e73a23e 397 *
mcm 1:fc952e73a23e 398 * @author Manuel Caballero
mcm 1:fc952e73a23e 399 * @date 31/January/2018
mcm 1:fc952e73a23e 400 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 401 * @pre N/A.
mcm 1:fc952e73a23e 402 * @warning When the address pointer reaches the end of the 256-byte memory space ( address FFh )
mcm 1:fc952e73a23e 403 * it increments from the end of the memory back to the first location of the memory
mcm 1:fc952e73a23e 404 * ( address 00h ).
mcm 1:fc952e73a23e 405 */
mcm 1:fc952e73a23e 406 DS1624::DS1624_status_t DS1624::DS1624_ReadBytesEEPROM ( char myStartingAddress, char* myReadBytesEEPROM, uint8_t myLength )
mcm 1:fc952e73a23e 407 {
mcm 1:fc952e73a23e 408 char cmd[] = { DS1624_ACCESS_MEMORY, 0 };
mcm 1:fc952e73a23e 409 uint32_t aux = 0;
mcm 1:fc952e73a23e 410
mcm 1:fc952e73a23e 411
mcm 1:fc952e73a23e 412
mcm 1:fc952e73a23e 413 // It sends the command, the address location and gets the result
mcm 1:fc952e73a23e 414 cmd[1] = myStartingAddress;
mcm 1:fc952e73a23e 415 aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), true );
mcm 1:fc952e73a23e 416 aux = _i2c.read ( _DS1624_Addr, myReadBytesEEPROM, myLength );
mcm 1:fc952e73a23e 417
mcm 1:fc952e73a23e 418
mcm 1:fc952e73a23e 419
mcm 1:fc952e73a23e 420
mcm 1:fc952e73a23e 421
mcm 1:fc952e73a23e 422 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 423 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 424 else
mcm 1:fc952e73a23e 425 return DS1624_FAILURE;
mcm 1:fc952e73a23e 426 }
mcm 1:fc952e73a23e 427
mcm 1:fc952e73a23e 428
mcm 1:fc952e73a23e 429
mcm 1:fc952e73a23e 430 /**
mcm 3:3a26cd3cd594 431 * @brief DS1624_WriteBytesEEPROM ( char , char , uint8_t )
mcm 1:fc952e73a23e 432 *
mcm 1:fc952e73a23e 433 * @details It writes a certain number of bytes to EEPROM memory.
mcm 1:fc952e73a23e 434 *
mcm 1:fc952e73a23e 435 * @param[in] myStartingAddress: Starting address to write the EEPROM memory.
mcm 1:fc952e73a23e 436 * @param[in] myWriteBytesEEPROM: Bytes to write to the EEPROM memory.
mcm 1:fc952e73a23e 437 * @param[in] myLength: Amount of bytes to write.
mcm 1:fc952e73a23e 438 *
mcm 1:fc952e73a23e 439 * @param[out] N/A.
mcm 1:fc952e73a23e 440 *
mcm 1:fc952e73a23e 441 *
mcm 1:fc952e73a23e 442 * @return Status of DS1624_WriteBytesEEPROM.
mcm 1:fc952e73a23e 443 *
mcm 1:fc952e73a23e 444 *
mcm 1:fc952e73a23e 445 * @author Manuel Caballero
mcm 1:fc952e73a23e 446 * @date 31/January/2018
mcm 1:fc952e73a23e 447 * @version 31/January/2018 The ORIGIN
mcm 1:fc952e73a23e 448 * @pre N/A.
mcm 1:fc952e73a23e 449 * @warning The STOP condition causes the DS1624 to initiate the write to EEPROM sequence.
mcm 1:fc952e73a23e 450 * @warning If the starting address is 00 and the incoming data is 00 11 22 33 44 55 66 77 88 99,
mcm 1:fc952e73a23e 451 * the result is mem00=88 mem01=99 mem02=22 mem03=33 mem04=44 mem05=55 mem06=66 mem07=77.
mcm 1:fc952e73a23e 452 * The data wraps around and overwrites itself.
mcm 3:3a26cd3cd594 453 * @warning EEPROM Write Cycle Time: 50ms ( maximum ). The user must take care of this time!.
mcm 1:fc952e73a23e 454 */
mcm 1:fc952e73a23e 455 DS1624::DS1624_status_t DS1624::DS1624_WriteBytesEEPROM ( char myStartingAddress, char myWriteBytesEEPROM[], uint8_t myLength )
mcm 1:fc952e73a23e 456 {
mcm 3:3a26cd3cd594 457 char cmd[ myLength + 2 ];
mcm 3:3a26cd3cd594 458 uint32_t i = 0;
mcm 1:fc952e73a23e 459 uint32_t aux = 0;
mcm 1:fc952e73a23e 460
mcm 1:fc952e73a23e 461
mcm 3:3a26cd3cd594 462 // Prepare COMMANDS
mcm 3:3a26cd3cd594 463 cmd[0] = DS1624_ACCESS_MEMORY;
mcm 1:fc952e73a23e 464 cmd[1] = myStartingAddress;
mcm 1:fc952e73a23e 465
mcm 3:3a26cd3cd594 466 // Prepare the payload to be stored into the EEPROM memory
mcm 3:3a26cd3cd594 467 for ( i = 2 ; i < ( myLength + 2 ); i++ )
mcm 3:3a26cd3cd594 468 cmd[ i ] = myWriteBytesEEPROM[ i - 2 ];
mcm 3:3a26cd3cd594 469
mcm 3:3a26cd3cd594 470 // It sends the command, the address location as well as the payload
mcm 3:3a26cd3cd594 471 aux = _i2c.write ( _DS1624_Addr, &cmd[0], myLength + 2, false );
mcm 1:fc952e73a23e 472
mcm 1:fc952e73a23e 473
mcm 1:fc952e73a23e 474
mcm 1:fc952e73a23e 475
mcm 1:fc952e73a23e 476 if ( aux == I2C_SUCCESS )
mcm 1:fc952e73a23e 477 return DS1624_SUCCESS;
mcm 1:fc952e73a23e 478 else
mcm 1:fc952e73a23e 479 return DS1624_FAILURE;
mcm 1:fc952e73a23e 480 }