64 x 8, Serial, I2C Real-Time Clock

Committer:
mcm
Date:
Tue Jul 31 15:17:07 2018 +0000
Revision:
2:190cad1b683d
Parent:
1:a85a4a5e44b2
The driver was completed and tested, it works as expected ( NUCLEO-L152RE )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:a85a4a5e44b2 1 /**
mcm 1:a85a4a5e44b2 2 * @brief DS1307.h
mcm 1:a85a4a5e44b2 3 * @details 64 x 8, Serial, I2C Real-Time Clock.
mcm 1:a85a4a5e44b2 4 * Header file.
mcm 1:a85a4a5e44b2 5 *
mcm 1:a85a4a5e44b2 6 *
mcm 1:a85a4a5e44b2 7 * @return N/A
mcm 1:a85a4a5e44b2 8 *
mcm 1:a85a4a5e44b2 9 * @author Manuel Caballero
mcm 1:a85a4a5e44b2 10 * @date 31/July/2018
mcm 1:a85a4a5e44b2 11 * @version 31/July/2018 The ORIGIN
mcm 1:a85a4a5e44b2 12 * @pre N/A
mcm 1:a85a4a5e44b2 13 * @warning N/A
mcm 1:a85a4a5e44b2 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 1:a85a4a5e44b2 15 */
mcm 1:a85a4a5e44b2 16 #ifndef DS1307_H
mcm 1:a85a4a5e44b2 17 #define DS1307_H
mcm 1:a85a4a5e44b2 18
mcm 1:a85a4a5e44b2 19 #include "mbed.h"
mcm 1:a85a4a5e44b2 20
mcm 1:a85a4a5e44b2 21
mcm 1:a85a4a5e44b2 22 /**
mcm 1:a85a4a5e44b2 23 Example:
mcm 1:a85a4a5e44b2 24 @code
mcm 2:190cad1b683d 25 #include "mbed.h"
mcm 2:190cad1b683d 26 #include "DS1307.h"
mcm 2:190cad1b683d 27
mcm 2:190cad1b683d 28 DS1307 myDS1307 ( I2C_SDA, I2C_SCL, DS1307::DS1307_ADDRESS, 400000 );
mcm 2:190cad1b683d 29 Serial pc ( USBTX, USBRX );
mcm 2:190cad1b683d 30
mcm 2:190cad1b683d 31 DigitalOut myled ( LED1 );
mcm 2:190cad1b683d 32 Ticker newReading;
mcm 2:190cad1b683d 33
mcm 2:190cad1b683d 34
mcm 2:190cad1b683d 35 uint32_t myState = 0;
mcm 2:190cad1b683d 36
mcm 2:190cad1b683d 37
mcm 2:190cad1b683d 38
mcm 2:190cad1b683d 39 //@brief FUNCTION PROTOTYPES
mcm 2:190cad1b683d 40 //
mcm 2:190cad1b683d 41 void changeDATA ( void );
mcm 2:190cad1b683d 42
mcm 2:190cad1b683d 43
mcm 2:190cad1b683d 44
mcm 2:190cad1b683d 45
mcm 2:190cad1b683d 46 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
mcm 2:190cad1b683d 47 //
mcm 2:190cad1b683d 48 int main()
mcm 2:190cad1b683d 49 {
mcm 2:190cad1b683d 50 uint8_t myDataRAM;
mcm 2:190cad1b683d 51 uint32_t aux;
mcm 2:190cad1b683d 52 DS1307::DS1307_vector_data_t myDS1307_Data;
mcm 2:190cad1b683d 53
mcm 2:190cad1b683d 54
mcm 2:190cad1b683d 55 pc.baud ( 115200 );
mcm 2:190cad1b683d 56
mcm 2:190cad1b683d 57 myled = 1;
mcm 2:190cad1b683d 58 wait(3);
mcm 2:190cad1b683d 59 myled = 0;
mcm 2:190cad1b683d 60
mcm 2:190cad1b683d 61
mcm 2:190cad1b683d 62 // Enable the DS1307 oscillator
mcm 2:190cad1b683d 63 aux = myDS1307.DS1307_OscillatorMode ( DS1307::SECONDS_CH_OSCILLATOR_ENABLED );
mcm 2:190cad1b683d 64
mcm 2:190cad1b683d 65 // Write data into the RAM memory
mcm 2:190cad1b683d 66 myDataRAM = 0x23;
mcm 2:190cad1b683d 67 aux = myDS1307.DS1307_WriteByteRAM ( myDataRAM, 0x11 ); // Data: 0x23, Address: 0x11
mcm 2:190cad1b683d 68
mcm 2:190cad1b683d 69 // Read data into the RAM memory
mcm 2:190cad1b683d 70 myDataRAM = 0;
mcm 2:190cad1b683d 71 aux = myDS1307.DS1307_ReadByteRAM ( &myDataRAM, 0x11 ); // Address: 0x11
mcm 2:190cad1b683d 72
mcm 2:190cad1b683d 73 // Erase data into the RAM memory
mcm 2:190cad1b683d 74 aux = myDS1307.DS1307_EraseByteRAM ( 0x11 ); // Address: 0x11
mcm 2:190cad1b683d 75
mcm 2:190cad1b683d 76 // Read data into the RAM memory
mcm 2:190cad1b683d 77 myDataRAM = 0;
mcm 2:190cad1b683d 78 aux = myDS1307.DS1307_ReadByteRAM ( &myDataRAM, 0x11 ); // Address: 0x11
mcm 2:190cad1b683d 79
mcm 2:190cad1b683d 80 // Set the day of the week
mcm 2:190cad1b683d 81 myDS1307_Data.DayOfTheWeek = DS1307::DAY_TUESDAY;
mcm 2:190cad1b683d 82 aux = myDS1307.DS1307_SetDayOfTheWeek ( myDS1307_Data );
mcm 2:190cad1b683d 83
mcm 2:190cad1b683d 84 // Set the date
mcm 2:190cad1b683d 85 myDS1307_Data.BCDDate = 0x31; // Date: 31
mcm 2:190cad1b683d 86 aux = myDS1307.DS1307_SetDate ( myDS1307_Data );
mcm 2:190cad1b683d 87
mcm 2:190cad1b683d 88 // Set the month
mcm 2:190cad1b683d 89 myDS1307_Data.BCDMonth = DS1307::MONTH_JULY;
mcm 2:190cad1b683d 90 aux = myDS1307.DS1307_SetMonth ( myDS1307_Data );
mcm 2:190cad1b683d 91
mcm 2:190cad1b683d 92 // Set the year
mcm 2:190cad1b683d 93 myDS1307_Data.BCDYear = 0x18; // Year: 2018
mcm 2:190cad1b683d 94 aux = myDS1307.DS1307_SetYear ( myDS1307_Data );
mcm 2:190cad1b683d 95
mcm 2:190cad1b683d 96 // Set the time
mcm 2:190cad1b683d 97 myDS1307_Data.BCDTime = 0x150300; // Time: 13:52.00
mcm 2:190cad1b683d 98 myDS1307_Data.Time12H_24HMode = DS1307::HOURS_MODE_24H;
mcm 2:190cad1b683d 99 myDS1307_Data.TimeAM_PM_Mode = DS1307::HOURS_MODE_PM;
mcm 2:190cad1b683d 100 aux = myDS1307.DS1307_SetTime ( myDS1307_Data );
mcm 2:190cad1b683d 101
mcm 2:190cad1b683d 102 // Set square-wave output pin: 32.768kHz
mcm 2:190cad1b683d 103 aux = myDS1307.DS1307_SquareWaveOutput( DS1307::CONTROL_SQWE_ENABLED, DS1307::CONTROL_RS_32_768_KHZ );
mcm 2:190cad1b683d 104
mcm 2:190cad1b683d 105
mcm 2:190cad1b683d 106 newReading.attach( &changeDATA, 1 ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
mcm 2:190cad1b683d 107
mcm 2:190cad1b683d 108 // Let the callbacks take care of everything
mcm 2:190cad1b683d 109 while(1) {
mcm 2:190cad1b683d 110 sleep();
mcm 2:190cad1b683d 111
mcm 2:190cad1b683d 112 myled = 1;
mcm 2:190cad1b683d 113
mcm 2:190cad1b683d 114 if ( myState == 1 ) {
mcm 2:190cad1b683d 115 // Get the day of the week
mcm 2:190cad1b683d 116 aux = myDS1307.DS1307_GetDayOfTheWeek ( &myDS1307_Data );
mcm 2:190cad1b683d 117
mcm 2:190cad1b683d 118 // Get the day of the date
mcm 2:190cad1b683d 119 aux = myDS1307.DS1307_GetDate ( &myDS1307_Data );
mcm 2:190cad1b683d 120
mcm 2:190cad1b683d 121 // Get the month
mcm 2:190cad1b683d 122 aux = myDS1307.DS1307_GetMonth ( &myDS1307_Data );
mcm 2:190cad1b683d 123
mcm 2:190cad1b683d 124 // Get the year
mcm 2:190cad1b683d 125 aux = myDS1307.DS1307_GetYear ( &myDS1307_Data );
mcm 2:190cad1b683d 126
mcm 2:190cad1b683d 127 // Get the time
mcm 2:190cad1b683d 128 aux = myDS1307.DS1307_GetTime ( &myDS1307_Data );
mcm 2:190cad1b683d 129
mcm 2:190cad1b683d 130 // Transmit result through the UART
mcm 2:190cad1b683d 131 pc.printf( "%02x/%02x/%02x %d %02x:%02x.%02x\r\n", myDS1307_Data.BCDDate, myDS1307_Data.BCDMonth, myDS1307_Data.BCDYear, myDS1307_Data.DayOfTheWeek,
mcm 2:190cad1b683d 132 (uint8_t)( ( myDS1307_Data.BCDTime & 0xFF0000 ) >> 16U ), (uint8_t)( ( myDS1307_Data.BCDTime & 0x00FF00 ) >> 8U ),
mcm 2:190cad1b683d 133 (uint8_t)( myDS1307_Data.BCDTime & 0x0000FF ) );
mcm 2:190cad1b683d 134
mcm 2:190cad1b683d 135 // Reset the variables
mcm 2:190cad1b683d 136 myState = 0; // Reset the variable
mcm 2:190cad1b683d 137 }
mcm 2:190cad1b683d 138
mcm 2:190cad1b683d 139 myled = 0;
mcm 2:190cad1b683d 140 }
mcm 2:190cad1b683d 141 }
mcm 2:190cad1b683d 142
mcm 2:190cad1b683d 143 // @brief changeDATA ( void )
mcm 2:190cad1b683d 144 //
mcm 2:190cad1b683d 145 // @details It changes myState variable
mcm 2:190cad1b683d 146 //
mcm 2:190cad1b683d 147 // @param[in] N/A
mcm 2:190cad1b683d 148 //
mcm 2:190cad1b683d 149 // @param[out] N/A.
mcm 2:190cad1b683d 150 //
mcm 2:190cad1b683d 151 //
mcm 2:190cad1b683d 152 // @return N/A..
mcm 2:190cad1b683d 153 //
mcm 2:190cad1b683d 154 //
mcm 2:190cad1b683d 155 // @author Manuel Caballero
mcm 2:190cad1b683d 156 // @date 31/July/2018
mcm 2:190cad1b683d 157 // @version 31/July/2018 The ORIGIN
mcm 2:190cad1b683d 158 // @pre N/A
mcm 2:190cad1b683d 159 // @warning N/A.
mcm 2:190cad1b683d 160 void changeDATA ( void )
mcm 2:190cad1b683d 161 {
mcm 2:190cad1b683d 162 myState = 1;
mcm 2:190cad1b683d 163 }
mcm 1:a85a4a5e44b2 164 @endcode
mcm 1:a85a4a5e44b2 165 */
mcm 1:a85a4a5e44b2 166
mcm 1:a85a4a5e44b2 167
mcm 1:a85a4a5e44b2 168 /*!
mcm 1:a85a4a5e44b2 169 Library for the DS1307 64 x 8, Serial, I2C Real-Time Clock.
mcm 1:a85a4a5e44b2 170 */
mcm 1:a85a4a5e44b2 171 class DS1307
mcm 1:a85a4a5e44b2 172 {
mcm 1:a85a4a5e44b2 173 public:
mcm 1:a85a4a5e44b2 174 /**
mcm 1:a85a4a5e44b2 175 * @brief DEFAULT ADDRESSES
mcm 1:a85a4a5e44b2 176 */
mcm 1:a85a4a5e44b2 177 typedef enum {
mcm 1:a85a4a5e44b2 178 DS1307_ADDRESS = ( 0b1101000 << 1 ) /*!< DS1307 I2C Address */
mcm 1:a85a4a5e44b2 179 } DS1307_addresses_t;
mcm 1:a85a4a5e44b2 180
mcm 1:a85a4a5e44b2 181
mcm 1:a85a4a5e44b2 182 // REGISTER MAP
mcm 1:a85a4a5e44b2 183 /**
mcm 1:a85a4a5e44b2 184 * @brief TIMEKEEPER REGISTERS
mcm 1:a85a4a5e44b2 185 */
mcm 1:a85a4a5e44b2 186 typedef enum {
mcm 1:a85a4a5e44b2 187 DS1307_SECONDS = 0x00, /*!< Seconds ( Read/Write ) */
mcm 1:a85a4a5e44b2 188 DS1307_MINUTES = 0x01, /*!< Minutes ( Read/Write ) */
mcm 1:a85a4a5e44b2 189 DS1307_HOURS = 0x02, /*!< Hours ( Read/Write ) */
mcm 1:a85a4a5e44b2 190 DS1307_DAY = 0x03, /*!< Day ( Read/Write ) */
mcm 1:a85a4a5e44b2 191 DS1307_DATE = 0x04, /*!< Date ( Read/Write ) */
mcm 1:a85a4a5e44b2 192 DS1307_MONTH = 0x05, /*!< Month ( Read/Write ) */
mcm 1:a85a4a5e44b2 193 DS1307_YEAR = 0x06, /*!< Year ( Read/Write ) */
mcm 1:a85a4a5e44b2 194 DS1307_CONTROL = 0x07 /*!< Control ( Read/Write ) */
mcm 1:a85a4a5e44b2 195 } DS1307_timekeeper_registers_t;
mcm 1:a85a4a5e44b2 196
mcm 1:a85a4a5e44b2 197
mcm 1:a85a4a5e44b2 198
mcm 1:a85a4a5e44b2 199 // SECONDS
mcm 1:a85a4a5e44b2 200 /**
mcm 1:a85a4a5e44b2 201 * @brief CLOCK HALT
mcm 1:a85a4a5e44b2 202 */
mcm 1:a85a4a5e44b2 203 typedef enum {
mcm 1:a85a4a5e44b2 204 SECONDS_CH_MASK = ( 1 << 7 ), /*!< CH mask */
mcm 1:a85a4a5e44b2 205 SECONDS_CH_OSCILLATOR_ENABLED = ( 0 << 7 ), /*!< CH Oscillator is enabled */
mcm 1:a85a4a5e44b2 206 SECONDS_CH_OSCILLATOR_DISABLED = ( 1 << 7 ) /*!< CH Oscillator is disabled */
mcm 1:a85a4a5e44b2 207 } DS1307_seconds_ch_t;
mcm 1:a85a4a5e44b2 208
mcm 1:a85a4a5e44b2 209
mcm 1:a85a4a5e44b2 210 /**
mcm 1:a85a4a5e44b2 211 * @brief 10 SECONDS
mcm 1:a85a4a5e44b2 212 */
mcm 1:a85a4a5e44b2 213 typedef enum {
mcm 1:a85a4a5e44b2 214 SECONDS_10SECONDS_MASK = ( 0b111 << 4 ) /*!< 10 Seconds mask */
mcm 1:a85a4a5e44b2 215 } DS1307_seconds_10seconds_t;
mcm 1:a85a4a5e44b2 216
mcm 1:a85a4a5e44b2 217
mcm 1:a85a4a5e44b2 218 /**
mcm 1:a85a4a5e44b2 219 * @brief SECONDS
mcm 1:a85a4a5e44b2 220 */
mcm 1:a85a4a5e44b2 221 typedef enum {
mcm 1:a85a4a5e44b2 222 SECONDS_SECONDS_MASK = ( 0b1111 << 0 ) /*!< Seconds mask */
mcm 1:a85a4a5e44b2 223 } DS1307_seconds_seconds_t;
mcm 1:a85a4a5e44b2 224
mcm 1:a85a4a5e44b2 225
mcm 1:a85a4a5e44b2 226
mcm 1:a85a4a5e44b2 227 // MINUTES
mcm 1:a85a4a5e44b2 228 /**
mcm 1:a85a4a5e44b2 229 * @brief 10 MINUTES
mcm 1:a85a4a5e44b2 230 */
mcm 1:a85a4a5e44b2 231 typedef enum {
mcm 1:a85a4a5e44b2 232 MINUTES_10MINUTES_MASK = ( 0b111 << 4 ) /*!< 10 Minutes mask */
mcm 1:a85a4a5e44b2 233 } DS1307_minutes_10minutes_t;
mcm 1:a85a4a5e44b2 234
mcm 1:a85a4a5e44b2 235
mcm 1:a85a4a5e44b2 236 /**
mcm 1:a85a4a5e44b2 237 * @brief MINUTES
mcm 1:a85a4a5e44b2 238 */
mcm 1:a85a4a5e44b2 239 typedef enum {
mcm 1:a85a4a5e44b2 240 MINUTES_MINUTES_MASK = ( 0b1111 << 0 ) /*!< Minutes mask */
mcm 1:a85a4a5e44b2 241 } DS1307_minutes_minutes_t;
mcm 1:a85a4a5e44b2 242
mcm 1:a85a4a5e44b2 243
mcm 1:a85a4a5e44b2 244
mcm 1:a85a4a5e44b2 245 // HOURS
mcm 1:a85a4a5e44b2 246 /**
mcm 1:a85a4a5e44b2 247 * @brief 12-HOUR OR 24-HOUR MODE
mcm 1:a85a4a5e44b2 248 */
mcm 1:a85a4a5e44b2 249 typedef enum {
mcm 1:a85a4a5e44b2 250 HOURS_MODE_MASK = ( 1 << 6 ), /*!< Hours 12/24 mode mask */
mcm 1:a85a4a5e44b2 251 HOURS_MODE_12H = ( 1 << 6 ), /*!< Hours 12-hour mode enabled */
mcm 1:a85a4a5e44b2 252 HOURS_MODE_24H = ( 0 << 6 ) /*!< Hours 24-hour mode enabled */
mcm 1:a85a4a5e44b2 253 } DS1307_hours_mode_t;
mcm 1:a85a4a5e44b2 254
mcm 1:a85a4a5e44b2 255
mcm 1:a85a4a5e44b2 256 /**
mcm 1:a85a4a5e44b2 257 * @brief AM OR PM MODE
mcm 1:a85a4a5e44b2 258 */
mcm 1:a85a4a5e44b2 259 typedef enum {
mcm 1:a85a4a5e44b2 260 HOURS_MODE_AM_PM_MASK = ( 1 << 5 ), /*!< Hours am/pm mode mask */
mcm 1:a85a4a5e44b2 261 HOURS_MODE_AM = ( 0 << 5 ), /*!< Hours AM mode enabled */
mcm 1:a85a4a5e44b2 262 HOURS_MODE_PM = ( 1 << 5 ) /*!< Hours PM mode enabled */
mcm 1:a85a4a5e44b2 263 } DS1307_hours_am_pm_mode_t;
mcm 1:a85a4a5e44b2 264
mcm 1:a85a4a5e44b2 265
mcm 1:a85a4a5e44b2 266 /**
mcm 1:a85a4a5e44b2 267 * @brief 10 HOUR
mcm 1:a85a4a5e44b2 268 */
mcm 1:a85a4a5e44b2 269 typedef enum {
mcm 1:a85a4a5e44b2 270 HOUR_10HOUR_MASK = ( 0b11 << 4 ) /*!< 10 Hour mask */
mcm 1:a85a4a5e44b2 271 } DS1307_hours_10hour_t;
mcm 1:a85a4a5e44b2 272
mcm 1:a85a4a5e44b2 273
mcm 1:a85a4a5e44b2 274 /**
mcm 1:a85a4a5e44b2 275 * @brief HOURS
mcm 1:a85a4a5e44b2 276 */
mcm 1:a85a4a5e44b2 277 typedef enum {
mcm 1:a85a4a5e44b2 278 HOUR_HOURS_MASK = ( 0b1111 << 0 ) /*!< Hours mask */
mcm 1:a85a4a5e44b2 279 } DS1307_hours_hours_t;
mcm 1:a85a4a5e44b2 280
mcm 1:a85a4a5e44b2 281
mcm 1:a85a4a5e44b2 282
mcm 1:a85a4a5e44b2 283 // DAY
mcm 1:a85a4a5e44b2 284 /**
mcm 1:a85a4a5e44b2 285 * @brief DAY
mcm 1:a85a4a5e44b2 286 */
mcm 1:a85a4a5e44b2 287 typedef enum {
mcm 1:a85a4a5e44b2 288 DAY_MASK = ( 0b111 << 0 ), /*!< Day mask */
mcm 1:a85a4a5e44b2 289 DAY_SUNDAY = ( 1 << 0 ), /*!< Day Sunday */
mcm 1:a85a4a5e44b2 290 DAY_MONDAY = ( 2 << 0 ), /*!< Day Monday */
mcm 1:a85a4a5e44b2 291 DAY_TUESDAY = ( 3 << 0 ), /*!< Day Tuesday */
mcm 1:a85a4a5e44b2 292 DAY_WEDNESDAY = ( 4 << 0 ), /*!< Day Wednesday */
mcm 1:a85a4a5e44b2 293 DAY_THURSDAY = ( 5 << 0 ), /*!< Day Thursday */
mcm 1:a85a4a5e44b2 294 DAY_FRIDAY = ( 6 << 0 ), /*!< Day Friday */
mcm 1:a85a4a5e44b2 295 DAY_SATURDAY = ( 7 << 0 ) /*!< Day Saturday */
mcm 1:a85a4a5e44b2 296 } DS1307_day_t;
mcm 1:a85a4a5e44b2 297
mcm 1:a85a4a5e44b2 298
mcm 1:a85a4a5e44b2 299
mcm 1:a85a4a5e44b2 300 // DATE
mcm 1:a85a4a5e44b2 301 /**
mcm 1:a85a4a5e44b2 302 * @brief 10 DATE
mcm 1:a85a4a5e44b2 303 */
mcm 1:a85a4a5e44b2 304 typedef enum {
mcm 1:a85a4a5e44b2 305 DATE_10DATE_MASK = ( 0b11 << 4 ) /*!< 10 Date mask */
mcm 1:a85a4a5e44b2 306 } DS1307_date_10date_t;
mcm 1:a85a4a5e44b2 307
mcm 1:a85a4a5e44b2 308
mcm 1:a85a4a5e44b2 309 /**
mcm 1:a85a4a5e44b2 310 * @brief DATE
mcm 1:a85a4a5e44b2 311 */
mcm 1:a85a4a5e44b2 312 typedef enum {
mcm 1:a85a4a5e44b2 313 DATE_DATE_MASK = ( 0b1111 << 0 ) /*!< Date mask */
mcm 1:a85a4a5e44b2 314 } DS1307_date_date_t;
mcm 1:a85a4a5e44b2 315
mcm 1:a85a4a5e44b2 316
mcm 1:a85a4a5e44b2 317
mcm 1:a85a4a5e44b2 318 // MONTH
mcm 1:a85a4a5e44b2 319 /**
mcm 1:a85a4a5e44b2 320 * @brief 10 MONTH
mcm 1:a85a4a5e44b2 321 */
mcm 1:a85a4a5e44b2 322 typedef enum {
mcm 1:a85a4a5e44b2 323 MONTH_10MONTH_MASK = ( 0b1 << 4 ) /*!< 10 Month mask */
mcm 1:a85a4a5e44b2 324 } DS1307_month_10month_t;
mcm 1:a85a4a5e44b2 325
mcm 1:a85a4a5e44b2 326
mcm 1:a85a4a5e44b2 327 /**
mcm 1:a85a4a5e44b2 328 * @brief MONTH
mcm 1:a85a4a5e44b2 329 */
mcm 1:a85a4a5e44b2 330 typedef enum {
mcm 1:a85a4a5e44b2 331 MONTH_MONTH_MASK = ( 0b1111 << 0 ) /*!< Month mask */
mcm 1:a85a4a5e44b2 332 } DS1307_month_month_t;
mcm 1:a85a4a5e44b2 333
mcm 1:a85a4a5e44b2 334
mcm 1:a85a4a5e44b2 335
mcm 1:a85a4a5e44b2 336 // YEAR
mcm 1:a85a4a5e44b2 337 /**
mcm 1:a85a4a5e44b2 338 * @brief 10 YEAR
mcm 1:a85a4a5e44b2 339 */
mcm 1:a85a4a5e44b2 340 typedef enum {
mcm 1:a85a4a5e44b2 341 YEAR_10YEAR_MASK = ( 0b1111 << 4 ) /*!< 10 Year mask */
mcm 1:a85a4a5e44b2 342 } DS1307_year_10month_t;
mcm 1:a85a4a5e44b2 343
mcm 1:a85a4a5e44b2 344
mcm 1:a85a4a5e44b2 345 /**
mcm 1:a85a4a5e44b2 346 * @brief YEAR
mcm 1:a85a4a5e44b2 347 */
mcm 1:a85a4a5e44b2 348 typedef enum {
mcm 1:a85a4a5e44b2 349 YEAR_YEAR_MASK = ( 0b1111 << 0 ) /*!< Year mask */
mcm 1:a85a4a5e44b2 350 } DS1307_year_year_t;
mcm 1:a85a4a5e44b2 351
mcm 1:a85a4a5e44b2 352
mcm 1:a85a4a5e44b2 353
mcm 1:a85a4a5e44b2 354 // CONTROL
mcm 1:a85a4a5e44b2 355 /**
mcm 1:a85a4a5e44b2 356 * @brief OUTPUT CONTROL (OUT)
mcm 1:a85a4a5e44b2 357 */
mcm 1:a85a4a5e44b2 358 typedef enum {
mcm 1:a85a4a5e44b2 359 CONTROL_OUT_MASK = ( 1 << 7 ), /*!< OUT mask */
mcm 1:a85a4a5e44b2 360 CONTROL_OUT_HIGH = ( 1 << 7 ), /*!< SQW/OUT high */
mcm 1:a85a4a5e44b2 361 CONTROL_OUT_LOW = ( 0 << 7 ) /*!< SQW/OUT low */
mcm 1:a85a4a5e44b2 362 } DS1307_control_out_t;
mcm 1:a85a4a5e44b2 363
mcm 1:a85a4a5e44b2 364
mcm 1:a85a4a5e44b2 365 /**
mcm 1:a85a4a5e44b2 366 * @brief SQUARE-WAVE ENABLE (SQWE)
mcm 1:a85a4a5e44b2 367 */
mcm 1:a85a4a5e44b2 368 typedef enum {
mcm 1:a85a4a5e44b2 369 CONTROL_SQWE_MASK = ( 1 << 4 ), /*!< SQWE mask */
mcm 1:a85a4a5e44b2 370 CONTROL_SQWE_ENABLED = ( 1 << 4 ), /*!< SQWE enabled */
mcm 1:a85a4a5e44b2 371 CONTROL_SQWE_DISABLED = ( 0 << 4 ) /*!< SQWE disabled */
mcm 1:a85a4a5e44b2 372 } DS1307_control_sqwe_t;
mcm 1:a85a4a5e44b2 373
mcm 1:a85a4a5e44b2 374
mcm 1:a85a4a5e44b2 375 /**
mcm 1:a85a4a5e44b2 376 * @brief RATE SELECT
mcm 1:a85a4a5e44b2 377 */
mcm 1:a85a4a5e44b2 378 typedef enum {
mcm 1:a85a4a5e44b2 379 CONTROL_RS_MASK = ( 0b11 << 0 ), /*!< RS mask */
mcm 1:a85a4a5e44b2 380 CONTROL_RS_1_HZ = ( 0b00 << 0 ), /*!< RS 1Hz */
mcm 1:a85a4a5e44b2 381 CONTROL_RS_4_096_KHZ = ( 0b01 << 0 ), /*!< RS 4.096kHz */
mcm 1:a85a4a5e44b2 382 CONTROL_RS_8_192_KHZ = ( 0b10 << 0 ), /*!< RS 8.192kHz */
mcm 1:a85a4a5e44b2 383 CONTROL_RS_32_768_KHZ = ( 0b11 << 0 ) /*!< RS 32.768kHz */
mcm 1:a85a4a5e44b2 384 } DS1307_control_rate_select_t;
mcm 1:a85a4a5e44b2 385
mcm 1:a85a4a5e44b2 386
mcm 1:a85a4a5e44b2 387
mcm 1:a85a4a5e44b2 388 // ALTERNATIVES
mcm 1:a85a4a5e44b2 389 /**
mcm 1:a85a4a5e44b2 390 * @brief MONTH
mcm 1:a85a4a5e44b2 391 */
mcm 1:a85a4a5e44b2 392 typedef enum {
mcm 1:a85a4a5e44b2 393 MONTH_JANUARY = 0x01, /*!< January */
mcm 1:a85a4a5e44b2 394 MONTH_FEBRUARY = 0x02, /*!< February */
mcm 1:a85a4a5e44b2 395 MONTH_MARCH = 0x03, /*!< March */
mcm 1:a85a4a5e44b2 396 MONTH_APRIL = 0x04, /*!< April */
mcm 1:a85a4a5e44b2 397 MONTH_MAY = 0x05, /*!< May */
mcm 1:a85a4a5e44b2 398 MONTH_JUNE = 0x06, /*!< June */
mcm 1:a85a4a5e44b2 399 MONTH_JULY = 0x07, /*!< July */
mcm 1:a85a4a5e44b2 400 MONTH_AUGUST = 0x08, /*!< August */
mcm 1:a85a4a5e44b2 401 MONTH_SEPTEMBER = 0x09, /*!< September */
mcm 1:a85a4a5e44b2 402 MONTH_OCTOBER = 0x10, /*!< October */
mcm 1:a85a4a5e44b2 403 MONTH_NOVEMBER = 0x11, /*!< November */
mcm 1:a85a4a5e44b2 404 MONTH_DECEMBER = 0x12 /*!< December */
mcm 1:a85a4a5e44b2 405 } DS1307_month_t;
mcm 1:a85a4a5e44b2 406
mcm 1:a85a4a5e44b2 407
mcm 1:a85a4a5e44b2 408
mcm 1:a85a4a5e44b2 409
mcm 1:a85a4a5e44b2 410 #ifndef DS1307_VECTOR_STRUCT_H
mcm 1:a85a4a5e44b2 411 #define DS1307_VECTOR_STRUCT_H
mcm 1:a85a4a5e44b2 412 typedef struct {
mcm 1:a85a4a5e44b2 413 uint32_t BCDTime;
mcm 1:a85a4a5e44b2 414 DS1307_hours_mode_t Time12H_24HMode;
mcm 1:a85a4a5e44b2 415 DS1307_hours_am_pm_mode_t TimeAM_PM_Mode;
mcm 1:a85a4a5e44b2 416
mcm 1:a85a4a5e44b2 417 DS1307_day_t DayOfTheWeek;
mcm 1:a85a4a5e44b2 418
mcm 1:a85a4a5e44b2 419 uint8_t BCDDate;
mcm 1:a85a4a5e44b2 420
mcm 1:a85a4a5e44b2 421 DS1307_month_t BCDMonth;
mcm 1:a85a4a5e44b2 422
mcm 1:a85a4a5e44b2 423 uint8_t BCDYear;
mcm 1:a85a4a5e44b2 424 } DS1307_vector_data_t;
mcm 1:a85a4a5e44b2 425 #endif
mcm 1:a85a4a5e44b2 426
mcm 1:a85a4a5e44b2 427
mcm 1:a85a4a5e44b2 428 /**
mcm 1:a85a4a5e44b2 429 * @brief INTERNAL CONSTANTS
mcm 1:a85a4a5e44b2 430 */
mcm 1:a85a4a5e44b2 431 typedef enum {
mcm 1:a85a4a5e44b2 432 DS1307_SUCCESS = 0,
mcm 1:a85a4a5e44b2 433 DS1307_FAILURE = 1,
mcm 1:a85a4a5e44b2 434 I2C_SUCCESS = 0 /*!< I2C communication was fine */
mcm 1:a85a4a5e44b2 435 } DS1307_status_t;
mcm 1:a85a4a5e44b2 436
mcm 1:a85a4a5e44b2 437
mcm 1:a85a4a5e44b2 438
mcm 1:a85a4a5e44b2 439
mcm 1:a85a4a5e44b2 440 /** Create an DS1307 object connected to the specified I2C pins.
mcm 1:a85a4a5e44b2 441 *
mcm 1:a85a4a5e44b2 442 * @param sda I2C data pin
mcm 1:a85a4a5e44b2 443 * @param scl I2C clock pin
mcm 1:a85a4a5e44b2 444 * @param addr I2C slave address
mcm 1:a85a4a5e44b2 445 * @param freq I2C frequency
mcm 1:a85a4a5e44b2 446 */
mcm 1:a85a4a5e44b2 447 DS1307 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:a85a4a5e44b2 448
mcm 1:a85a4a5e44b2 449 /** Delete DS1307 object.
mcm 1:a85a4a5e44b2 450 */
mcm 1:a85a4a5e44b2 451 ~DS1307();
mcm 1:a85a4a5e44b2 452
mcm 1:a85a4a5e44b2 453 /** It enables/disabled the oscillator.
mcm 1:a85a4a5e44b2 454 */
mcm 1:a85a4a5e44b2 455 DS1307_status_t DS1307_OscillatorMode ( DS1307_seconds_ch_t myOscillator );
mcm 1:a85a4a5e44b2 456
mcm 1:a85a4a5e44b2 457 /** It configures the square-wave output.
mcm 1:a85a4a5e44b2 458 */
mcm 1:a85a4a5e44b2 459 DS1307_status_t DS1307_SquareWaveOutput ( DS1307_control_sqwe_t mySQWE, DS1307_control_rate_select_t myRateSelect );
mcm 1:a85a4a5e44b2 460
mcm 1:a85a4a5e44b2 461 /** It configures the output pin ( OUT ).
mcm 1:a85a4a5e44b2 462 */
mcm 1:a85a4a5e44b2 463 DS1307_status_t DS1307_ConfOutput ( DS1307_control_out_t myOUT );
mcm 1:a85a4a5e44b2 464
mcm 1:a85a4a5e44b2 465 /** It sets the time ( BCD mode ).
mcm 1:a85a4a5e44b2 466 */
mcm 1:a85a4a5e44b2 467 DS1307_status_t DS1307_SetTime ( DS1307_vector_data_t myTime );
mcm 1:a85a4a5e44b2 468
mcm 1:a85a4a5e44b2 469 /** It gets the time ( BCD mode ).
mcm 1:a85a4a5e44b2 470 */
mcm 1:a85a4a5e44b2 471 DS1307_status_t DS1307_GetTime ( DS1307_vector_data_t* myTime );
mcm 1:a85a4a5e44b2 472
mcm 1:a85a4a5e44b2 473 /** It sets the day of the week.
mcm 1:a85a4a5e44b2 474 */
mcm 1:a85a4a5e44b2 475 DS1307_status_t DS1307_SetDayOfTheWeek ( DS1307_vector_data_t myDayOfTheWeek );
mcm 1:a85a4a5e44b2 476
mcm 1:a85a4a5e44b2 477 /** It gets the day of the week.
mcm 1:a85a4a5e44b2 478 */
mcm 1:a85a4a5e44b2 479 DS1307_status_t DS1307_GetDayOfTheWeek ( DS1307_vector_data_t* myDayOfTheWeek );
mcm 1:a85a4a5e44b2 480
mcm 1:a85a4a5e44b2 481 /** It sets the date ( BCD mode ).
mcm 1:a85a4a5e44b2 482 */
mcm 1:a85a4a5e44b2 483 DS1307_status_t DS1307_SetDate ( DS1307_vector_data_t myDate );
mcm 1:a85a4a5e44b2 484
mcm 1:a85a4a5e44b2 485 /** It gets the date ( BCD mode ).
mcm 1:a85a4a5e44b2 486 */
mcm 1:a85a4a5e44b2 487 DS1307_status_t DS1307_GetDate ( DS1307_vector_data_t* myDate );
mcm 1:a85a4a5e44b2 488
mcm 1:a85a4a5e44b2 489 /** It sets the month ( BCD mode ).
mcm 1:a85a4a5e44b2 490 */
mcm 1:a85a4a5e44b2 491 DS1307_status_t DS1307_SetMonth ( DS1307_vector_data_t myMonth );
mcm 1:a85a4a5e44b2 492
mcm 1:a85a4a5e44b2 493 /** It gets the month ( BCD mode ).
mcm 1:a85a4a5e44b2 494 */
mcm 1:a85a4a5e44b2 495 DS1307_status_t DS1307_GetMonth ( DS1307_vector_data_t* myMonth );
mcm 1:a85a4a5e44b2 496
mcm 1:a85a4a5e44b2 497 /** It sets the year ( BCD mode ).
mcm 1:a85a4a5e44b2 498 */
mcm 1:a85a4a5e44b2 499 DS1307_status_t DS1307_SetYear ( DS1307_vector_data_t myYear );
mcm 1:a85a4a5e44b2 500
mcm 1:a85a4a5e44b2 501 /** It gets the year ( BCD mode ).
mcm 1:a85a4a5e44b2 502 */
mcm 1:a85a4a5e44b2 503 DS1307_status_t DS1307_GetYear ( DS1307_vector_data_t* myYear );
mcm 1:a85a4a5e44b2 504
mcm 1:a85a4a5e44b2 505 /** It writes a byte into the RAM memory.
mcm 1:a85a4a5e44b2 506 */
mcm 1:a85a4a5e44b2 507 DS1307_status_t DS1307_WriteByteRAM ( uint8_t myByte, uint8_t myAddress );
mcm 1:a85a4a5e44b2 508
mcm 1:a85a4a5e44b2 509 /** It reads a byte from the RAM memory.
mcm 1:a85a4a5e44b2 510 */
mcm 1:a85a4a5e44b2 511 DS1307_status_t DS1307_ReadByteRAM ( uint8_t* myByte, uint8_t myAddress );
mcm 1:a85a4a5e44b2 512
mcm 1:a85a4a5e44b2 513 /** It ereases a byte into the RAM memory.
mcm 1:a85a4a5e44b2 514 */
mcm 1:a85a4a5e44b2 515 DS1307_status_t DS1307_EraseByteRAM ( uint8_t myAddress );
mcm 1:a85a4a5e44b2 516
mcm 1:a85a4a5e44b2 517
mcm 1:a85a4a5e44b2 518 private:
mcm 1:a85a4a5e44b2 519 I2C _i2c;
mcm 1:a85a4a5e44b2 520 uint32_t _DS1307_Addr;
mcm 1:a85a4a5e44b2 521 };
mcm 1:a85a4a5e44b2 522
mcm 1:a85a4a5e44b2 523 #endif