Committer:
mcm
Date:
Wed Dec 20 12:42:33 2017 +0000
Revision:
2:3710775b1864
Parent:
0:38f84a23a08a
The function file seems to be completed. Compilation without any errors.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:3710775b1864 1 /**
mcm 2:3710775b1864 2 * @brief DS3231.cpp
mcm 2:3710775b1864 3 * @details Extremely Accurate I2C-Integrated RTC/TCXO/Crystal.
mcm 2:3710775b1864 4 * Function file.
mcm 2:3710775b1864 5 *
mcm 2:3710775b1864 6 *
mcm 2:3710775b1864 7 * @return NA
mcm 2:3710775b1864 8 *
mcm 2:3710775b1864 9 * @author Manuel Caballero
mcm 2:3710775b1864 10 * @date 20/December/2017
mcm 2:3710775b1864 11 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 12 * @pre NaN.
mcm 2:3710775b1864 13 * @warning NaN
mcm 2:3710775b1864 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:3710775b1864 15 */
mcm 2:3710775b1864 16
mcm 2:3710775b1864 17 #include "DS3231.h"
mcm 2:3710775b1864 18
mcm 2:3710775b1864 19
mcm 2:3710775b1864 20 DS3231::DS3231 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:3710775b1864 21 : _i2c ( sda, scl )
mcm 2:3710775b1864 22 , _DS3231_Addr ( addr )
mcm 2:3710775b1864 23 {
mcm 2:3710775b1864 24 _i2c.frequency( freq );
mcm 2:3710775b1864 25 }
mcm 2:3710775b1864 26
mcm 2:3710775b1864 27
mcm 2:3710775b1864 28 DS3231::~DS3231()
mcm 2:3710775b1864 29 {
mcm 2:3710775b1864 30 }
mcm 2:3710775b1864 31
mcm 2:3710775b1864 32
mcm 2:3710775b1864 33
mcm 2:3710775b1864 34 /**
mcm 2:3710775b1864 35 * @brief DS3231_ReadTemperature ( DS3231_vector_data_t* )
mcm 2:3710775b1864 36 *
mcm 2:3710775b1864 37 * @details It gets the temperature.
mcm 2:3710775b1864 38 *
mcm 2:3710775b1864 39 * @param[in] NaN
mcm 2:3710775b1864 40 *
mcm 2:3710775b1864 41 * @param[out] myTemperature: Temperature data.
mcm 2:3710775b1864 42 *
mcm 2:3710775b1864 43 *
mcm 2:3710775b1864 44 * @return Status of DS3231_ReadTemperature.
mcm 2:3710775b1864 45 *
mcm 2:3710775b1864 46 *
mcm 2:3710775b1864 47 * @author Manuel Caballero
mcm 2:3710775b1864 48 * @date 20/December/2017
mcm 2:3710775b1864 49 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 50 * @pre The temperature registers are updated after each user-initiated conversion and on every 64-second conversion.
mcm 2:3710775b1864 51 * @warning NaN.
mcm 2:3710775b1864 52 */
mcm 2:3710775b1864 53 DS3231::DS3231_status_t DS3231::DS3231_ReadTemperature ( DS3231_vector_data_t* myTemperature )
mcm 2:3710775b1864 54 {
mcm 2:3710775b1864 55 char cmd[] = { DS3231_MSB_TEMPERATURE, 0 };
mcm 2:3710775b1864 56 uint32_t aux = 0;
mcm 2:3710775b1864 57
mcm 2:3710775b1864 58
mcm 2:3710775b1864 59 // It gets the temperature
mcm 2:3710775b1864 60 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 61 aux = _i2c.read ( _DS3231_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:3710775b1864 62
mcm 2:3710775b1864 63
mcm 2:3710775b1864 64 // Parse the data
mcm 2:3710775b1864 65 // 1. Check if the Temperature is positive or negative
mcm 2:3710775b1864 66 if ( ( cmd[0] & 0b10000000 ) == 0b00000000 )
mcm 2:3710775b1864 67 myTemperature->Temperature = cmd[0]; // Positive value
mcm 2:3710775b1864 68 else
mcm 2:3710775b1864 69 myTemperature->Temperature = -1.0 * ( ( ~cmd[0] ) + 1 ); // Negative value
mcm 2:3710775b1864 70
mcm 2:3710775b1864 71
mcm 2:3710775b1864 72 // 2. Decimal part. 0.25°C resolution
mcm 2:3710775b1864 73 switch( cmd[1] )
mcm 2:3710775b1864 74 {
mcm 2:3710775b1864 75 // x.00°C
mcm 2:3710775b1864 76 default:
mcm 2:3710775b1864 77 case 0b00000000:
mcm 2:3710775b1864 78 break;
mcm 2:3710775b1864 79
mcm 2:3710775b1864 80 // x.25°C
mcm 2:3710775b1864 81 case 0b01000000:
mcm 2:3710775b1864 82 myTemperature->Temperature += 0.25;
mcm 2:3710775b1864 83 break;
mcm 2:3710775b1864 84
mcm 2:3710775b1864 85 // x.50°C
mcm 2:3710775b1864 86 case 0b10000000:
mcm 2:3710775b1864 87 myTemperature->Temperature += 0.50;
mcm 2:3710775b1864 88 break;
mcm 2:3710775b1864 89
mcm 2:3710775b1864 90 // x.75°C
mcm 2:3710775b1864 91 case 0b11000000:
mcm 2:3710775b1864 92 myTemperature->Temperature += 0.75;
mcm 2:3710775b1864 93 break;
mcm 2:3710775b1864 94 }
mcm 2:3710775b1864 95
mcm 2:3710775b1864 96
mcm 2:3710775b1864 97
mcm 2:3710775b1864 98
mcm 2:3710775b1864 99 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 100 return DS3231_SUCCESS;
mcm 2:3710775b1864 101 else
mcm 2:3710775b1864 102 return DS3231_FAILURE;
mcm 2:3710775b1864 103 }
mcm 2:3710775b1864 104
mcm 2:3710775b1864 105
mcm 2:3710775b1864 106
mcm 2:3710775b1864 107 /**
mcm 2:3710775b1864 108 * @brief DS3231_ReadRawTemperature ( DS3231_vector_data_t* )
mcm 2:3710775b1864 109 *
mcm 2:3710775b1864 110 * @details It gets the raw temperature.
mcm 2:3710775b1864 111 *
mcm 2:3710775b1864 112 * @param[in] NaN
mcm 2:3710775b1864 113 *
mcm 2:3710775b1864 114 * @param[out] myRawTemperature: Raw Temperature data.
mcm 2:3710775b1864 115 *
mcm 2:3710775b1864 116 *
mcm 2:3710775b1864 117 * @return Status of DS3231_ReadTemperature.
mcm 2:3710775b1864 118 *
mcm 2:3710775b1864 119 *
mcm 2:3710775b1864 120 * @author Manuel Caballero
mcm 2:3710775b1864 121 * @date 20/December/2017
mcm 2:3710775b1864 122 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 123 * @pre The temperature registers are updated after each user-initiated conversion and on every 64-second conversion.
mcm 2:3710775b1864 124 * @warning NaN.
mcm 2:3710775b1864 125 */
mcm 2:3710775b1864 126 DS3231::DS3231_status_t DS3231::DS3231_ReadRawTemperature ( DS3231_vector_data_t* myRawTemperature )
mcm 2:3710775b1864 127 {
mcm 2:3710775b1864 128 char cmd[] = { DS3231_MSB_TEMPERATURE, 0 };
mcm 2:3710775b1864 129 uint32_t aux = 0;
mcm 2:3710775b1864 130
mcm 2:3710775b1864 131
mcm 2:3710775b1864 132 // It gets the temperature
mcm 2:3710775b1864 133 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 134 aux = _i2c.read ( _DS3231_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:3710775b1864 135
mcm 2:3710775b1864 136
mcm 2:3710775b1864 137 // Parse the data
mcm 2:3710775b1864 138 myRawTemperature->MSBTemperature = cmd[0];
mcm 2:3710775b1864 139 myRawTemperature->LSBTemperature = cmd[1];
mcm 2:3710775b1864 140
mcm 2:3710775b1864 141
mcm 2:3710775b1864 142
mcm 2:3710775b1864 143
mcm 2:3710775b1864 144 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 145 return DS3231_SUCCESS;
mcm 2:3710775b1864 146 else
mcm 2:3710775b1864 147 return DS3231_FAILURE;
mcm 2:3710775b1864 148 }
mcm 2:3710775b1864 149
mcm 2:3710775b1864 150
mcm 2:3710775b1864 151
mcm 2:3710775b1864 152 /**
mcm 2:3710775b1864 153 * @brief DS3231_StartNewConvertTemperature ( void )
mcm 2:3710775b1864 154 *
mcm 2:3710775b1864 155 * @details It triggers a new temperature conversion.
mcm 2:3710775b1864 156 *
mcm 2:3710775b1864 157 * @param[in] NaN.
mcm 2:3710775b1864 158 *
mcm 2:3710775b1864 159 * @param[out] NaN.
mcm 2:3710775b1864 160 *
mcm 2:3710775b1864 161 *
mcm 2:3710775b1864 162 * @return Status of DS3231_StartNewConvertTemperature.
mcm 2:3710775b1864 163 *
mcm 2:3710775b1864 164 *
mcm 2:3710775b1864 165 * @author Manuel Caballero
mcm 2:3710775b1864 166 * @date 20/December/2017
mcm 2:3710775b1864 167 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 168 * @pre NaN
mcm 2:3710775b1864 169 * @warning NaN.
mcm 2:3710775b1864 170 */
mcm 2:3710775b1864 171 DS3231::DS3231_status_t DS3231::DS3231_StartNewConvertTemperature ( void )
mcm 2:3710775b1864 172 {
mcm 2:3710775b1864 173 char cmd[] = { DS3231_CONTROL_STATUS, 0 };
mcm 2:3710775b1864 174 uint32_t aux = 0;
mcm 2:3710775b1864 175 uint32_t ii = 0;
mcm 2:3710775b1864 176
mcm 2:3710775b1864 177
mcm 2:3710775b1864 178 // BSY MUST be checked before triggering a new temperature conversion
mcm 2:3710775b1864 179 do
mcm 2:3710775b1864 180 {
mcm 2:3710775b1864 181 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 182 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 183
mcm 2:3710775b1864 184 ii++;
mcm 2:3710775b1864 185 }
mcm 2:3710775b1864 186 while ( ( ( cmd[1] & STATUS_BUSY_MASK ) != STATUS_BUSY_NOBUSY ) && ( ii < DS3231_TIMEOUT ) );
mcm 2:3710775b1864 187
mcm 2:3710775b1864 188
mcm 2:3710775b1864 189 // if something went wrong, there will not be a new temperature conversion
mcm 2:3710775b1864 190 cmd[0] = DS3231_CONTROL;
mcm 2:3710775b1864 191 if ( ii < DS3231_TIMEOUT )
mcm 2:3710775b1864 192 {
mcm 2:3710775b1864 193 // It triggers a new temperature conversion
mcm 2:3710775b1864 194 // It reads CONTROL register
mcm 2:3710775b1864 195 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 196 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 197
mcm 2:3710775b1864 198 // Start a new temperature conversion
mcm 2:3710775b1864 199 cmd[1] |= CONTROL_STATUS_CONVERT_TEMPERATURE_ENABLED;
mcm 2:3710775b1864 200 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 201
mcm 2:3710775b1864 202 // Wait until the temperature conversion is completed
mcm 2:3710775b1864 203 ii = 0;
mcm 2:3710775b1864 204 do
mcm 2:3710775b1864 205 {
mcm 2:3710775b1864 206 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 207 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 208
mcm 2:3710775b1864 209 ii++;
mcm 2:3710775b1864 210 }
mcm 2:3710775b1864 211 while ( ( ( cmd[1] & CONTROL_STATUS_CONVERT_TEMPERATURE_MASK ) != CONTROL_STATUS_CONVERT_TEMPERATURE_DISABLED ) && ( ii < DS3231_TIMEOUT ) );
mcm 2:3710775b1864 212 }
mcm 2:3710775b1864 213
mcm 2:3710775b1864 214 // If TIMEOUT happens, something went wrong!
mcm 2:3710775b1864 215 if ( ii >= DS3231_TIMEOUT )
mcm 2:3710775b1864 216 aux = I2C_FAILURE;
mcm 2:3710775b1864 217
mcm 2:3710775b1864 218
mcm 2:3710775b1864 219
mcm 2:3710775b1864 220
mcm 2:3710775b1864 221 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 222 return DS3231_SUCCESS;
mcm 2:3710775b1864 223 else
mcm 2:3710775b1864 224 return DS3231_FAILURE;
mcm 2:3710775b1864 225 }
mcm 2:3710775b1864 226
mcm 2:3710775b1864 227
mcm 2:3710775b1864 228
mcm 2:3710775b1864 229 /**
mcm 2:3710775b1864 230 * @brief DS3231_ReadRawAging ( DS3231_vector_data_t* )
mcm 2:3710775b1864 231 *
mcm 2:3710775b1864 232 * @details It gets the raw aging.
mcm 2:3710775b1864 233 *
mcm 2:3710775b1864 234 * @param[in] NaN
mcm 2:3710775b1864 235 *
mcm 2:3710775b1864 236 * @param[out] myRawAging: Raw Aging data.
mcm 2:3710775b1864 237 *
mcm 2:3710775b1864 238 *
mcm 2:3710775b1864 239 * @return Status of DS3231_ReadRawAging.
mcm 2:3710775b1864 240 *
mcm 2:3710775b1864 241 *
mcm 2:3710775b1864 242 * @author Manuel Caballero
mcm 2:3710775b1864 243 * @date 20/December/2017
mcm 2:3710775b1864 244 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 245 * @pre NaN
mcm 2:3710775b1864 246 * @warning NaN.
mcm 2:3710775b1864 247 */
mcm 2:3710775b1864 248 DS3231::DS3231_status_t DS3231::DS3231_ReadRawAging ( DS3231_vector_data_t* myRawAging )
mcm 2:3710775b1864 249 {
mcm 2:3710775b1864 250 char cmd = DS3231_AGING_OFFSET;
mcm 2:3710775b1864 251 uint32_t aux = 0;
mcm 2:3710775b1864 252
mcm 2:3710775b1864 253
mcm 2:3710775b1864 254 // It gets the raw aging value
mcm 2:3710775b1864 255 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 256 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 257
mcm 2:3710775b1864 258 myRawAging->RawAging = cmd;
mcm 2:3710775b1864 259
mcm 2:3710775b1864 260
mcm 2:3710775b1864 261
mcm 2:3710775b1864 262 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 263 return DS3231_SUCCESS;
mcm 2:3710775b1864 264 else
mcm 2:3710775b1864 265 return DS3231_FAILURE;
mcm 2:3710775b1864 266 }
mcm 2:3710775b1864 267
mcm 2:3710775b1864 268
mcm 2:3710775b1864 269
mcm 2:3710775b1864 270 /**
mcm 2:3710775b1864 271 * @brief DS3231_Status32kHzPin ( DS3231_status_enable_32khz_output_t )
mcm 2:3710775b1864 272 *
mcm 2:3710775b1864 273 * @details It enables/disables the 32kHz output pin.
mcm 2:3710775b1864 274 *
mcm 2:3710775b1864 275 * @param[in] my32kHzPin: 32kHz pin enabled/disabled.
mcm 2:3710775b1864 276 *
mcm 2:3710775b1864 277 * @param[out] NaN.
mcm 2:3710775b1864 278 *
mcm 2:3710775b1864 279 *
mcm 2:3710775b1864 280 * @return Status of DS3231_Status32kHzPin.
mcm 2:3710775b1864 281 *
mcm 2:3710775b1864 282 *
mcm 2:3710775b1864 283 * @author Manuel Caballero
mcm 2:3710775b1864 284 * @date 20/December/2017
mcm 2:3710775b1864 285 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 286 * @pre NaN
mcm 2:3710775b1864 287 * @warning NaN.
mcm 2:3710775b1864 288 */
mcm 2:3710775b1864 289 DS3231::DS3231_status_t DS3231::DS3231_Status32kHzPin ( DS3231_status_enable_32khz_output_t my32kHzPin )
mcm 2:3710775b1864 290 {
mcm 2:3710775b1864 291 char cmd[] = { DS3231_CONTROL_STATUS, 0 };
mcm 2:3710775b1864 292 uint32_t aux = 0;
mcm 2:3710775b1864 293
mcm 2:3710775b1864 294
mcm 2:3710775b1864 295 // It reads the status register to parse the data
mcm 2:3710775b1864 296 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 297 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 298
mcm 2:3710775b1864 299 cmd[1] &= ~STATUS_ENABLE_32KHZ_OUTPUT_MASK;
mcm 2:3710775b1864 300 cmd[1] |= my32kHzPin;
mcm 2:3710775b1864 301
mcm 2:3710775b1864 302 // Update the register
mcm 2:3710775b1864 303 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 304
mcm 2:3710775b1864 305
mcm 2:3710775b1864 306
mcm 2:3710775b1864 307
mcm 2:3710775b1864 308 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 309 return DS3231_SUCCESS;
mcm 2:3710775b1864 310 else
mcm 2:3710775b1864 311 return DS3231_FAILURE;
mcm 2:3710775b1864 312 }
mcm 2:3710775b1864 313
mcm 2:3710775b1864 314
mcm 2:3710775b1864 315
mcm 2:3710775b1864 316 /**
mcm 2:3710775b1864 317 * @brief DS3231_ClearAlarmFlag ( DS3231_status_alarm1_flag_t , DS3231_status_alarm2_flag_t )
mcm 2:3710775b1864 318 *
mcm 2:3710775b1864 319 * @details It clears alarm flags.
mcm 2:3710775b1864 320 *
mcm 2:3710775b1864 321 * @param[in] myA1F: Reset/Mask alarm 1 flag.
mcm 2:3710775b1864 322 * @param[in] myA2F: Reset/Mask alarm 2 flag.
mcm 2:3710775b1864 323 *
mcm 2:3710775b1864 324 * @param[out] NaN.
mcm 2:3710775b1864 325 *
mcm 2:3710775b1864 326 *
mcm 2:3710775b1864 327 * @return Status of DS3231_ClearAlarmFlag.
mcm 2:3710775b1864 328 *
mcm 2:3710775b1864 329 *
mcm 2:3710775b1864 330 * @author Manuel Caballero
mcm 2:3710775b1864 331 * @date 20/December/2017
mcm 2:3710775b1864 332 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 333 * @pre NaN
mcm 2:3710775b1864 334 * @warning NaN.
mcm 2:3710775b1864 335 */
mcm 2:3710775b1864 336 DS3231::DS3231_status_t DS3231::DS3231_ClearAlarmFlag ( DS3231_status_alarm1_flag_t myA1F, DS3231_status_alarm2_flag_t myA2F )
mcm 2:3710775b1864 337 {
mcm 2:3710775b1864 338 char cmd[] = { DS3231_CONTROL_STATUS, 0 };
mcm 2:3710775b1864 339 uint32_t aux = 0;
mcm 2:3710775b1864 340
mcm 2:3710775b1864 341
mcm 2:3710775b1864 342 // It reads the status register to parse the data
mcm 2:3710775b1864 343 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 344 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 345
mcm 2:3710775b1864 346 cmd[1] &= ~( STATUS_ALARM1_FLAG_MASK | STATUS_ALARM2_FLAG_MASK );
mcm 2:3710775b1864 347 cmd[1] |= ( myA1F | myA2F );
mcm 2:3710775b1864 348
mcm 2:3710775b1864 349 // Update the register
mcm 2:3710775b1864 350 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 351
mcm 2:3710775b1864 352
mcm 2:3710775b1864 353
mcm 2:3710775b1864 354
mcm 2:3710775b1864 355 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 356 return DS3231_SUCCESS;
mcm 2:3710775b1864 357 else
mcm 2:3710775b1864 358 return DS3231_FAILURE;
mcm 2:3710775b1864 359 }
mcm 2:3710775b1864 360
mcm 2:3710775b1864 361
mcm 2:3710775b1864 362
mcm 2:3710775b1864 363 /**
mcm 2:3710775b1864 364 * @brief DS3231_SetAlarm1 ( DS3231_alarm1_register_t )
mcm 2:3710775b1864 365 *
mcm 2:3710775b1864 366 * @details It sets the alarm 1.
mcm 2:3710775b1864 367 *
mcm 2:3710775b1864 368 * @param[in] myAlarm1: Alarm 1 options.
mcm 2:3710775b1864 369 *
mcm 2:3710775b1864 370 * @param[out] NaN.
mcm 2:3710775b1864 371 *
mcm 2:3710775b1864 372 *
mcm 2:3710775b1864 373 * @return Status of DS3231_SetAlarm1.
mcm 2:3710775b1864 374 *
mcm 2:3710775b1864 375 *
mcm 2:3710775b1864 376 * @author Manuel Caballero
mcm 2:3710775b1864 377 * @date 20/December/2017
mcm 2:3710775b1864 378 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 379 * @pre NaN
mcm 2:3710775b1864 380 * @warning NaN.
mcm 2:3710775b1864 381 */
mcm 2:3710775b1864 382 DS3231::DS3231_status_t DS3231::DS3231_SetAlarm1 ( DS3231_alarm1_register_t myAlarm1 )
mcm 2:3710775b1864 383 {
mcm 2:3710775b1864 384 char cmd[] = { 0, 0 };
mcm 2:3710775b1864 385 uint32_t aux = 0;
mcm 2:3710775b1864 386 uint32_t Alarm1SecondAux = 0; // A1M1
mcm 2:3710775b1864 387 uint32_t Alarm1MinuteAux = 0; // A1M2
mcm 2:3710775b1864 388 uint32_t Alarm1HourAux = 0; // A1M3
mcm 2:3710775b1864 389 uint32_t Alarm1DayDateAux = 0; // A1M4 & DYDT
mcm 2:3710775b1864 390
mcm 2:3710775b1864 391
mcm 2:3710775b1864 392 // Read all the registers involved in the alarm1
mcm 2:3710775b1864 393 // A1M1
mcm 2:3710775b1864 394 cmd[0] = DS3231_ALARM_1_SECONDS;
mcm 2:3710775b1864 395 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 396 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 397
mcm 2:3710775b1864 398 Alarm1SecondAux = ( cmd[1] & ~ALARM1_A1M1_MASK );
mcm 2:3710775b1864 399
mcm 2:3710775b1864 400 // A1M2
mcm 2:3710775b1864 401 cmd[0] = DS3231_ALARM_1_MINUTES;
mcm 2:3710775b1864 402 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 403 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 404
mcm 2:3710775b1864 405 Alarm1MinuteAux = ( cmd[1] & ~ALARM1_A1M2_MASK );
mcm 2:3710775b1864 406
mcm 2:3710775b1864 407 // A1M3
mcm 2:3710775b1864 408 cmd[0] = DS3231_ALARM_1_HOURS;
mcm 2:3710775b1864 409 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 410 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 411
mcm 2:3710775b1864 412 Alarm1HourAux = ( cmd[1] & ~ALARM1_A1M3_MASK );
mcm 2:3710775b1864 413
mcm 2:3710775b1864 414 // A1M4 & DY/#DT
mcm 2:3710775b1864 415 cmd[0] = DS3231_ALARM_1_DAY_DATE;
mcm 2:3710775b1864 416 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 417 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 418
mcm 2:3710775b1864 419 Alarm1DayDateAux = ( cmd[1] & ~( ALARM1_A1M4_MASK | ALARM1_DYDT_MASK ) );
mcm 2:3710775b1864 420
mcm 2:3710775b1864 421
mcm 2:3710775b1864 422 // Set all ( A1M1, A1M2, A1M3 A1M4 and DY/#DT ) to 0
mcm 2:3710775b1864 423 cmd[0] = DS3231_ALARM_1_SECONDS;
mcm 2:3710775b1864 424 cmd[1] = Alarm1SecondAux;
mcm 2:3710775b1864 425 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 426
mcm 2:3710775b1864 427 cmd[0] = DS3231_ALARM_1_MINUTES;
mcm 2:3710775b1864 428 cmd[1] = Alarm1MinuteAux;
mcm 2:3710775b1864 429 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 430
mcm 2:3710775b1864 431 cmd[0] = DS3231_ALARM_1_HOURS;
mcm 2:3710775b1864 432 cmd[1] = Alarm1HourAux;
mcm 2:3710775b1864 433 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 434
mcm 2:3710775b1864 435 cmd[0] = DS3231_ALARM_1_DAY_DATE;
mcm 2:3710775b1864 436 cmd[1] = Alarm1DayDateAux;
mcm 2:3710775b1864 437 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 438
mcm 2:3710775b1864 439
mcm 2:3710775b1864 440 // Update the Alarm 1 rate
mcm 2:3710775b1864 441 switch ( myAlarm1 )
mcm 2:3710775b1864 442 {
mcm 2:3710775b1864 443 case ALARM1_ALARM_ONCE_PER_SECOND:
mcm 2:3710775b1864 444 cmd[0] = DS3231_ALARM_1_SECONDS;
mcm 2:3710775b1864 445 cmd[1] = ( Alarm1SecondAux | ALARM1_A1M1_MASK );
mcm 2:3710775b1864 446
mcm 2:3710775b1864 447 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 448
mcm 2:3710775b1864 449 case ALARM1_WHEN_SECONDS_MATCH:
mcm 2:3710775b1864 450 cmd[0] = DS3231_ALARM_1_MINUTES;
mcm 2:3710775b1864 451 cmd[1] = ( Alarm1MinuteAux | ALARM1_A1M2_MASK );
mcm 2:3710775b1864 452
mcm 2:3710775b1864 453 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 454
mcm 2:3710775b1864 455 case ALARM1_WHEN_MINUTES_AND_SECONDS_MATCH:
mcm 2:3710775b1864 456 cmd[0] = DS3231_ALARM_1_HOURS;
mcm 2:3710775b1864 457 cmd[1] = ( Alarm1HourAux | ALARM1_A1M3_MASK );
mcm 2:3710775b1864 458
mcm 2:3710775b1864 459 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 460
mcm 2:3710775b1864 461 case ALARM1_WHEN_HOURS_MINUTES_AND_SECONDS_MATCH:
mcm 2:3710775b1864 462 cmd[0] = DS3231_ALARM_1_DAY_DATE;
mcm 2:3710775b1864 463 cmd[1] = ( Alarm1DayDateAux | ALARM1_A1M4_MASK );
mcm 2:3710775b1864 464
mcm 2:3710775b1864 465 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 466 break;
mcm 2:3710775b1864 467
mcm 2:3710775b1864 468 default:
mcm 2:3710775b1864 469 case ALARM1_WHEN_DATE_HOURS_MINUTES_AND_SECONDS_MATCH:
mcm 2:3710775b1864 470 break;
mcm 2:3710775b1864 471
mcm 2:3710775b1864 472 case ALARM1_WHEN_DAY_HOURS_MINUTES_AND_SECONDS_MATCH:
mcm 2:3710775b1864 473 cmd[0] = DS3231_ALARM_1_DAY_DATE;
mcm 2:3710775b1864 474 cmd[1] = ( Alarm1DayDateAux | ALARM1_DYDT_MASK );
mcm 2:3710775b1864 475
mcm 2:3710775b1864 476 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 477 break;
mcm 2:3710775b1864 478 }
mcm 2:3710775b1864 479
mcm 2:3710775b1864 480
mcm 2:3710775b1864 481
mcm 2:3710775b1864 482
mcm 2:3710775b1864 483 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 484 return DS3231_SUCCESS;
mcm 2:3710775b1864 485 else
mcm 2:3710775b1864 486 return DS3231_FAILURE;
mcm 2:3710775b1864 487 }
mcm 2:3710775b1864 488
mcm 2:3710775b1864 489
mcm 2:3710775b1864 490 /**
mcm 2:3710775b1864 491 * @brief DS3231_SetAlarm2 ( DS3231_alarm2_register_t )
mcm 2:3710775b1864 492 *
mcm 2:3710775b1864 493 * @details It sets the alarm 2.
mcm 2:3710775b1864 494 *
mcm 2:3710775b1864 495 * @param[in] myAlarm1: Alarm 2 options.
mcm 2:3710775b1864 496 *
mcm 2:3710775b1864 497 * @param[out] NaN.
mcm 2:3710775b1864 498 *
mcm 2:3710775b1864 499 *
mcm 2:3710775b1864 500 * @return Status of DS3231_SetAlarm2.
mcm 2:3710775b1864 501 *
mcm 2:3710775b1864 502 *
mcm 2:3710775b1864 503 * @author Manuel Caballero
mcm 2:3710775b1864 504 * @date 20/December/2017
mcm 2:3710775b1864 505 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 506 * @pre NaN
mcm 2:3710775b1864 507 * @warning NaN.
mcm 2:3710775b1864 508 */
mcm 2:3710775b1864 509 DS3231::DS3231_status_t DS3231::DS3231_SetAlarm2 ( DS3231_alarm2_register_t myAlarm2 )
mcm 2:3710775b1864 510 {
mcm 2:3710775b1864 511 char cmd[] = { 0, 0 };
mcm 2:3710775b1864 512 uint32_t aux = 0;
mcm 2:3710775b1864 513 uint32_t Alarm2MinuteAux = 0; // A2M2
mcm 2:3710775b1864 514 uint32_t Alarm2HourAux = 0; // A2M3
mcm 2:3710775b1864 515 uint32_t Alarm2DayDateAux = 0; // A2M3 & DYDT
mcm 2:3710775b1864 516
mcm 2:3710775b1864 517
mcm 2:3710775b1864 518 // Read all the registers involved in the alarm2
mcm 2:3710775b1864 519 // A2M2
mcm 2:3710775b1864 520 cmd[0] = DS3231_ALARM_2_MINUTES;
mcm 2:3710775b1864 521 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 522 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 523
mcm 2:3710775b1864 524 Alarm2MinuteAux = ( cmd[1] & ~ALARM2_A2M2_MASK );
mcm 2:3710775b1864 525
mcm 2:3710775b1864 526 // A2M3
mcm 2:3710775b1864 527 cmd[0] = DS3231_ALARM_2_HOURS;
mcm 2:3710775b1864 528 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 529 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 530
mcm 2:3710775b1864 531 Alarm2HourAux = ( cmd[1] & ~ALARM2_A2M3_MASK );
mcm 2:3710775b1864 532
mcm 2:3710775b1864 533 // A2M4 & DY/#DT
mcm 2:3710775b1864 534 cmd[0] = DS3231_ALARM_2_DAY_DATE;
mcm 2:3710775b1864 535 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 536 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 537
mcm 2:3710775b1864 538 Alarm2DayDateAux = ( cmd[1] & ~( ALARM2_A2M4_MASK | ALARM2_DYDT_MASK ) );
mcm 2:3710775b1864 539
mcm 2:3710775b1864 540
mcm 2:3710775b1864 541 // Set all ( A2M2, A2M3 A2M4 and DY/#DT ) to 0
mcm 2:3710775b1864 542 cmd[0] = DS3231_ALARM_2_MINUTES;
mcm 2:3710775b1864 543 cmd[1] = Alarm2MinuteAux;
mcm 2:3710775b1864 544 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 545
mcm 2:3710775b1864 546 cmd[0] = DS3231_ALARM_2_HOURS;
mcm 2:3710775b1864 547 cmd[1] = Alarm2HourAux;
mcm 2:3710775b1864 548 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 549
mcm 2:3710775b1864 550 cmd[0] = DS3231_ALARM_2_DAY_DATE;
mcm 2:3710775b1864 551 cmd[1] = Alarm2DayDateAux;
mcm 2:3710775b1864 552 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 553
mcm 2:3710775b1864 554
mcm 2:3710775b1864 555 // Update the Alarm 2 rate
mcm 2:3710775b1864 556 switch ( myAlarm2 )
mcm 2:3710775b1864 557 {
mcm 2:3710775b1864 558 case ALARM2_ALARM_ONCE_PER_MINUTE:
mcm 2:3710775b1864 559 cmd[0] = DS3231_ALARM_2_MINUTES;
mcm 2:3710775b1864 560 cmd[1] = ( Alarm2MinuteAux | ALARM2_A2M2_MASK );
mcm 2:3710775b1864 561
mcm 2:3710775b1864 562 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 563
mcm 2:3710775b1864 564 case ALARM2_WHEN_MINUTES_MATCH:
mcm 2:3710775b1864 565 cmd[0] = DS3231_ALARM_2_HOURS;
mcm 2:3710775b1864 566 cmd[1] = ( Alarm2HourAux | ALARM2_A2M3_MASK );
mcm 2:3710775b1864 567
mcm 2:3710775b1864 568 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 569
mcm 2:3710775b1864 570 case ALARM2_WHEN_HOURS_MINUTES_MATCH:
mcm 2:3710775b1864 571 cmd[0] = DS3231_ALARM_2_DAY_DATE;
mcm 2:3710775b1864 572 cmd[1] = ( Alarm2DayDateAux | ALARM2_A2M4_MASK );
mcm 2:3710775b1864 573
mcm 2:3710775b1864 574 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 575 break;
mcm 2:3710775b1864 576
mcm 2:3710775b1864 577 default:
mcm 2:3710775b1864 578 case ALARM2_WHEN_DATE_HOURS_AND_MINUTES_MATCH:
mcm 2:3710775b1864 579 break;
mcm 2:3710775b1864 580
mcm 2:3710775b1864 581 case ALARM2_WHEN_DAY_HOURS_AND_MINUTES_MATCH:
mcm 2:3710775b1864 582 cmd[0] = DS3231_ALARM_2_DAY_DATE;
mcm 2:3710775b1864 583 cmd[1] = ( Alarm2DayDateAux | ALARM2_DYDT_MASK );
mcm 2:3710775b1864 584
mcm 2:3710775b1864 585 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 586 break;
mcm 2:3710775b1864 587 }
mcm 2:3710775b1864 588
mcm 2:3710775b1864 589
mcm 2:3710775b1864 590
mcm 2:3710775b1864 591
mcm 2:3710775b1864 592
mcm 2:3710775b1864 593 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 594 return DS3231_SUCCESS;
mcm 2:3710775b1864 595 else
mcm 2:3710775b1864 596 return DS3231_FAILURE;
mcm 2:3710775b1864 597 }
mcm 2:3710775b1864 598
mcm 2:3710775b1864 599
mcm 2:3710775b1864 600 /**
mcm 2:3710775b1864 601 * @brief DS3231_SetAlarmsInterrupt ( DS3231_control_status_alarm1_t , DS3231_control_status_alarm2_t )
mcm 2:3710775b1864 602 *
mcm 2:3710775b1864 603 * @details It enables/disable alarm interrupts.
mcm 2:3710775b1864 604 *
mcm 2:3710775b1864 605 * @param[in] myAlarm1: Enable/Disable Alarm1 interrupt.
mcm 2:3710775b1864 606 * @param[in] myAlarm2: Enable/Disable Alarm2 interrupt.
mcm 2:3710775b1864 607 *
mcm 2:3710775b1864 608 * @param[out] NaN.
mcm 2:3710775b1864 609 *
mcm 2:3710775b1864 610 *
mcm 2:3710775b1864 611 * @return Status of DS3231_SetAlarmsInterrupt.
mcm 2:3710775b1864 612 *
mcm 2:3710775b1864 613 *
mcm 2:3710775b1864 614 * @author Manuel Caballero
mcm 2:3710775b1864 615 * @date 20/December/2017
mcm 2:3710775b1864 616 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 617 * @pre NaN
mcm 2:3710775b1864 618 * @warning NaN.
mcm 2:3710775b1864 619 */
mcm 2:3710775b1864 620 DS3231::DS3231_status_t DS3231::DS3231_SetAlarmsInterrupt ( DS3231_control_status_alarm1_t myAlarm1, DS3231_control_status_alarm2_t myAlarm2 )
mcm 2:3710775b1864 621 {
mcm 2:3710775b1864 622 char cmd[] = { DS3231_CONTROL, 0 };
mcm 2:3710775b1864 623 uint32_t aux = 0;
mcm 2:3710775b1864 624
mcm 2:3710775b1864 625
mcm 2:3710775b1864 626 // Read the Control Register
mcm 2:3710775b1864 627 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 628 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 629
mcm 2:3710775b1864 630 // Parse the data
mcm 2:3710775b1864 631 cmd[1] &= ~( CONTROL_STATUS_ALARM1_MASK | CONTROL_STATUS_ALARM2_MASK );
mcm 2:3710775b1864 632 cmd[1] |= ( myAlarm1 | myAlarm2 );
mcm 2:3710775b1864 633
mcm 2:3710775b1864 634
mcm 2:3710775b1864 635 // If both alarms are off then, disables the alarm interrupts, enables them otherwise.
mcm 2:3710775b1864 636 if ( ( myAlarm1 == CONTROL_STATUS_ALARM1_DISABLED ) && ( myAlarm2 == CONTROL_STATUS_ALARM2_DISABLED ) )
mcm 2:3710775b1864 637 cmd[1] &= ~CONTROL_STATUS_INTERRUPT_CONTROL_MASK;
mcm 2:3710775b1864 638 else
mcm 2:3710775b1864 639 cmd[1] |= CONTROL_STATUS_INTERRUPT_CONTROL_INT;
mcm 2:3710775b1864 640
mcm 2:3710775b1864 641
mcm 2:3710775b1864 642 // Update the register
mcm 2:3710775b1864 643 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 644
mcm 2:3710775b1864 645
mcm 2:3710775b1864 646
mcm 2:3710775b1864 647 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 648 return DS3231_SUCCESS;
mcm 2:3710775b1864 649 else
mcm 2:3710775b1864 650 return DS3231_FAILURE;
mcm 2:3710775b1864 651 }
mcm 2:3710775b1864 652
mcm 2:3710775b1864 653
mcm 2:3710775b1864 654 /**
mcm 2:3710775b1864 655 * @brief DS3231_SetSquareWaveOutput ( DS3231_control_status_rate_select_t )
mcm 2:3710775b1864 656 *
mcm 2:3710775b1864 657 * @details It enables/disable the square-wave output.
mcm 2:3710775b1864 658 *
mcm 2:3710775b1864 659 * @param[in] myRate: Square-wave output frequency.
mcm 2:3710775b1864 660 *
mcm 2:3710775b1864 661 * @param[out] NaN.
mcm 2:3710775b1864 662 *
mcm 2:3710775b1864 663 *
mcm 2:3710775b1864 664 * @return Status of DS3231_SetSquareWaveOutput.
mcm 2:3710775b1864 665 *
mcm 2:3710775b1864 666 *
mcm 2:3710775b1864 667 * @author Manuel Caballero
mcm 2:3710775b1864 668 * @date 19/December/2017
mcm 2:3710775b1864 669 * @version 19/December/2017 The ORIGIN
mcm 2:3710775b1864 670 * @pre NaN
mcm 2:3710775b1864 671 * @warning NaN.
mcm 2:3710775b1864 672 */
mcm 2:3710775b1864 673 DS3231::DS3231_status_t DS3231::DS3231_SetSquareWaveOutput ( DS3231_control_status_rate_select_t myRate )
mcm 2:3710775b1864 674 {
mcm 2:3710775b1864 675 char cmd[] = { DS3231_CONTROL, 0 };
mcm 2:3710775b1864 676 uint32_t aux = 0;
mcm 2:3710775b1864 677
mcm 2:3710775b1864 678
mcm 2:3710775b1864 679 // Read the Control Register
mcm 2:3710775b1864 680 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
mcm 2:3710775b1864 681 aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
mcm 2:3710775b1864 682
mcm 2:3710775b1864 683 // Parse the data
mcm 2:3710775b1864 684 cmd[1] &= ~CONTROL_STATUS_RATE_SELECT_MASK;
mcm 2:3710775b1864 685 cmd[1] |= myRate;
mcm 2:3710775b1864 686
mcm 2:3710775b1864 687
mcm 2:3710775b1864 688 // Enable the square-wave output.
mcm 2:3710775b1864 689 cmd[1] &= ~CONTROL_STATUS_INTERRUPT_CONTROL_MASK;
mcm 2:3710775b1864 690
mcm 2:3710775b1864 691
mcm 2:3710775b1864 692 // Update the register
mcm 2:3710775b1864 693 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 694
mcm 2:3710775b1864 695
mcm 2:3710775b1864 696
mcm 2:3710775b1864 697 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 698 return DS3231_SUCCESS;
mcm 2:3710775b1864 699 else
mcm 2:3710775b1864 700 return DS3231_FAILURE;
mcm 2:3710775b1864 701 }
mcm 2:3710775b1864 702
mcm 2:3710775b1864 703
mcm 2:3710775b1864 704 /**
mcm 2:3710775b1864 705 * @brief DS3231_GetDate ( DS3231_vector_date_time_t* )
mcm 2:3710775b1864 706 *
mcm 2:3710775b1864 707 * @details It gets the date.
mcm 2:3710775b1864 708 *
mcm 2:3710775b1864 709 * @param[in] myDate: Current Date.
mcm 2:3710775b1864 710 *
mcm 2:3710775b1864 711 * @param[out] NaN.
mcm 2:3710775b1864 712 *
mcm 2:3710775b1864 713 *
mcm 2:3710775b1864 714 * @return Status of DS3231_GetDate.
mcm 2:3710775b1864 715 *
mcm 2:3710775b1864 716 *
mcm 2:3710775b1864 717 * @author Manuel Caballero
mcm 2:3710775b1864 718 * @date 20/December/2017
mcm 2:3710775b1864 719 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 720 * @pre NaN
mcm 2:3710775b1864 721 * @warning NaN.
mcm 2:3710775b1864 722 */
mcm 2:3710775b1864 723 DS3231::DS3231_status_t DS3231::DS3231_GetDate ( DS3231_vector_date_time_t* myDate )
mcm 2:3710775b1864 724 {
mcm 2:3710775b1864 725 char cmd = 0;
mcm 2:3710775b1864 726 uint32_t aux = 0;
mcm 2:3710775b1864 727
mcm 2:3710775b1864 728
mcm 2:3710775b1864 729 // Read Date Register
mcm 2:3710775b1864 730 cmd = DS3231_DATE;
mcm 2:3710775b1864 731 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 732 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 733
mcm 2:3710775b1864 734 myDate->Date = _MYBCD_TO_DECIMAL( cmd );
mcm 2:3710775b1864 735
mcm 2:3710775b1864 736 // Read Month Register
mcm 2:3710775b1864 737 cmd = DS3231_MONTH_CENTURY;
mcm 2:3710775b1864 738 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 739 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 740
mcm 2:3710775b1864 741 myDate->Month = _MYBCD_TO_DECIMAL( cmd & MONTH_MONTH_MASK );
mcm 2:3710775b1864 742 myDate->Century = _MYBCD_TO_DECIMAL( cmd & MONTH_CENTURY_MASK );
mcm 2:3710775b1864 743
mcm 2:3710775b1864 744 // Read Year Register
mcm 2:3710775b1864 745 cmd = DS3231_YEAR;
mcm 2:3710775b1864 746 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 747 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 748
mcm 2:3710775b1864 749 myDate->Year = _MYBCD_TO_DECIMAL( cmd );
mcm 2:3710775b1864 750
mcm 2:3710775b1864 751 // Read Day of the Week Register
mcm 2:3710775b1864 752 cmd = DS3231_DAY;
mcm 2:3710775b1864 753 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 754 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 755
mcm 2:3710775b1864 756 myDate->DayOfWeek = _MYBCD_TO_DECIMAL( cmd );
mcm 2:3710775b1864 757
mcm 2:3710775b1864 758
mcm 2:3710775b1864 759
mcm 2:3710775b1864 760
mcm 2:3710775b1864 761 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 762 return DS3231_SUCCESS;
mcm 2:3710775b1864 763 else
mcm 2:3710775b1864 764 return DS3231_FAILURE;
mcm 2:3710775b1864 765 }
mcm 2:3710775b1864 766
mcm 2:3710775b1864 767
mcm 2:3710775b1864 768 /**
mcm 2:3710775b1864 769 * @brief DS3231_SetDate ( DS3231_vector_date_time_t )
mcm 2:3710775b1864 770 *
mcm 2:3710775b1864 771 * @details It sets the date.
mcm 2:3710775b1864 772 *
mcm 2:3710775b1864 773 * @param[in] myTime: Date to store.
mcm 2:3710775b1864 774 *
mcm 2:3710775b1864 775 * @param[out] NaN.
mcm 2:3710775b1864 776 *
mcm 2:3710775b1864 777 *
mcm 2:3710775b1864 778 * @return Status of DS3231_SetDate.
mcm 2:3710775b1864 779 *
mcm 2:3710775b1864 780 *
mcm 2:3710775b1864 781 * @author Manuel Caballero
mcm 2:3710775b1864 782 * @date 20/December/2017
mcm 2:3710775b1864 783 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 784 * @pre NaN
mcm 2:3710775b1864 785 * @warning NaN.
mcm 2:3710775b1864 786 */
mcm 2:3710775b1864 787 DS3231::DS3231_status_t DS3231::DS3231_SetDate ( DS3231_vector_date_time_t myDate )
mcm 2:3710775b1864 788 {
mcm 2:3710775b1864 789 char cmd[] = { 0, 0 };
mcm 2:3710775b1864 790 uint32_t aux = 0;
mcm 2:3710775b1864 791
mcm 2:3710775b1864 792
mcm 2:3710775b1864 793 // Update Date Register
mcm 2:3710775b1864 794 cmd[0] = DS3231_DATE;
mcm 2:3710775b1864 795 cmd[1] = _MYDECIMAL_TO_BCD( myDate.Date );
mcm 2:3710775b1864 796 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 797
mcm 2:3710775b1864 798 // Update Month Register
mcm 2:3710775b1864 799 cmd[0] = DS3231_MONTH_CENTURY;
mcm 2:3710775b1864 800 cmd[1] = _MYDECIMAL_TO_BCD( myDate.Month | myDate.Century );
mcm 2:3710775b1864 801 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 802
mcm 2:3710775b1864 803 // Update Year Register
mcm 2:3710775b1864 804 cmd[0] = DS3231_YEAR;
mcm 2:3710775b1864 805 cmd[1] = _MYDECIMAL_TO_BCD( myDate.Year );
mcm 2:3710775b1864 806 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 807
mcm 2:3710775b1864 808 // Update Day Register
mcm 2:3710775b1864 809 cmd[0] = DS3231_DAY;
mcm 2:3710775b1864 810 cmd[1] = _MYDECIMAL_TO_BCD( myDate.DayOfWeek );
mcm 2:3710775b1864 811 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 812
mcm 2:3710775b1864 813
mcm 2:3710775b1864 814
mcm 2:3710775b1864 815 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 816 return DS3231_SUCCESS;
mcm 2:3710775b1864 817 else
mcm 2:3710775b1864 818 return DS3231_FAILURE;
mcm 2:3710775b1864 819 }
mcm 2:3710775b1864 820
mcm 2:3710775b1864 821
mcm 2:3710775b1864 822 /**
mcm 2:3710775b1864 823 * @brief DS3231_GetTime ( DS3231_vector_date_time_t* )
mcm 2:3710775b1864 824 *
mcm 2:3710775b1864 825 * @details It gets the time in decimal.
mcm 2:3710775b1864 826 *
mcm 2:3710775b1864 827 * @param[in] myTime: Current Time.
mcm 2:3710775b1864 828 *
mcm 2:3710775b1864 829 * @param[out] NaN.
mcm 2:3710775b1864 830 *
mcm 2:3710775b1864 831 *
mcm 2:3710775b1864 832 * @return Status of DS3231_GetTime.
mcm 2:3710775b1864 833 *
mcm 2:3710775b1864 834 *
mcm 2:3710775b1864 835 * @author Manuel Caballero
mcm 2:3710775b1864 836 * @date 20/December/2017
mcm 2:3710775b1864 837 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 838 * @pre NaN
mcm 2:3710775b1864 839 * @warning NaN.
mcm 2:3710775b1864 840 */
mcm 2:3710775b1864 841 DS3231::DS3231_status_t DS3231::DS3231_GetTime ( DS3231_vector_date_time_t* myTime )
mcm 2:3710775b1864 842 {
mcm 2:3710775b1864 843 char cmd = 0;
mcm 2:3710775b1864 844 uint32_t aux = 0;
mcm 2:3710775b1864 845
mcm 2:3710775b1864 846
mcm 2:3710775b1864 847 // Read Hours Register
mcm 2:3710775b1864 848 cmd = DS3231_HOURS;
mcm 2:3710775b1864 849 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 850 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 851
mcm 2:3710775b1864 852 myTime->Hours = _MYBCD_TO_DECIMAL( ( cmd & ~( HOURS_nAM_PM_MASK | HOURS_12_n24_MASK ) ) );
mcm 2:3710775b1864 853 myTime->Mode_nAM_PM = ( cmd & HOURS_nAM_PM_MASK );
mcm 2:3710775b1864 854 myTime->Mode_12_n24 = ( cmd & HOURS_12_n24_MASK );
mcm 2:3710775b1864 855
mcm 2:3710775b1864 856 // Read Minutes Register
mcm 2:3710775b1864 857 cmd = DS3231_MINUTES;
mcm 2:3710775b1864 858 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 859 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 860
mcm 2:3710775b1864 861 myTime->Minutes = _MYBCD_TO_DECIMAL( cmd );
mcm 2:3710775b1864 862
mcm 2:3710775b1864 863 // Read Seconds Register
mcm 2:3710775b1864 864 cmd = DS3231_SECONDS;
mcm 2:3710775b1864 865 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 866 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 867
mcm 2:3710775b1864 868 myTime->Seconds = _MYBCD_TO_DECIMAL( cmd );
mcm 2:3710775b1864 869
mcm 2:3710775b1864 870
mcm 2:3710775b1864 871
mcm 2:3710775b1864 872
mcm 2:3710775b1864 873 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 874 return DS3231_SUCCESS;
mcm 2:3710775b1864 875 else
mcm 2:3710775b1864 876 return DS3231_FAILURE;
mcm 2:3710775b1864 877 }
mcm 2:3710775b1864 878
mcm 2:3710775b1864 879 /**
mcm 2:3710775b1864 880 * @brief DS3231_SetTime ( DS3231_vector_date_time_t )
mcm 2:3710775b1864 881 *
mcm 2:3710775b1864 882 * @details It sets the time in BCD.
mcm 2:3710775b1864 883 *
mcm 2:3710775b1864 884 * @param[in] myTime: Time to store.
mcm 2:3710775b1864 885 *
mcm 2:3710775b1864 886 * @param[out] NaN.
mcm 2:3710775b1864 887 *
mcm 2:3710775b1864 888 *
mcm 2:3710775b1864 889 * @return Status of DS3231_SetTime.
mcm 2:3710775b1864 890 *
mcm 2:3710775b1864 891 *
mcm 2:3710775b1864 892 * @author Manuel Caballero
mcm 2:3710775b1864 893 * @date 20/December/2017
mcm 2:3710775b1864 894 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 895 * @pre NaN
mcm 2:3710775b1864 896 * @warning NaN.
mcm 2:3710775b1864 897 */
mcm 2:3710775b1864 898 DS3231::DS3231_status_t DS3231::DS3231_SetTime ( DS3231_vector_date_time_t myTime )
mcm 2:3710775b1864 899 {
mcm 2:3710775b1864 900 char cmd[] = { 0, 0 };
mcm 2:3710775b1864 901 uint32_t aux = 0;
mcm 2:3710775b1864 902
mcm 2:3710775b1864 903
mcm 2:3710775b1864 904 // Update Hours Register
mcm 2:3710775b1864 905 cmd[0] = DS3231_HOURS;
mcm 2:3710775b1864 906 cmd[1] = ( _MYDECIMAL_TO_BCD( myTime.Hours ) | myTime.Mode_12_n24 | myTime.Mode_nAM_PM );
mcm 2:3710775b1864 907 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 908
mcm 2:3710775b1864 909 // Update Minutes Register
mcm 2:3710775b1864 910 cmd[0] = DS3231_MINUTES;
mcm 2:3710775b1864 911 cmd[1] = _MYDECIMAL_TO_BCD( myTime.Minutes );
mcm 2:3710775b1864 912 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 913
mcm 2:3710775b1864 914 // Update Seconds Register
mcm 2:3710775b1864 915 cmd[0] = DS3231_SECONDS;
mcm 2:3710775b1864 916 cmd[1] = _MYDECIMAL_TO_BCD( myTime.Seconds );
mcm 2:3710775b1864 917 aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
mcm 2:3710775b1864 918
mcm 2:3710775b1864 919
mcm 2:3710775b1864 920
mcm 2:3710775b1864 921
mcm 2:3710775b1864 922 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 923 return DS3231_SUCCESS;
mcm 2:3710775b1864 924 else
mcm 2:3710775b1864 925 return DS3231_FAILURE;
mcm 2:3710775b1864 926 }
mcm 2:3710775b1864 927
mcm 2:3710775b1864 928
mcm 2:3710775b1864 929
mcm 2:3710775b1864 930 /**
mcm 2:3710775b1864 931 * @brief DS3231_GetControlStatusRegister ( DS3231_vector_data_t* )
mcm 2:3710775b1864 932 *
mcm 2:3710775b1864 933 * @details It gets the Control/Status register.
mcm 2:3710775b1864 934 *
mcm 2:3710775b1864 935 * @param[in] myControlStatusReg: Current value of the Register.
mcm 2:3710775b1864 936 *
mcm 2:3710775b1864 937 * @param[out] NaN.
mcm 2:3710775b1864 938 *
mcm 2:3710775b1864 939 *
mcm 2:3710775b1864 940 * @return Status of DS3231_GetControlStatusRegister.
mcm 2:3710775b1864 941 *
mcm 2:3710775b1864 942 *
mcm 2:3710775b1864 943 * @author Manuel Caballero
mcm 2:3710775b1864 944 * @date 20/December/2017
mcm 2:3710775b1864 945 * @version 20/December/2017 The ORIGIN
mcm 2:3710775b1864 946 * @pre NaN
mcm 2:3710775b1864 947 * @warning NaN.
mcm 2:3710775b1864 948 */
mcm 2:3710775b1864 949 DS3231::DS3231_status_t DS3231::DS3231_GetControlStatusRegister ( DS3231_vector_data_t* myControlStatusReg )
mcm 2:3710775b1864 950 {
mcm 2:3710775b1864 951 char cmd = DS3231_CONTROL_STATUS;
mcm 2:3710775b1864 952 uint32_t aux = 0;
mcm 2:3710775b1864 953
mcm 2:3710775b1864 954
mcm 2:3710775b1864 955 // Read Control/Status Register
mcm 2:3710775b1864 956 aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
mcm 2:3710775b1864 957 aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
mcm 2:3710775b1864 958
mcm 2:3710775b1864 959 myControlStatusReg->Control_Status_Register = cmd;
mcm 2:3710775b1864 960
mcm 2:3710775b1864 961
mcm 2:3710775b1864 962 if ( aux == I2C_SUCCESS )
mcm 2:3710775b1864 963 return DS3231_SUCCESS;
mcm 2:3710775b1864 964 else
mcm 2:3710775b1864 965 return DS3231_FAILURE;
mcm 2:3710775b1864 966 }