64 x 8, Serial, I2C Real-Time Clock
DS1307.cpp@2:190cad1b683d, 2018-07-31 (annotated)
- Committer:
- mcm
- Date:
- Tue Jul 31 15:17:07 2018 +0000
- Revision:
- 2:190cad1b683d
- Parent:
- 0:73dc094709f0
The driver was completed and tested, it works as expected ( NUCLEO-L152RE )
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 2:190cad1b683d | 1 | /** |
mcm | 2:190cad1b683d | 2 | * @brief DS1307.c |
mcm | 2:190cad1b683d | 3 | * @details 64 x 8, Serial, I2C Real-Time Clock. |
mcm | 2:190cad1b683d | 4 | * Functions file. |
mcm | 2:190cad1b683d | 5 | * |
mcm | 2:190cad1b683d | 6 | * |
mcm | 2:190cad1b683d | 7 | * @return N/A |
mcm | 2:190cad1b683d | 8 | * |
mcm | 2:190cad1b683d | 9 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 10 | * @date 31/July/2018 |
mcm | 2:190cad1b683d | 11 | * @version 31/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 12 | * @pre N/A. |
mcm | 2:190cad1b683d | 13 | * @warning N/A |
mcm | 2:190cad1b683d | 14 | * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). |
mcm | 2:190cad1b683d | 15 | */ |
mcm | 2:190cad1b683d | 16 | |
mcm | 2:190cad1b683d | 17 | #include "DS1307.h" |
mcm | 2:190cad1b683d | 18 | |
mcm | 2:190cad1b683d | 19 | |
mcm | 2:190cad1b683d | 20 | DS1307::DS1307 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ) |
mcm | 2:190cad1b683d | 21 | : _i2c ( sda, scl ) |
mcm | 2:190cad1b683d | 22 | , _DS1307_Addr ( addr ) |
mcm | 2:190cad1b683d | 23 | { |
mcm | 2:190cad1b683d | 24 | _i2c.frequency( freq ); |
mcm | 2:190cad1b683d | 25 | } |
mcm | 2:190cad1b683d | 26 | |
mcm | 2:190cad1b683d | 27 | |
mcm | 2:190cad1b683d | 28 | DS1307::~DS1307() |
mcm | 2:190cad1b683d | 29 | { |
mcm | 2:190cad1b683d | 30 | } |
mcm | 2:190cad1b683d | 31 | |
mcm | 2:190cad1b683d | 32 | |
mcm | 2:190cad1b683d | 33 | |
mcm | 2:190cad1b683d | 34 | /** |
mcm | 2:190cad1b683d | 35 | * @brief DS1307_SquareWaveOutput ( DS1307_control_sqwe_t , DS1307_control_rate_select_t ) |
mcm | 2:190cad1b683d | 36 | * |
mcm | 2:190cad1b683d | 37 | * @details It configures the square-wave output. |
mcm | 2:190cad1b683d | 38 | * |
mcm | 2:190cad1b683d | 39 | * @param[in] mySQWE: Square-wave output enabled/disabled. |
mcm | 2:190cad1b683d | 40 | * @param[in] myRateSelect: Rate select. |
mcm | 2:190cad1b683d | 41 | * |
mcm | 2:190cad1b683d | 42 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 43 | * |
mcm | 2:190cad1b683d | 44 | * |
mcm | 2:190cad1b683d | 45 | * @return Status of DS1307_SquareWaveOutput. |
mcm | 2:190cad1b683d | 46 | * |
mcm | 2:190cad1b683d | 47 | * |
mcm | 2:190cad1b683d | 48 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 49 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 50 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 51 | * @pre N/A. |
mcm | 2:190cad1b683d | 52 | * @warning N/A. |
mcm | 2:190cad1b683d | 53 | */ |
mcm | 2:190cad1b683d | 54 | DS1307::DS1307_status_t DS1307::DS1307_SquareWaveOutput ( DS1307_control_sqwe_t mySQWE, DS1307_control_rate_select_t myRateSelect ) |
mcm | 2:190cad1b683d | 55 | { |
mcm | 2:190cad1b683d | 56 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 57 | uint32_t aux; |
mcm | 2:190cad1b683d | 58 | |
mcm | 2:190cad1b683d | 59 | |
mcm | 2:190cad1b683d | 60 | /* Read CONTROL REGISTER to mask it */ |
mcm | 2:190cad1b683d | 61 | cmd[0] = DS1307_CONTROL; |
mcm | 2:190cad1b683d | 62 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 63 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 64 | |
mcm | 2:190cad1b683d | 65 | |
mcm | 2:190cad1b683d | 66 | /* Update the register */ |
mcm | 2:190cad1b683d | 67 | cmd[1] &= ~( CONTROL_SQWE_MASK | CONTROL_RS_MASK ); |
mcm | 2:190cad1b683d | 68 | cmd[1] |= ( mySQWE | myRateSelect ); |
mcm | 2:190cad1b683d | 69 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 70 | |
mcm | 2:190cad1b683d | 71 | |
mcm | 2:190cad1b683d | 72 | |
mcm | 2:190cad1b683d | 73 | |
mcm | 2:190cad1b683d | 74 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 75 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 76 | } else { |
mcm | 2:190cad1b683d | 77 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 78 | } |
mcm | 2:190cad1b683d | 79 | } |
mcm | 2:190cad1b683d | 80 | |
mcm | 2:190cad1b683d | 81 | |
mcm | 2:190cad1b683d | 82 | |
mcm | 2:190cad1b683d | 83 | /** |
mcm | 2:190cad1b683d | 84 | * @brief DS1307_ConfOutput ( DS1307_control_out_t ) |
mcm | 2:190cad1b683d | 85 | * |
mcm | 2:190cad1b683d | 86 | * @details It configures the output pin ( OUT ). |
mcm | 2:190cad1b683d | 87 | * |
mcm | 2:190cad1b683d | 88 | * @param[in] myOUT: OUT pin High/Low. |
mcm | 2:190cad1b683d | 89 | * |
mcm | 2:190cad1b683d | 90 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 91 | * |
mcm | 2:190cad1b683d | 92 | * |
mcm | 2:190cad1b683d | 93 | * @return Status of DS1307_ConfOutput. |
mcm | 2:190cad1b683d | 94 | * |
mcm | 2:190cad1b683d | 95 | * |
mcm | 2:190cad1b683d | 96 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 97 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 98 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 99 | * @pre N/A. |
mcm | 2:190cad1b683d | 100 | * @warning Square-wave output must be disabled. |
mcm | 2:190cad1b683d | 101 | */ |
mcm | 2:190cad1b683d | 102 | DS1307::DS1307_status_t DS1307::DS1307_ConfOutput ( DS1307_control_out_t myOUT ) |
mcm | 2:190cad1b683d | 103 | { |
mcm | 2:190cad1b683d | 104 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 105 | uint32_t aux; |
mcm | 2:190cad1b683d | 106 | |
mcm | 2:190cad1b683d | 107 | |
mcm | 2:190cad1b683d | 108 | /* Read CONTROL REGISTER to mask it */ |
mcm | 2:190cad1b683d | 109 | cmd[0] = DS1307_CONTROL; |
mcm | 2:190cad1b683d | 110 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 111 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 112 | |
mcm | 2:190cad1b683d | 113 | |
mcm | 2:190cad1b683d | 114 | /* Update the register */ |
mcm | 2:190cad1b683d | 115 | cmd[1] &= ~( CONTROL_OUT_MASK ); |
mcm | 2:190cad1b683d | 116 | cmd[1] |= myOUT; |
mcm | 2:190cad1b683d | 117 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 118 | |
mcm | 2:190cad1b683d | 119 | |
mcm | 2:190cad1b683d | 120 | |
mcm | 2:190cad1b683d | 121 | |
mcm | 2:190cad1b683d | 122 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 123 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 124 | } else { |
mcm | 2:190cad1b683d | 125 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 126 | } |
mcm | 2:190cad1b683d | 127 | } |
mcm | 2:190cad1b683d | 128 | |
mcm | 2:190cad1b683d | 129 | |
mcm | 2:190cad1b683d | 130 | |
mcm | 2:190cad1b683d | 131 | /** |
mcm | 2:190cad1b683d | 132 | * @brief DS1307_SetTime ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 133 | * |
mcm | 2:190cad1b683d | 134 | * @details It sets the time ( BCD mode ). |
mcm | 2:190cad1b683d | 135 | * |
mcm | 2:190cad1b683d | 136 | * @param[in] myTime: Time in BCD mode. |
mcm | 2:190cad1b683d | 137 | * |
mcm | 2:190cad1b683d | 138 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 139 | * |
mcm | 2:190cad1b683d | 140 | * |
mcm | 2:190cad1b683d | 141 | * @return Status of DS1307_SetTime. |
mcm | 2:190cad1b683d | 142 | * |
mcm | 2:190cad1b683d | 143 | * |
mcm | 2:190cad1b683d | 144 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 145 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 146 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 147 | * @pre i.e1: 20:35.59 24h --> 0x203559 24h Enabled. |
mcm | 2:190cad1b683d | 148 | * i.e2: 08:35.59 12h --> 0x083559 12h Enabled ( PM ). |
mcm | 2:190cad1b683d | 149 | * @warning N/A. |
mcm | 2:190cad1b683d | 150 | */ |
mcm | 2:190cad1b683d | 151 | DS1307::DS1307_status_t DS1307::DS1307_SetTime ( DS1307_vector_data_t myTime ) |
mcm | 2:190cad1b683d | 152 | { |
mcm | 2:190cad1b683d | 153 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 154 | uint32_t aux; |
mcm | 2:190cad1b683d | 155 | |
mcm | 2:190cad1b683d | 156 | |
mcm | 2:190cad1b683d | 157 | /* SECONDS */ |
mcm | 2:190cad1b683d | 158 | /* Read SECONDS REGISTER to mask it */ |
mcm | 2:190cad1b683d | 159 | cmd[0] = DS1307_SECONDS; |
mcm | 2:190cad1b683d | 160 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 161 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 162 | |
mcm | 2:190cad1b683d | 163 | |
mcm | 2:190cad1b683d | 164 | /* Update the register */ |
mcm | 2:190cad1b683d | 165 | cmd[1] &= ~( SECONDS_10SECONDS_MASK | SECONDS_SECONDS_MASK ); |
mcm | 2:190cad1b683d | 166 | cmd[1] |= ( myTime.BCDTime & ( SECONDS_10SECONDS_MASK | SECONDS_SECONDS_MASK ) ); |
mcm | 2:190cad1b683d | 167 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 168 | |
mcm | 2:190cad1b683d | 169 | |
mcm | 2:190cad1b683d | 170 | /* MINUTES */ |
mcm | 2:190cad1b683d | 171 | /* Read MINUTES REGISTER to mask it */ |
mcm | 2:190cad1b683d | 172 | cmd[0] = DS1307_MINUTES; |
mcm | 2:190cad1b683d | 173 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 174 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 175 | |
mcm | 2:190cad1b683d | 176 | |
mcm | 2:190cad1b683d | 177 | /* Update the register */ |
mcm | 2:190cad1b683d | 178 | cmd[1] &= ~( MINUTES_10MINUTES_MASK | MINUTES_MINUTES_MASK ); |
mcm | 2:190cad1b683d | 179 | cmd[1] |= ( ( myTime.BCDTime >> 8U ) & ( MINUTES_10MINUTES_MASK | MINUTES_MINUTES_MASK ) ); |
mcm | 2:190cad1b683d | 180 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 181 | |
mcm | 2:190cad1b683d | 182 | |
mcm | 2:190cad1b683d | 183 | /* HOURS */ |
mcm | 2:190cad1b683d | 184 | /* Read HOURS REGISTER to mask it */ |
mcm | 2:190cad1b683d | 185 | cmd[0] = DS1307_HOURS; |
mcm | 2:190cad1b683d | 186 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 187 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 188 | |
mcm | 2:190cad1b683d | 189 | |
mcm | 2:190cad1b683d | 190 | /* Mask the register */ |
mcm | 2:190cad1b683d | 191 | cmd[1] &= ~( HOURS_MODE_MASK | HOUR_10HOUR_MASK | HOUR_HOURS_MASK ); |
mcm | 2:190cad1b683d | 192 | |
mcm | 2:190cad1b683d | 193 | /* Check if it is 12h or 24h mode */ |
mcm | 2:190cad1b683d | 194 | if ( myTime.Time12H_24HMode == HOURS_MODE_24H ) { |
mcm | 2:190cad1b683d | 195 | cmd[1] |= ( ( ( myTime.BCDTime >> 16U ) & ( HOUR_10HOUR_MASK | HOUR_HOURS_MASK ) ) | myTime.Time12H_24HMode ); |
mcm | 2:190cad1b683d | 196 | } else { |
mcm | 2:190cad1b683d | 197 | cmd[1] |= ( ( ( myTime.BCDTime >> 16U ) & ( HOUR_10HOUR_MASK | HOUR_HOURS_MASK ) ) | ( myTime.Time12H_24HMode | myTime.TimeAM_PM_Mode ) ); |
mcm | 2:190cad1b683d | 198 | } |
mcm | 2:190cad1b683d | 199 | |
mcm | 2:190cad1b683d | 200 | /* Update the register */ |
mcm | 2:190cad1b683d | 201 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 202 | |
mcm | 2:190cad1b683d | 203 | |
mcm | 2:190cad1b683d | 204 | |
mcm | 2:190cad1b683d | 205 | |
mcm | 2:190cad1b683d | 206 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 207 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 208 | } else { |
mcm | 2:190cad1b683d | 209 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 210 | } |
mcm | 2:190cad1b683d | 211 | } |
mcm | 2:190cad1b683d | 212 | |
mcm | 2:190cad1b683d | 213 | |
mcm | 2:190cad1b683d | 214 | |
mcm | 2:190cad1b683d | 215 | /** |
mcm | 2:190cad1b683d | 216 | * @brief DS1307_GetTime ( DS1307_vector_data_t* ) |
mcm | 2:190cad1b683d | 217 | * |
mcm | 2:190cad1b683d | 218 | * @details It gets the time ( BCD mode ). |
mcm | 2:190cad1b683d | 219 | * |
mcm | 2:190cad1b683d | 220 | * @param[in] N/A. |
mcm | 2:190cad1b683d | 221 | * |
mcm | 2:190cad1b683d | 222 | * @param[out] myTime: Time in BCD mode. |
mcm | 2:190cad1b683d | 223 | * |
mcm | 2:190cad1b683d | 224 | * |
mcm | 2:190cad1b683d | 225 | * @return Status of DS1307_GetTime. |
mcm | 2:190cad1b683d | 226 | * |
mcm | 2:190cad1b683d | 227 | * |
mcm | 2:190cad1b683d | 228 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 229 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 230 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 231 | * @pre i.e1: 20:35.59 24h --> 0x203559 24h Enabled. |
mcm | 2:190cad1b683d | 232 | * i.e2: 08:35.59 12h --> 0x083559 12h Enabled ( PM ). |
mcm | 2:190cad1b683d | 233 | * @warning N/A. |
mcm | 2:190cad1b683d | 234 | */ |
mcm | 2:190cad1b683d | 235 | DS1307::DS1307_status_t DS1307::DS1307_GetTime ( DS1307_vector_data_t* myTime ) |
mcm | 2:190cad1b683d | 236 | { |
mcm | 2:190cad1b683d | 237 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 238 | uint32_t aux; |
mcm | 2:190cad1b683d | 239 | |
mcm | 2:190cad1b683d | 240 | |
mcm | 2:190cad1b683d | 241 | /* HOURS */ |
mcm | 2:190cad1b683d | 242 | /* Read HOURS REGISTER */ |
mcm | 2:190cad1b683d | 243 | cmd[0] = DS1307_HOURS; |
mcm | 2:190cad1b683d | 244 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 245 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 246 | |
mcm | 2:190cad1b683d | 247 | |
mcm | 2:190cad1b683d | 248 | /* Parse the data */ |
mcm | 2:190cad1b683d | 249 | myTime->BCDTime = ( cmd[1] & ( HOUR_10HOUR_MASK | HOUR_HOURS_MASK ) ); |
mcm | 2:190cad1b683d | 250 | |
mcm | 2:190cad1b683d | 251 | |
mcm | 2:190cad1b683d | 252 | /* Check if it is 12h or 24h mode */ |
mcm | 2:190cad1b683d | 253 | if ( ( cmd[1] & HOURS_MODE_MASK ) == HOURS_MODE_24H ) { |
mcm | 2:190cad1b683d | 254 | /* 24h mode */ |
mcm | 2:190cad1b683d | 255 | myTime->Time12H_24HMode = HOURS_MODE_24H; |
mcm | 2:190cad1b683d | 256 | |
mcm | 2:190cad1b683d | 257 | /* Update the PM/AM mode variable */ |
mcm | 2:190cad1b683d | 258 | if ( ( cmd[1] & ( HOUR_10HOUR_MASK | HOUR_HOURS_MASK ) ) >= 0x12 ) { |
mcm | 2:190cad1b683d | 259 | myTime->TimeAM_PM_Mode = HOURS_MODE_PM; |
mcm | 2:190cad1b683d | 260 | } else { |
mcm | 2:190cad1b683d | 261 | myTime->TimeAM_PM_Mode = HOURS_MODE_AM; |
mcm | 2:190cad1b683d | 262 | } |
mcm | 2:190cad1b683d | 263 | } else { |
mcm | 2:190cad1b683d | 264 | /* 12h mode */ |
mcm | 2:190cad1b683d | 265 | myTime->Time12H_24HMode = HOURS_MODE_12H; |
mcm | 2:190cad1b683d | 266 | myTime->TimeAM_PM_Mode = (DS1307_hours_am_pm_mode_t) ( cmd[1] & HOURS_MODE_AM_PM_MASK ); |
mcm | 2:190cad1b683d | 267 | myTime->BCDTime &= ~( HOURS_MODE_AM_PM_MASK ); |
mcm | 2:190cad1b683d | 268 | } |
mcm | 2:190cad1b683d | 269 | |
mcm | 2:190cad1b683d | 270 | myTime->BCDTime <<= 8U; |
mcm | 2:190cad1b683d | 271 | |
mcm | 2:190cad1b683d | 272 | |
mcm | 2:190cad1b683d | 273 | |
mcm | 2:190cad1b683d | 274 | /* MINUTES */ |
mcm | 2:190cad1b683d | 275 | /* Read MINUTES REGISTER to mask it */ |
mcm | 2:190cad1b683d | 276 | cmd[0] = DS1307_MINUTES; |
mcm | 2:190cad1b683d | 277 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 278 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 279 | |
mcm | 2:190cad1b683d | 280 | |
mcm | 2:190cad1b683d | 281 | /* Parse the data */ |
mcm | 2:190cad1b683d | 282 | cmd[1] &= ( MINUTES_10MINUTES_MASK | MINUTES_MINUTES_MASK ); |
mcm | 2:190cad1b683d | 283 | myTime->BCDTime |= cmd[1]; |
mcm | 2:190cad1b683d | 284 | myTime->BCDTime <<= 8U; |
mcm | 2:190cad1b683d | 285 | |
mcm | 2:190cad1b683d | 286 | |
mcm | 2:190cad1b683d | 287 | |
mcm | 2:190cad1b683d | 288 | /* SECONDS */ |
mcm | 2:190cad1b683d | 289 | /* Read SECONDS REGISTER to mask it */ |
mcm | 2:190cad1b683d | 290 | cmd[0] = DS1307_SECONDS; |
mcm | 2:190cad1b683d | 291 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 292 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 293 | |
mcm | 2:190cad1b683d | 294 | |
mcm | 2:190cad1b683d | 295 | /* Parse the data */ |
mcm | 2:190cad1b683d | 296 | cmd[1] &= ( SECONDS_10SECONDS_MASK | SECONDS_SECONDS_MASK ); |
mcm | 2:190cad1b683d | 297 | myTime->BCDTime |= cmd[1]; |
mcm | 2:190cad1b683d | 298 | |
mcm | 2:190cad1b683d | 299 | |
mcm | 2:190cad1b683d | 300 | |
mcm | 2:190cad1b683d | 301 | |
mcm | 2:190cad1b683d | 302 | |
mcm | 2:190cad1b683d | 303 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 304 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 305 | } else { |
mcm | 2:190cad1b683d | 306 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 307 | } |
mcm | 2:190cad1b683d | 308 | } |
mcm | 2:190cad1b683d | 309 | |
mcm | 2:190cad1b683d | 310 | |
mcm | 2:190cad1b683d | 311 | |
mcm | 2:190cad1b683d | 312 | /** |
mcm | 2:190cad1b683d | 313 | * @brief DS1307_SetDayOfTheWeek ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 314 | * |
mcm | 2:190cad1b683d | 315 | * @details It sets the day of the week. |
mcm | 2:190cad1b683d | 316 | * |
mcm | 2:190cad1b683d | 317 | * @param[in] myDayOfTheWeek: Day of the week. |
mcm | 2:190cad1b683d | 318 | * |
mcm | 2:190cad1b683d | 319 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 320 | * |
mcm | 2:190cad1b683d | 321 | * |
mcm | 2:190cad1b683d | 322 | * @return Status of DS1307_SetDayOfTheWeek. |
mcm | 2:190cad1b683d | 323 | * |
mcm | 2:190cad1b683d | 324 | * |
mcm | 2:190cad1b683d | 325 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 326 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 327 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 328 | * @pre N/A. |
mcm | 2:190cad1b683d | 329 | * @warning N/A. |
mcm | 2:190cad1b683d | 330 | */ |
mcm | 2:190cad1b683d | 331 | DS1307::DS1307_status_t DS1307::DS1307_SetDayOfTheWeek ( DS1307_vector_data_t myDayOfTheWeek ) |
mcm | 2:190cad1b683d | 332 | { |
mcm | 2:190cad1b683d | 333 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 334 | uint32_t aux; |
mcm | 2:190cad1b683d | 335 | |
mcm | 2:190cad1b683d | 336 | |
mcm | 2:190cad1b683d | 337 | /* Read DAY REGISTER to mask it */ |
mcm | 2:190cad1b683d | 338 | cmd[0] = DS1307_DAY; |
mcm | 2:190cad1b683d | 339 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 340 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 341 | |
mcm | 2:190cad1b683d | 342 | |
mcm | 2:190cad1b683d | 343 | /* Update the register */ |
mcm | 2:190cad1b683d | 344 | cmd[1] &= ~( DAY_MASK ); |
mcm | 2:190cad1b683d | 345 | cmd[1] |= myDayOfTheWeek.DayOfTheWeek; |
mcm | 2:190cad1b683d | 346 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 347 | |
mcm | 2:190cad1b683d | 348 | |
mcm | 2:190cad1b683d | 349 | |
mcm | 2:190cad1b683d | 350 | |
mcm | 2:190cad1b683d | 351 | |
mcm | 2:190cad1b683d | 352 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 353 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 354 | } else { |
mcm | 2:190cad1b683d | 355 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 356 | } |
mcm | 2:190cad1b683d | 357 | } |
mcm | 2:190cad1b683d | 358 | |
mcm | 2:190cad1b683d | 359 | |
mcm | 2:190cad1b683d | 360 | |
mcm | 2:190cad1b683d | 361 | /** |
mcm | 2:190cad1b683d | 362 | * @brief DS1307_GetDayOfTheWeek ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 363 | * |
mcm | 2:190cad1b683d | 364 | * @details It gets the day of the week. |
mcm | 2:190cad1b683d | 365 | * |
mcm | 2:190cad1b683d | 366 | * @param[in] N/A. |
mcm | 2:190cad1b683d | 367 | * |
mcm | 2:190cad1b683d | 368 | * @param[out] myDayOfTheWeek: Day of the week. |
mcm | 2:190cad1b683d | 369 | * |
mcm | 2:190cad1b683d | 370 | * |
mcm | 2:190cad1b683d | 371 | * @return Status of DS1307_GetDayOfTheWeek. |
mcm | 2:190cad1b683d | 372 | * |
mcm | 2:190cad1b683d | 373 | * |
mcm | 2:190cad1b683d | 374 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 375 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 376 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 377 | * @pre N/A. |
mcm | 2:190cad1b683d | 378 | * @warning N/A. |
mcm | 2:190cad1b683d | 379 | */ |
mcm | 2:190cad1b683d | 380 | DS1307::DS1307_status_t DS1307::DS1307_GetDayOfTheWeek ( DS1307_vector_data_t* myDayOfTheWeek ) |
mcm | 2:190cad1b683d | 381 | { |
mcm | 2:190cad1b683d | 382 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 383 | uint32_t aux; |
mcm | 2:190cad1b683d | 384 | |
mcm | 2:190cad1b683d | 385 | |
mcm | 2:190cad1b683d | 386 | /* Read DAY REGISTER to mask it */ |
mcm | 2:190cad1b683d | 387 | cmd[0] = DS1307_DAY; |
mcm | 2:190cad1b683d | 388 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 389 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 390 | |
mcm | 2:190cad1b683d | 391 | |
mcm | 2:190cad1b683d | 392 | /* Parse the data */ |
mcm | 2:190cad1b683d | 393 | myDayOfTheWeek->DayOfTheWeek = (DS1307_day_t)( cmd[1] & DAY_MASK ); |
mcm | 2:190cad1b683d | 394 | |
mcm | 2:190cad1b683d | 395 | |
mcm | 2:190cad1b683d | 396 | |
mcm | 2:190cad1b683d | 397 | |
mcm | 2:190cad1b683d | 398 | |
mcm | 2:190cad1b683d | 399 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 400 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 401 | } else { |
mcm | 2:190cad1b683d | 402 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 403 | } |
mcm | 2:190cad1b683d | 404 | } |
mcm | 2:190cad1b683d | 405 | |
mcm | 2:190cad1b683d | 406 | |
mcm | 2:190cad1b683d | 407 | |
mcm | 2:190cad1b683d | 408 | /** |
mcm | 2:190cad1b683d | 409 | * @brief DS1307_SetDate ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 410 | * |
mcm | 2:190cad1b683d | 411 | * @details It sets the date ( BCD mode ). |
mcm | 2:190cad1b683d | 412 | * |
mcm | 2:190cad1b683d | 413 | * @param[in] myDate: Date. |
mcm | 2:190cad1b683d | 414 | * |
mcm | 2:190cad1b683d | 415 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 416 | * |
mcm | 2:190cad1b683d | 417 | * |
mcm | 2:190cad1b683d | 418 | * @return Status of DS1307_SetDate. |
mcm | 2:190cad1b683d | 419 | * |
mcm | 2:190cad1b683d | 420 | * |
mcm | 2:190cad1b683d | 421 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 422 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 423 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 424 | * @pre i.e1: 01: 0x01. |
mcm | 2:190cad1b683d | 425 | * i.e2: 12: 0x12. |
mcm | 2:190cad1b683d | 426 | * @warning N/A. |
mcm | 2:190cad1b683d | 427 | */ |
mcm | 2:190cad1b683d | 428 | DS1307::DS1307_status_t DS1307::DS1307_SetDate ( DS1307_vector_data_t myDate ) |
mcm | 2:190cad1b683d | 429 | { |
mcm | 2:190cad1b683d | 430 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 431 | uint32_t aux; |
mcm | 2:190cad1b683d | 432 | |
mcm | 2:190cad1b683d | 433 | |
mcm | 2:190cad1b683d | 434 | /* Check date limits */ |
mcm | 2:190cad1b683d | 435 | if ( ( myDate.BCDDate >= 0x01 ) && ( myDate.BCDDate <= 0x31 ) ) { |
mcm | 2:190cad1b683d | 436 | /* Read DATE REGISTER to mask it */ |
mcm | 2:190cad1b683d | 437 | cmd[0] = DS1307_DATE; |
mcm | 2:190cad1b683d | 438 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 439 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 440 | |
mcm | 2:190cad1b683d | 441 | |
mcm | 2:190cad1b683d | 442 | /* Update the register */ |
mcm | 2:190cad1b683d | 443 | cmd[1] &= ~( DATE_10DATE_MASK | DATE_DATE_MASK ); |
mcm | 2:190cad1b683d | 444 | cmd[1] |= myDate.BCDDate; |
mcm | 2:190cad1b683d | 445 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 446 | } else { |
mcm | 2:190cad1b683d | 447 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 448 | } |
mcm | 2:190cad1b683d | 449 | |
mcm | 2:190cad1b683d | 450 | |
mcm | 2:190cad1b683d | 451 | |
mcm | 2:190cad1b683d | 452 | |
mcm | 2:190cad1b683d | 453 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 454 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 455 | } else { |
mcm | 2:190cad1b683d | 456 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 457 | } |
mcm | 2:190cad1b683d | 458 | } |
mcm | 2:190cad1b683d | 459 | |
mcm | 2:190cad1b683d | 460 | |
mcm | 2:190cad1b683d | 461 | |
mcm | 2:190cad1b683d | 462 | /** |
mcm | 2:190cad1b683d | 463 | * @brief DS1307_GetDate ( DS1307_vector_data_t* ) |
mcm | 2:190cad1b683d | 464 | * |
mcm | 2:190cad1b683d | 465 | * @details It gets the date ( BCD mode ). |
mcm | 2:190cad1b683d | 466 | * |
mcm | 2:190cad1b683d | 467 | * @param[in] N/A. |
mcm | 2:190cad1b683d | 468 | * |
mcm | 2:190cad1b683d | 469 | * @param[out] myDate: Date. |
mcm | 2:190cad1b683d | 470 | * |
mcm | 2:190cad1b683d | 471 | * |
mcm | 2:190cad1b683d | 472 | * @return Status of DS1307_GetDate. |
mcm | 2:190cad1b683d | 473 | * |
mcm | 2:190cad1b683d | 474 | * |
mcm | 2:190cad1b683d | 475 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 476 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 477 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 478 | * @pre i.e1: 01: 0x01. |
mcm | 2:190cad1b683d | 479 | * i.e2: 12: 0x12. |
mcm | 2:190cad1b683d | 480 | * @warning N/A. |
mcm | 2:190cad1b683d | 481 | */ |
mcm | 2:190cad1b683d | 482 | DS1307::DS1307_status_t DS1307::DS1307_GetDate ( DS1307_vector_data_t* myDate ) |
mcm | 2:190cad1b683d | 483 | { |
mcm | 2:190cad1b683d | 484 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 485 | uint32_t aux; |
mcm | 2:190cad1b683d | 486 | |
mcm | 2:190cad1b683d | 487 | |
mcm | 2:190cad1b683d | 488 | /* Read DATE REGISTER to mask it */ |
mcm | 2:190cad1b683d | 489 | cmd[0] = DS1307_DATE; |
mcm | 2:190cad1b683d | 490 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 491 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 492 | |
mcm | 2:190cad1b683d | 493 | |
mcm | 2:190cad1b683d | 494 | /* Parse the data */ |
mcm | 2:190cad1b683d | 495 | myDate->BCDDate = ( cmd[1] & ( DATE_10DATE_MASK | DATE_DATE_MASK ) ); |
mcm | 2:190cad1b683d | 496 | |
mcm | 2:190cad1b683d | 497 | |
mcm | 2:190cad1b683d | 498 | |
mcm | 2:190cad1b683d | 499 | |
mcm | 2:190cad1b683d | 500 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 501 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 502 | } else { |
mcm | 2:190cad1b683d | 503 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 504 | } |
mcm | 2:190cad1b683d | 505 | } |
mcm | 2:190cad1b683d | 506 | |
mcm | 2:190cad1b683d | 507 | |
mcm | 2:190cad1b683d | 508 | |
mcm | 2:190cad1b683d | 509 | /** |
mcm | 2:190cad1b683d | 510 | * @brief DS1307_SetMonth ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 511 | * |
mcm | 2:190cad1b683d | 512 | * @details It sets the month ( BCD mode ). |
mcm | 2:190cad1b683d | 513 | * |
mcm | 2:190cad1b683d | 514 | * @param[in] myMonth: Month. |
mcm | 2:190cad1b683d | 515 | * |
mcm | 2:190cad1b683d | 516 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 517 | * |
mcm | 2:190cad1b683d | 518 | * |
mcm | 2:190cad1b683d | 519 | * @return Status of DS1307_SetMonth. |
mcm | 2:190cad1b683d | 520 | * |
mcm | 2:190cad1b683d | 521 | * |
mcm | 2:190cad1b683d | 522 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 523 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 524 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 525 | * @pre i.e1: January: 0x01. |
mcm | 2:190cad1b683d | 526 | * i.e2: December: 0x12. |
mcm | 2:190cad1b683d | 527 | * @warning N/A. |
mcm | 2:190cad1b683d | 528 | */ |
mcm | 2:190cad1b683d | 529 | DS1307::DS1307_status_t DS1307::DS1307_SetMonth ( DS1307_vector_data_t myMonth ) |
mcm | 2:190cad1b683d | 530 | { |
mcm | 2:190cad1b683d | 531 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 532 | uint32_t aux; |
mcm | 2:190cad1b683d | 533 | |
mcm | 2:190cad1b683d | 534 | |
mcm | 2:190cad1b683d | 535 | /* Read MONTH REGISTER to mask it */ |
mcm | 2:190cad1b683d | 536 | cmd[0] = DS1307_MONTH; |
mcm | 2:190cad1b683d | 537 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 538 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 539 | |
mcm | 2:190cad1b683d | 540 | |
mcm | 2:190cad1b683d | 541 | /* Update the register */ |
mcm | 2:190cad1b683d | 542 | cmd[1] &= ~( MONTH_10MONTH_MASK | MONTH_MONTH_MASK ); |
mcm | 2:190cad1b683d | 543 | cmd[1] |= myMonth.BCDMonth; |
mcm | 2:190cad1b683d | 544 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 545 | |
mcm | 2:190cad1b683d | 546 | |
mcm | 2:190cad1b683d | 547 | |
mcm | 2:190cad1b683d | 548 | |
mcm | 2:190cad1b683d | 549 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 550 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 551 | } else { |
mcm | 2:190cad1b683d | 552 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 553 | } |
mcm | 2:190cad1b683d | 554 | } |
mcm | 2:190cad1b683d | 555 | |
mcm | 2:190cad1b683d | 556 | |
mcm | 2:190cad1b683d | 557 | |
mcm | 2:190cad1b683d | 558 | /** |
mcm | 2:190cad1b683d | 559 | * @brief DS1307_GetMonth ( DS1307_vector_data_t* ) |
mcm | 2:190cad1b683d | 560 | * |
mcm | 2:190cad1b683d | 561 | * @details It gets the month ( BCD mode ). |
mcm | 2:190cad1b683d | 562 | * |
mcm | 2:190cad1b683d | 563 | * @param[in] N/A. |
mcm | 2:190cad1b683d | 564 | * |
mcm | 2:190cad1b683d | 565 | * @param[out] myMonth: Month. |
mcm | 2:190cad1b683d | 566 | * |
mcm | 2:190cad1b683d | 567 | * |
mcm | 2:190cad1b683d | 568 | * @return Status of DS1307_GetMonth. |
mcm | 2:190cad1b683d | 569 | * |
mcm | 2:190cad1b683d | 570 | * |
mcm | 2:190cad1b683d | 571 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 572 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 573 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 574 | * @pre i.e1: January: 0x01. |
mcm | 2:190cad1b683d | 575 | * i.e2: December: 0x12. |
mcm | 2:190cad1b683d | 576 | * @warning N/A. |
mcm | 2:190cad1b683d | 577 | */ |
mcm | 2:190cad1b683d | 578 | DS1307::DS1307_status_t DS1307::DS1307_GetMonth ( DS1307_vector_data_t* myMonth ) |
mcm | 2:190cad1b683d | 579 | { |
mcm | 2:190cad1b683d | 580 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 581 | uint32_t aux; |
mcm | 2:190cad1b683d | 582 | |
mcm | 2:190cad1b683d | 583 | |
mcm | 2:190cad1b683d | 584 | /* Read MONTH REGISTER to mask it */ |
mcm | 2:190cad1b683d | 585 | cmd[0] = DS1307_MONTH; |
mcm | 2:190cad1b683d | 586 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 587 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 588 | |
mcm | 2:190cad1b683d | 589 | |
mcm | 2:190cad1b683d | 590 | /* Parse the data */ |
mcm | 2:190cad1b683d | 591 | myMonth->BCDMonth = (DS1307_month_t)( cmd[1] & ( MONTH_10MONTH_MASK | MONTH_MONTH_MASK ) ); |
mcm | 2:190cad1b683d | 592 | |
mcm | 2:190cad1b683d | 593 | |
mcm | 2:190cad1b683d | 594 | |
mcm | 2:190cad1b683d | 595 | |
mcm | 2:190cad1b683d | 596 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 597 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 598 | } else { |
mcm | 2:190cad1b683d | 599 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 600 | } |
mcm | 2:190cad1b683d | 601 | } |
mcm | 2:190cad1b683d | 602 | |
mcm | 2:190cad1b683d | 603 | |
mcm | 2:190cad1b683d | 604 | |
mcm | 2:190cad1b683d | 605 | /** |
mcm | 2:190cad1b683d | 606 | * @brief DS1307_SetYear ( DS1307_vector_data_t ) |
mcm | 2:190cad1b683d | 607 | * |
mcm | 2:190cad1b683d | 608 | * @details It sets the year ( BCD mode ). |
mcm | 2:190cad1b683d | 609 | * |
mcm | 2:190cad1b683d | 610 | * @param[in] myYear: Year. |
mcm | 2:190cad1b683d | 611 | * |
mcm | 2:190cad1b683d | 612 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 613 | * |
mcm | 2:190cad1b683d | 614 | * |
mcm | 2:190cad1b683d | 615 | * @return Status of DS1307_SetYear. |
mcm | 2:190cad1b683d | 616 | * |
mcm | 2:190cad1b683d | 617 | * |
mcm | 2:190cad1b683d | 618 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 619 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 620 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 621 | * @pre i.e1: 2000: 0x00. |
mcm | 2:190cad1b683d | 622 | * i.e2: 2018: 0x18. |
mcm | 2:190cad1b683d | 623 | * @warning N/A. |
mcm | 2:190cad1b683d | 624 | */ |
mcm | 2:190cad1b683d | 625 | DS1307::DS1307_status_t DS1307::DS1307_SetYear ( DS1307_vector_data_t myYear ) |
mcm | 2:190cad1b683d | 626 | { |
mcm | 2:190cad1b683d | 627 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 628 | uint32_t aux; |
mcm | 2:190cad1b683d | 629 | |
mcm | 2:190cad1b683d | 630 | |
mcm | 2:190cad1b683d | 631 | /* Update the register */ |
mcm | 2:190cad1b683d | 632 | cmd[0] = DS1307_YEAR; |
mcm | 2:190cad1b683d | 633 | cmd[1] = myYear.BCDYear; |
mcm | 2:190cad1b683d | 634 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 635 | |
mcm | 2:190cad1b683d | 636 | |
mcm | 2:190cad1b683d | 637 | |
mcm | 2:190cad1b683d | 638 | |
mcm | 2:190cad1b683d | 639 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 640 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 641 | } else { |
mcm | 2:190cad1b683d | 642 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 643 | } |
mcm | 2:190cad1b683d | 644 | } |
mcm | 2:190cad1b683d | 645 | |
mcm | 2:190cad1b683d | 646 | |
mcm | 2:190cad1b683d | 647 | |
mcm | 2:190cad1b683d | 648 | /** |
mcm | 2:190cad1b683d | 649 | * @brief DS1307_GetYear ( DS1307_vector_data_t* ) |
mcm | 2:190cad1b683d | 650 | * |
mcm | 2:190cad1b683d | 651 | * @details It gets the year ( BCD mode ). |
mcm | 2:190cad1b683d | 652 | * |
mcm | 2:190cad1b683d | 653 | * @param[in] N/A |
mcm | 2:190cad1b683d | 654 | * |
mcm | 2:190cad1b683d | 655 | * @param[out] myYear: Year. |
mcm | 2:190cad1b683d | 656 | * |
mcm | 2:190cad1b683d | 657 | * |
mcm | 2:190cad1b683d | 658 | * @return Status of DS1307_GetYear. |
mcm | 2:190cad1b683d | 659 | * |
mcm | 2:190cad1b683d | 660 | * |
mcm | 2:190cad1b683d | 661 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 662 | * @date 30/July/2018 |
mcm | 2:190cad1b683d | 663 | * @version 30/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 664 | * @pre i.e1: 2000: 0x00. |
mcm | 2:190cad1b683d | 665 | * i.e2: 2018: 0x18. |
mcm | 2:190cad1b683d | 666 | * @warning N/A. |
mcm | 2:190cad1b683d | 667 | */ |
mcm | 2:190cad1b683d | 668 | DS1307::DS1307_status_t DS1307::DS1307_GetYear ( DS1307_vector_data_t* myYear ) |
mcm | 2:190cad1b683d | 669 | { |
mcm | 2:190cad1b683d | 670 | char cmd = 0; |
mcm | 2:190cad1b683d | 671 | uint32_t aux; |
mcm | 2:190cad1b683d | 672 | |
mcm | 2:190cad1b683d | 673 | |
mcm | 2:190cad1b683d | 674 | /* Read YEAR REGISTER to mask it */ |
mcm | 2:190cad1b683d | 675 | cmd = DS1307_YEAR; |
mcm | 2:190cad1b683d | 676 | aux = _i2c.write ( _DS1307_Addr, &cmd, 1U, true ); |
mcm | 2:190cad1b683d | 677 | aux = _i2c.read ( _DS1307_Addr, (char*)&myYear->BCDYear, 1U ); |
mcm | 2:190cad1b683d | 678 | |
mcm | 2:190cad1b683d | 679 | |
mcm | 2:190cad1b683d | 680 | |
mcm | 2:190cad1b683d | 681 | |
mcm | 2:190cad1b683d | 682 | |
mcm | 2:190cad1b683d | 683 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 684 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 685 | } else { |
mcm | 2:190cad1b683d | 686 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 687 | } |
mcm | 2:190cad1b683d | 688 | } |
mcm | 2:190cad1b683d | 689 | |
mcm | 2:190cad1b683d | 690 | |
mcm | 2:190cad1b683d | 691 | |
mcm | 2:190cad1b683d | 692 | /** |
mcm | 2:190cad1b683d | 693 | * @brief DS1307_OscillatorMode ( DS1307_seconds_ch_t ) |
mcm | 2:190cad1b683d | 694 | * |
mcm | 2:190cad1b683d | 695 | * @details It enables/disabled the oscillator. |
mcm | 2:190cad1b683d | 696 | * |
mcm | 2:190cad1b683d | 697 | * @param[in] myOscillator: Oscillator enabled/disabled. |
mcm | 2:190cad1b683d | 698 | * |
mcm | 2:190cad1b683d | 699 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 700 | * |
mcm | 2:190cad1b683d | 701 | * |
mcm | 2:190cad1b683d | 702 | * @return Status of DS1307_OscillatorMode. |
mcm | 2:190cad1b683d | 703 | * |
mcm | 2:190cad1b683d | 704 | * |
mcm | 2:190cad1b683d | 705 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 706 | * @date 31/July/2018 |
mcm | 2:190cad1b683d | 707 | * @version 31/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 708 | * @pre The clock can be halted whenever the timekeeping functions are not required, |
mcm | 2:190cad1b683d | 709 | * which minimizes current ( I_BATDR ). |
mcm | 2:190cad1b683d | 710 | * @warning N/A. |
mcm | 2:190cad1b683d | 711 | */ |
mcm | 2:190cad1b683d | 712 | DS1307::DS1307_status_t DS1307::DS1307_OscillatorMode ( DS1307_seconds_ch_t myOscillator ) |
mcm | 2:190cad1b683d | 713 | { |
mcm | 2:190cad1b683d | 714 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 715 | uint32_t aux; |
mcm | 2:190cad1b683d | 716 | |
mcm | 2:190cad1b683d | 717 | |
mcm | 2:190cad1b683d | 718 | /* Read SECONDS REGISTER to mask it */ |
mcm | 2:190cad1b683d | 719 | cmd[0] = DS1307_SECONDS; |
mcm | 2:190cad1b683d | 720 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], 1U, true ); |
mcm | 2:190cad1b683d | 721 | aux = _i2c.read ( _DS1307_Addr, &cmd[1], 1U ); |
mcm | 2:190cad1b683d | 722 | |
mcm | 2:190cad1b683d | 723 | |
mcm | 2:190cad1b683d | 724 | /* Update the register */ |
mcm | 2:190cad1b683d | 725 | cmd[1] &= ~( SECONDS_CH_MASK ); |
mcm | 2:190cad1b683d | 726 | cmd[1] |= myOscillator; |
mcm | 2:190cad1b683d | 727 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 728 | |
mcm | 2:190cad1b683d | 729 | |
mcm | 2:190cad1b683d | 730 | |
mcm | 2:190cad1b683d | 731 | |
mcm | 2:190cad1b683d | 732 | |
mcm | 2:190cad1b683d | 733 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 734 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 735 | } else { |
mcm | 2:190cad1b683d | 736 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 737 | } |
mcm | 2:190cad1b683d | 738 | } |
mcm | 2:190cad1b683d | 739 | |
mcm | 2:190cad1b683d | 740 | |
mcm | 2:190cad1b683d | 741 | |
mcm | 2:190cad1b683d | 742 | /** |
mcm | 2:190cad1b683d | 743 | * @brief DS1307_WriteByteRAM ( uint8_t , uint8_t ) |
mcm | 2:190cad1b683d | 744 | * |
mcm | 2:190cad1b683d | 745 | * @details It writes a byte into the RAM memory. |
mcm | 2:190cad1b683d | 746 | * |
mcm | 2:190cad1b683d | 747 | * @param[in] myByte: Byte to be written. |
mcm | 2:190cad1b683d | 748 | * @param[in] myAddress: Address to write the byte. |
mcm | 2:190cad1b683d | 749 | * |
mcm | 2:190cad1b683d | 750 | * @param[out] N/A. |
mcm | 2:190cad1b683d | 751 | * |
mcm | 2:190cad1b683d | 752 | * |
mcm | 2:190cad1b683d | 753 | * @return Status of DS1307_WriteByteRAM. |
mcm | 2:190cad1b683d | 754 | * |
mcm | 2:190cad1b683d | 755 | * |
mcm | 2:190cad1b683d | 756 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 757 | * @date 31/July/2018 |
mcm | 2:190cad1b683d | 758 | * @version 31/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 759 | * @pre N/A. |
mcm | 2:190cad1b683d | 760 | * @warning N/A. |
mcm | 2:190cad1b683d | 761 | */ |
mcm | 2:190cad1b683d | 762 | DS1307::DS1307_status_t DS1307::DS1307_WriteByteRAM ( uint8_t myByte, uint8_t myAddress ) |
mcm | 2:190cad1b683d | 763 | { |
mcm | 2:190cad1b683d | 764 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 765 | uint32_t aux; |
mcm | 2:190cad1b683d | 766 | |
mcm | 2:190cad1b683d | 767 | |
mcm | 2:190cad1b683d | 768 | /* Check RAM memory limits */ |
mcm | 2:190cad1b683d | 769 | if ( ( myAddress >= 0x08 ) && ( myAddress <= 0x3F ) ) { |
mcm | 2:190cad1b683d | 770 | /* Write data into the RAM memory */ |
mcm | 2:190cad1b683d | 771 | cmd[0] = myAddress; |
mcm | 2:190cad1b683d | 772 | cmd[1] = myByte; |
mcm | 2:190cad1b683d | 773 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 774 | } else { |
mcm | 2:190cad1b683d | 775 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 776 | } |
mcm | 2:190cad1b683d | 777 | |
mcm | 2:190cad1b683d | 778 | |
mcm | 2:190cad1b683d | 779 | |
mcm | 2:190cad1b683d | 780 | |
mcm | 2:190cad1b683d | 781 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 782 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 783 | } else { |
mcm | 2:190cad1b683d | 784 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 785 | } |
mcm | 2:190cad1b683d | 786 | } |
mcm | 2:190cad1b683d | 787 | |
mcm | 2:190cad1b683d | 788 | |
mcm | 2:190cad1b683d | 789 | |
mcm | 2:190cad1b683d | 790 | /** |
mcm | 2:190cad1b683d | 791 | * @brief DS1307_ReadByteRAM ( uint8_t* , uint8_t ) |
mcm | 2:190cad1b683d | 792 | * |
mcm | 2:190cad1b683d | 793 | * @details It reads a byte from the RAM memory. |
mcm | 2:190cad1b683d | 794 | * |
mcm | 2:190cad1b683d | 795 | * @param[in] myAddress: Address to write the byte. |
mcm | 2:190cad1b683d | 796 | * |
mcm | 2:190cad1b683d | 797 | * @param[out] myByte: Byte to be read. |
mcm | 2:190cad1b683d | 798 | * |
mcm | 2:190cad1b683d | 799 | * |
mcm | 2:190cad1b683d | 800 | * @return Status of DS1307_ReadByteRAM. |
mcm | 2:190cad1b683d | 801 | * |
mcm | 2:190cad1b683d | 802 | * |
mcm | 2:190cad1b683d | 803 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 804 | * @date 31/July/2018 |
mcm | 2:190cad1b683d | 805 | * @version 31/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 806 | * @pre N/A. |
mcm | 2:190cad1b683d | 807 | * @warning N/A. |
mcm | 2:190cad1b683d | 808 | */ |
mcm | 2:190cad1b683d | 809 | DS1307::DS1307_status_t DS1307::DS1307_ReadByteRAM ( uint8_t* myByte, uint8_t myAddress ) |
mcm | 2:190cad1b683d | 810 | { |
mcm | 2:190cad1b683d | 811 | char cmd = 0; |
mcm | 2:190cad1b683d | 812 | uint32_t aux; |
mcm | 2:190cad1b683d | 813 | |
mcm | 2:190cad1b683d | 814 | |
mcm | 2:190cad1b683d | 815 | /* Check RAM memory limits */ |
mcm | 2:190cad1b683d | 816 | if ( ( myAddress >= 0x08 ) && ( myAddress <= 0x3F ) ) { |
mcm | 2:190cad1b683d | 817 | /* Read data from the RAM memory */ |
mcm | 2:190cad1b683d | 818 | cmd = myAddress; |
mcm | 2:190cad1b683d | 819 | aux = _i2c.write ( _DS1307_Addr, &cmd, 1U, true ); |
mcm | 2:190cad1b683d | 820 | aux = _i2c.read ( _DS1307_Addr, (char*)myByte, 1U ); |
mcm | 2:190cad1b683d | 821 | } else { |
mcm | 2:190cad1b683d | 822 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 823 | } |
mcm | 2:190cad1b683d | 824 | |
mcm | 2:190cad1b683d | 825 | |
mcm | 2:190cad1b683d | 826 | |
mcm | 2:190cad1b683d | 827 | if ( aux == I2C_SUCCESS ) { |
mcm | 2:190cad1b683d | 828 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 829 | } else { |
mcm | 2:190cad1b683d | 830 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 831 | } |
mcm | 2:190cad1b683d | 832 | } |
mcm | 2:190cad1b683d | 833 | |
mcm | 2:190cad1b683d | 834 | |
mcm | 2:190cad1b683d | 835 | |
mcm | 2:190cad1b683d | 836 | /** |
mcm | 2:190cad1b683d | 837 | * @brief DS1307_EraseByteRAM ( uint8_t ) |
mcm | 2:190cad1b683d | 838 | * |
mcm | 2:190cad1b683d | 839 | * @details It ereases a byte into the RAM memory. |
mcm | 2:190cad1b683d | 840 | * |
mcm | 2:190cad1b683d | 841 | * @param[in] myAddress: Address to write the byte. |
mcm | 2:190cad1b683d | 842 | * |
mcm | 2:190cad1b683d | 843 | * @param[out] N/A |
mcm | 2:190cad1b683d | 844 | * |
mcm | 2:190cad1b683d | 845 | * |
mcm | 2:190cad1b683d | 846 | * @return Status of DS1307_EraseByteRAM. |
mcm | 2:190cad1b683d | 847 | * |
mcm | 2:190cad1b683d | 848 | * |
mcm | 2:190cad1b683d | 849 | * @author Manuel Caballero |
mcm | 2:190cad1b683d | 850 | * @date 31/July/2018 |
mcm | 2:190cad1b683d | 851 | * @version 31/July/2018 The ORIGIN |
mcm | 2:190cad1b683d | 852 | * @pre N/A. |
mcm | 2:190cad1b683d | 853 | * @warning N/A. |
mcm | 2:190cad1b683d | 854 | */ |
mcm | 2:190cad1b683d | 855 | DS1307::DS1307_status_t DS1307::DS1307_EraseByteRAM ( uint8_t myAddress ) |
mcm | 2:190cad1b683d | 856 | { |
mcm | 2:190cad1b683d | 857 | char cmd[] = { 0, 0 }; |
mcm | 2:190cad1b683d | 858 | uint32_t aux; |
mcm | 2:190cad1b683d | 859 | |
mcm | 2:190cad1b683d | 860 | |
mcm | 2:190cad1b683d | 861 | /* Check RAM memory limits */ |
mcm | 2:190cad1b683d | 862 | if ( ( myAddress >= 0x08 ) && ( myAddress <= 0x3F ) ) { |
mcm | 2:190cad1b683d | 863 | /* Write data into the RAM memory */ |
mcm | 2:190cad1b683d | 864 | cmd[0] = myAddress; |
mcm | 2:190cad1b683d | 865 | cmd[1] = 0xFF; |
mcm | 2:190cad1b683d | 866 | aux = _i2c.write ( _DS1307_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 2:190cad1b683d | 867 | } else { |
mcm | 2:190cad1b683d | 868 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 869 | } |
mcm | 2:190cad1b683d | 870 | |
mcm | 2:190cad1b683d | 871 | |
mcm | 2:190cad1b683d | 872 | if ( aux == I2C_SUCCESS ) |
mcm | 2:190cad1b683d | 873 | { |
mcm | 2:190cad1b683d | 874 | return DS1307_SUCCESS; |
mcm | 2:190cad1b683d | 875 | } |
mcm | 2:190cad1b683d | 876 | else |
mcm | 2:190cad1b683d | 877 | { |
mcm | 2:190cad1b683d | 878 | return DS1307_FAILURE; |
mcm | 2:190cad1b683d | 879 | } |
mcm | 2:190cad1b683d | 880 | } |