Manuel Caballero / PCF85063
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCF85063.h Source File

PCF85063.h

00001 /**
00002  * @brief       PCF85063.h
00003  * @details     Tiny Real-Time Clock/calendar.
00004  *              Header file.
00005  *
00006  *
00007  * @return      N/A
00008  *
00009  * @author      Manuel Caballero
00010  * @date        19/February/2019
00011  * @version     19/February/2019    The ORIGIN
00012  * @pre         N/A.
00013  * @warning     N/A
00014  * @pre         This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ). All rights reserved.
00015  */
00016 #ifndef PCF85063_H
00017 #define PCF85063_H
00018 
00019 #include "mbed.h"
00020 
00021 
00022 /**
00023     Example:
00024 @code
00025 #include "mbed.h"
00026 #include "PCF85063.h"
00027 
00028 PCF85063 myPCF85063 ( I2C_SDA, I2C_SCL, PCF85063::PCF85063_ADDRESS, 400000 );   // I2C_SDA | I2C_SCL
00029 Serial pc           ( USBTX, USBRX );                                           // tx, rx
00030 
00031 DigitalOut  myled   ( LED1 );
00032 Ticker      newAction;
00033 
00034 
00035 // @brief Constants.
00036 
00037 
00038 // @brief Variables.
00039 volatile uint32_t myState;                                                      //   State that indicates when to perform an ADC sample  
00040 
00041 
00042 // @brief   FUNCTION PROTOTYPES
00043 void    changeDATA     ( void );
00044 
00045 
00046 
00047 // @brief FUNCTION FOR APPLICATION MAIN ENTRY.
00048 int main()
00049 {
00050     static const char* MY_WEEK_DAY_STRING[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
00051     
00052     PCF85063::PCF85063_status_t aux;
00053     PCF85063::PCF85063_data_t   myPCF85063_Data;
00054 
00055     pc.baud ( 115200 );
00056 
00057 
00058     myled   =   1;
00059     wait(3);
00060     myled   =   0;
00061 
00062     // Perform a software reset  
00063     aux  =   myPCF85063.PCF85063_SoftwareReset ();
00064 
00065     // Wait until the oscillator is stable   
00066     do {
00067         // Clear Clock integrity flag.  
00068         aux  =   myPCF85063.PCF85063_ClearOscillatorClockIntegrityFlag ();
00069 
00070         // Check Clock integrity flag.  
00071         aux  =   myPCF85063.PCF85063_CheckOscillatorClockIntegrityFlag ( &myPCF85063_Data );
00072     } while( myPCF85063_Data.os == PCF85063::SECONDS_OS_CLOCK_INTEGRITY_NOT_GUARANTEED );
00073 
00074     // External clock test mode: Normal mode ( no test at all )  
00075     aux  =   myPCF85063.PCF85063_SetTestMode ( PCF85063::CONTROL_1_EXT_TEST_NORMAL_MODE );
00076 
00077     // RTC clock is enabled 
00078     aux  =   myPCF85063.PCF85063_SetRTCMode ( PCF85063::CONTROL_1_STOP_RTC_CLOCK_RUNS );
00079 
00080     // No correction interrupt generated  
00081     aux  =   myPCF85063.PCF85063_SetCorrectionInterruptMode ( PCF85063::CONTROL_1_CIE_NO_CORRECTION_INTERRUPT_GENERATED );
00082 
00083     // 24 hour mode is selected  
00084     myPCF85063_Data.Time12H_24HMode  =   PCF85063::CONTROL_1_12_24_24_HOUR_MODE;
00085     aux  =   myPCF85063.PCF85063_Set12_24_HourMode ( myPCF85063_Data );
00086 
00087     // Internal oscillator capacitor selection: 7 pF 
00088     aux  =   myPCF85063.PCF85063_SetInternalOscillatorCapacitor ( PCF85063::CONTROL_1_CAP_SEL_7_PF );
00089 
00090     // Minute interrupt and half minute interrupt are disabled  
00091     aux  =   myPCF85063.PCF85063_SetMinuteInterrupts ( PCF85063::CONTROL_2_MI_MINUTE_INTERRUPT_DISABLED, PCF85063::CONTROL_2_HMI_HALF_MINUTE_INTERRUPT_DISABLED );
00092 
00093     // Clear timer flag  
00094     aux  =   myPCF85063.PCF85063_ClearTimerFlag ();
00095 
00096     // CLKOUT: 1Hz  
00097     aux  =   myPCF85063.PCF85063_SetClockOutputFrequency ( PCF85063::CONTROL_2_COF_CLKOUT_1_HZ );
00098 
00099     // Normal mode offset at 0.  
00100     aux  =   myPCF85063.PCF85063_SetOffset ( PCF85063::OFFSET_MODE_NORMAL_MODE, 0 );
00101 
00102     // Write data ( 0x23 ) into device's RAM 
00103     myPCF85063_Data.ramByte  =   0x23;
00104     aux  =   myPCF85063.PCF85063_WriteByteRAM ( myPCF85063_Data );
00105 
00106     // Read data from device's RAM 
00107     myPCF85063_Data.ramByte  =   0;                                                       // Reset the variable
00108     aux  =   myPCF85063.PCF85063_ReadByteRAM ( &myPCF85063_Data );
00109     pc.printf ( "Data in RAM: %x (0x23)\r\n", myPCF85063_Data.ramByte );
00110 
00111     // Get day. After reset, we expect to get 0x01  
00112     aux  =   myPCF85063.PCF85063_GetDay ( &myPCF85063_Data );
00113 
00114     // Set day: 23  
00115     myPCF85063_Data.BCDday   =   0x23;
00116     aux  =   myPCF85063.PCF85063_SetDay ( myPCF85063_Data );
00117 
00118     // Get month. After reset, we expect to get 0x01 ( January )  
00119     aux  =   myPCF85063.PCF85063_GetMonth ( &myPCF85063_Data );
00120 
00121     // Set month: September  
00122     myPCF85063_Data.BCDmonth   =   PCF85063::MONTHS_MONTHS_SEPTEMBER;
00123     aux  =   myPCF85063.PCF85063_SetMonth ( myPCF85063_Data );
00124 
00125     // Get weekday. After reset, we expect to get Saturday  
00126     aux  =   myPCF85063.PCF85063_GetWeekday ( &myPCF85063_Data );
00127 
00128     // Set weekday: Friday  
00129     myPCF85063_Data.weekday   =   PCF85063::WEEKDAYS_WEEKDAYS_FRIDAY;
00130     aux  =   myPCF85063.PCF85063_SetWeekday ( myPCF85063_Data );
00131 
00132     // Get year. After reset, we expect to get 00 ( it corresponds to 2000 )  
00133     aux  =   myPCF85063.PCF85063_GetYear ( &myPCF85063_Data );
00134 
00135     // Set year: 19 ( 2019 )  
00136     myPCF85063_Data.BCDyear   =   0x19;
00137     aux  =   myPCF85063.PCF85063_SetYear ( myPCF85063_Data );
00138 
00139     // Set time: 235955 ( 23:59:55 )  
00140     myPCF85063_Data.BCDtime   =   0x235955;
00141     aux  =   myPCF85063.PCF85063_SetTime ( myPCF85063_Data );
00142 
00143     myState  =   0UL;                                                           // Reset the variable
00144     newAction.attach( &changeDATA, 1U );                                        // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
00145 
00146     // Let the callbacks take care of everything
00147     while(1) {
00148         sleep();
00149 
00150         if ( myState == 1UL ) {
00151             myled = 1U;
00152 
00153             // Get time  
00154             aux  =   myPCF85063.PCF85063_GetTime ( &myPCF85063_Data );
00155 
00156             // Get day  
00157             aux  =   myPCF85063.PCF85063_GetDay ( &myPCF85063_Data );
00158 
00159             // Get month  
00160             aux  =   myPCF85063.PCF85063_GetMonth ( &myPCF85063_Data );
00161 
00162             // Get weekday  
00163             aux  =   myPCF85063.PCF85063_GetWeekday ( &myPCF85063_Data );
00164 
00165             // Get year 
00166             aux  =   myPCF85063.PCF85063_GetYear ( &myPCF85063_Data );
00167 
00168             // Final data
00169             pc.printf ( "Time: %x:%x:%x, Month %x Day %x %s 20%x\r\n", ( ( myPCF85063_Data.BCDtime & 0xFF0000 ) >> 16U ), ( ( myPCF85063_Data.BCDtime & 0x00FF00 ) >> 8U ), 
00170                                                                        ( myPCF85063_Data.BCDtime & 0x0000FF ), myPCF85063_Data.BCDmonth, myPCF85063_Data.BCDday, MY_WEEK_DAY_STRING[myPCF85063_Data.weekday], myPCF85063_Data.BCDyear );
00171 
00172             // Reset the variables   
00173             myState  =   0UL;
00174             myled    =   0U;
00175         }
00176     }
00177 }
00178 
00179  // @brief       changeDATA ( void  )
00180  //
00181  // @details     It changes myState variable
00182  //
00183  // @param[in]    N/A
00184  //
00185  // @param[out]   N/A.
00186  //
00187  //
00188  // @return       N/A.
00189  //
00190  //
00191  // @author      Manuel Caballero
00192  // @date        19/February/2019
00193  // @version     19/February/2019   The ORIGIN
00194  // @pre         N/A
00195  // @warning     N/A.
00196  //
00197 void changeDATA ( void )
00198 {
00199     myState  =   1UL;
00200 }
00201 @endcode
00202 */
00203 
00204 
00205 /*!
00206  Library for the PCF85063 Tiny Real-Time Clock/calendar.
00207 */
00208 class PCF85063
00209 {
00210 public:
00211     /**
00212     * @brief   DEFAULT ADDRESS
00213     */
00214     typedef enum {
00215         PCF85063_ADDRESS      =   ( 0b1010001 << 1U )                        /*!<   I2C slave address byte                       */
00216     } PCF85063_address_t;
00217 
00218 
00219 
00220     /**
00221       * @brief   REGISTERS ORGANIZATION
00222       */
00223     typedef enum {
00224         /* CONTROL AND STATUS REGISTERS  */
00225         PCF85063_CONTROL_1   =   0x00,                                       /*!<  Control and status register 1                 */
00226         PCF85063_CONTROL_2   =   0x01,                                       /*!<  Control and status register 2                 */
00227         PCF85063_OFFSET      =   0x02,                                       /*!<  Offset register                               */
00228         PCF85063_RAM_BYTE    =   0x03,                                       /*!<  RAM byte register                             */
00229 
00230         /* TIME AND DATE REGISTERS  */
00231         PCF85063_SECONDS     =   0x04,                                       /*!<  Seconds register                              */
00232         PCF85063_MINUTES     =   0x05,                                       /*!<  Minutes register                              */
00233         PCF85063_HOURS       =   0x06,                                       /*!<  Hours register                                */
00234         PCF85063_DAYS        =   0x07,                                       /*!<  Days register                                 */
00235         PCF85063_WEEKDAYS    =   0x08,                                       /*!<  Weekdays register                             */
00236         PCF85063_MONTHS      =   0x09,                                       /*!<  Months register                               */
00237         PCF85063_YEARS       =   0x0A                                        /*!<  Years register                                */
00238     } PCF85063_registers_organization_t;
00239 
00240 
00241 
00242     /**
00243       * @brief   Register Control_1
00244       */
00245     /* EXT_TEST <7>: EXTERNAL CLOCK TEST MODE
00246      *    NOTE: N/A.
00247      */
00248     typedef enum {
00249         CONTROL_1_EXT_TEST_MASK                      =   ( 1U << 7U ),     /*!<  EXT_TEST mask                                   */
00250         CONTROL_1_EXT_TEST_NORMAL_MODE               =   ( 0U << 7U ),     /*!<  EXT_TEST: normal mode               [ Default ] */
00251         CONTROL_1_EXT_TEST_EXTERNAL_CLOCK_TEST_MODE  =   ( 1U << 7U )      /*!<  EXT_TEST: external clock test mode              */
00252     } PCF85063_control_1_ext_test_t;
00253 
00254 
00255 
00256     /* STOP <5>: STOP BIT
00257      *    NOTE: N/A.
00258      */
00259     typedef enum {
00260         CONTROL_1_STOP_MASK                          =   ( 1U << 5U ),     /*!<  STOP mask                                       */
00261         CONTROL_1_STOP_RTC_CLOCK_RUNS                =   ( 0U << 5U ),     /*!<  STOP: RTC clock runs                [ Default ] */
00262         CONTROL_1_STOP_RTC_CLOCK_STOPPED             =   ( 1U << 5U )      /*!<  STOP: RTC clock is stopped                      */
00263     } PCF85063_control_1_stop_t ;
00264 
00265 
00266 
00267     /* SR <4>: SOFTWARE RESET
00268      *    NOTE: N/A.
00269      */
00270     typedef enum {
00271         CONTROL_1_SR_MASK                            =   ( 1U << 4U ),     /*!<  SR mask                                         */
00272         CONTROL_1_SR_NO_SOFTWARE_RESET               =   ( 0U << 4U ),     /*!<  SR: no software reset               [ Default ] */
00273         CONTROL_1_SR_SOFTWARE_RESET                  =   ( 1U << 4U )      /*!<  SR: initiate software reset                     */
00274     } PCF85063_control_1_sr_t ;
00275 
00276 
00277 
00278     /* CIE <2>: CORRECTION INTERRUPT ENABLE
00279      *    NOTE: N/A.
00280      */
00281     typedef enum {
00282         CONTROL_1_CIE_MASK                               =   ( 1U << 2U ), /*!<  CIE mask                                                      */
00283         CONTROL_1_CIE_NO_CORRECTION_INTERRUPT_GENERATED  =   ( 0U << 2U ), /*!<  CIE: no correction interrupt generated [ Default ]            */
00284         CONTROL_1_CIE_INTERRUPT_PULSES_GENERATED         =   ( 1U << 2U )  /*!<  CIE: interrupt pulses are generated at every correction cycle */
00285     } PCF85063_control_1_cie_t ;
00286 
00287 
00288 
00289     /* 12_24 <1>: SOFTWARE RESET
00290      *    NOTE: N/A.
00291      */
00292     typedef enum {
00293         CONTROL_1_12_24_MASK                         =   ( 1U << 1U ),     /*!<  12_24 mask                                      */
00294         CONTROL_1_12_24_24_HOUR_MODE                 =   ( 0U << 1U ),     /*!<  12_24: 24 hour mode is selected     [ Default ] */
00295         CONTROL_1_12_24_12_HOUR_MODE                 =   ( 1U << 1U )      /*!<  12_24: 12 hour mode is selected                 */
00296     } PCF85063_control_1_12_24_t ;
00297 
00298 
00299 
00300     /* CAP_SEL <0>: INTERNAL OSCILLATOR CAPACITOR SELECTION
00301      *    NOTE: N/A.
00302      */
00303     typedef enum {
00304         CONTROL_1_CAP_SEL_MASK                       =   ( 1U << 0U ),     /*!<  CAP_SEL mask                                    */
00305         CONTROL_1_CAP_SEL_7_PF                       =   ( 0U << 0U ),     /*!<  CAP_SEL: 7 pF                       [ Default ] */
00306         CONTROL_1_CAP_SEL_12_5_PF                    =   ( 1U << 0U )      /*!<  CAP_SEL: 12.5 pF                                */
00307     } PCF85063_control_1_cap_sel_t ;
00308 
00309 
00310 
00311     /**
00312       * @brief   Register Control_2
00313       */
00314     /* MI <5>: MINUTE INTERRUPT
00315      *    NOTE: N/A.
00316      */
00317     typedef enum {
00318         CONTROL_2_MI_MASK                            =   ( 1U << 5U ),     /*!<  MI mask                                         */
00319         CONTROL_2_MI_MINUTE_INTERRUPT_DISABLED       =   ( 0U << 5U ),     /*!<  Minute interrupt disabled           [ Default ] */
00320         CONTROL_2_MI_MINUTE_INTERRUPT_ENABLED        =   ( 1U << 5U )      /*!<  Minute interrupt enabled                        */
00321     } PCF85063_control_2_mi_t;
00322 
00323 
00324 
00325     /* HMI <4>: HALF MINUTE INTERRUPT
00326      *    NOTE: N/A.
00327      */
00328     typedef enum {
00329         CONTROL_2_HMI_MASK                             =   ( 1U << 4U ),   /*!<  HMI mask                                        */
00330         CONTROL_2_HMI_HALF_MINUTE_INTERRUPT_DISABLED   =   ( 0U << 4U ),   /*!<  Half Minute interrupt disabled      [ Default ] */
00331         CONTROL_2_HMI_HALF_MINUTE_INTERRUPT_ENABLED    =   ( 1U << 4U )    /*!<  Half Minute interrupt enabled                   */
00332     } PCF85063_control_2_hmi_t ;
00333 
00334 
00335 
00336     /* TF <3>: TIMER FLAG
00337      *    NOTE: N/A.
00338      */
00339     typedef enum {
00340         CONTROL_2_TF_MASK                            =   ( 1U << 3U ),     /*!<  TF mask                                         */
00341         CONTROL_2_TF_TIMER_INTERRUPT_NOT_GENERATED   =   ( 0U << 3U ),     /*!<  No Timer interrupt generated        [ Default ] */
00342         CONTROL_2_TF_TIMER_INTERRUPT_GENERATED       =   ( 1U << 3U )      /*!<  Timer interrupt generated                       */
00343     } PCF85063_control_2_tf_t ;
00344 
00345 
00346 
00347     /* COF <2:0>: CLKOUT CONTROL
00348      *    NOTE: N/A.
00349      */
00350     typedef enum {
00351         CONTROL_2_COF_MASK                           =   ( 0b111 << 0U ),  /*!<  COF mask                                        */
00352         CONTROL_2_COF_CLKOUT_32768_HZ                =   ( 0b000 << 0U ),  /*!<  CLKOUT: 32768 Hz                    [ Default ] */
00353         CONTROL_2_COF_CLKOUT_16384_HZ                =   ( 0b001 << 0U ),  /*!<  CLKOUT: 16384 Hz                                */
00354         CONTROL_2_COF_CLKOUT_8192_HZ                 =   ( 0b010 << 0U ),  /*!<  CLKOUT: 8192  Hz                                */
00355         CONTROL_2_COF_CLKOUT_4096_HZ                 =   ( 0b011 << 0U ),  /*!<  CLKOUT: 4096  Hz                                */
00356         CONTROL_2_COF_CLKOUT_2048_HZ                 =   ( 0b100 << 0U ),  /*!<  CLKOUT: 2048  Hz                                */
00357         CONTROL_2_COF_CLKOUT_1024_HZ                 =   ( 0b101 << 0U ),  /*!<  CLKOUT: 1024  Hz                                */
00358         CONTROL_2_COF_CLKOUT_1_HZ                    =   ( 0b110 << 0U ),  /*!<  CLKOUT: 1     Hz                                */
00359         CONTROL_2_COF_CLKOUT_LOW                     =   ( 0b111 << 0U )   /*!<  CLKOUT: LOW                                     */
00360     } PCF85063_control_2_cof_t ;
00361 
00362 
00363 
00364     /**
00365       * @brief   Register Offset
00366       */
00367     /* MODE <7>: OFFSET MODE
00368      *    NOTE: N/A.
00369      */
00370     typedef enum {
00371         OFFSET_MODE_MASK                             =   ( 1U << 7U ),     /*!<  MODE mask                                                   */
00372         OFFSET_MODE_NORMAL_MODE                      =   ( 0U << 7U ),     /*!<  Normal mode: offset is made once every two hours[ Default ] */
00373         OFFSET_MODE_COURSE_MODE                      =   ( 1U << 7U )      /*!<  Course mode: offset is made every 4 minutes                 */
00374     } PCF85063_offset_mode_t;
00375 
00376 
00377 
00378     /**
00379       * @brief   Register RAM_byte
00380       */
00381     /* B <7:0>: RAM CONTENT
00382      *    NOTE: N/A.
00383      */
00384     typedef enum {
00385         RAM_BYTE_B_MASK                              =   0xFF              /*!<  RAM_byte mask                                     */
00386     } PCF85063_ram_byte_b_t;
00387 
00388 
00389 
00390     /**
00391       * @brief   Register Seconds
00392       */
00393     /* OS <7>: OSCILLATOR STOP
00394      *    NOTE: N/A.
00395      */
00396     typedef enum {
00397         SECONDS_OS_MASK                            =   ( 1U << 7U ),     /*!<  OS mask                                                                                         */
00398         SECONDS_OS_CLOCK_INTEGRITY_IS_GUARANTEED   =   ( 0U << 7U ),     /*!<  Clock integrity is guaranteed                                                                   */
00399         SECONDS_OS_CLOCK_INTEGRITY_NOT_GUARANTEED  =   ( 1U << 7U )      /*!<  Clock integrity is not guaranteed, oscillator has stopped or has been interrupted  [ Default ]  */
00400     } PCF85063_seconds_os_t;
00401 
00402 
00403 
00404     /* SECONDS, TEN'S PLACE <6:4>: ACTUAL SECONDS, TEN'S PLACE
00405      *    NOTE: CODED IN BCD FORMAT.
00406      */
00407     typedef enum {
00408         SECONDS_SECONDS_TEN_PLACE_MASK             =   ( 0b111 << 4U )   /*!<  SECONDS TEN'S PLACE mask                              */
00409     } PCF85063_seconds_ten_place_t ;
00410 
00411 
00412 
00413     /* SECONDS, UNIT PLACE <3:0>: ACTUAL SECONDS, UNIT PLACE
00414      *    NOTE: CODED IN BCD FORMAT.
00415      */
00416     typedef enum {
00417         SECONDS_SECONDS_UNIT_PLACE_MASK            =   ( 0b1111 << 0U )  /*!<  SECONDS UNIT PLACE mask                               */
00418     } PCF85063_seconds_unit_place_t ;
00419 
00420 
00421 
00422     /**
00423       * @brief   Register Minutes
00424       */
00425     /* MINUTES, TEN'S PLACE <6:4>: ACTUAL MINUTES, TEN'S PLACE
00426      *    NOTE: CODED IN BCD FORMAT.
00427      */
00428     typedef enum {
00429         MINUTES_MINUTES_TEN_PLACE_MASK             =   ( 0b111 << 4U )   /*!<  MINUTES TEN'S PLACE mask                              */
00430     } PCF85063_minutes_ten_place_t;
00431 
00432 
00433 
00434     /* MINUTES, UNIT PLACE <3:0>: ACTUAL MINUTES, UNIT PLACE
00435      *    NOTE: CODED IN BCD FORMAT.
00436      */
00437     typedef enum {
00438         MINUTES_MINUTES_UNIT_PLACE_MASK            =   ( 0b1111 << 0U )  /*!<  MINUTES UNIT PLACE mask                               */
00439     } PCF85063_minutes_unit_place_t ;
00440 
00441 
00442 
00443     /**
00444       * @brief   Register HOURS
00445       */
00446     /* AMPM <5>: AM/PM INDICATOR
00447      *    NOTE: ONLY FOR 12-HOUR MODE.
00448      */
00449     typedef enum {
00450         HOURS_AMPM_MASK                            =   ( 1U << 5U ),     /*!<  AMPM mask                                             */
00451         HOURS_AMPM_AM                              =   ( 0U << 5U ),     /*!<  AMPM: AM mode                                         */
00452         HOURS_AMPM_PM                              =   ( 1U << 5U )      /*!<  AMPM: PM mode                                         */
00453     } PCF85063_hours_ampm_t;
00454 
00455 
00456 
00457     /* HOURS, TEN'S PLACE <4>: ACTUAL HOURS, TEN'S PLACE
00458      *    NOTE: ONLY FOR 12-HOUR MODE, CODED IN BCD FORMAT.
00459      */
00460     typedef enum {
00461         HOURS_12_HOUR_MODE_TEN_PLACE_MASK          =   ( 1U << 4U )      /*!<  Hours TEN'S PLACE mask                                */
00462     } PCF85063_12_hour_mode_ten_place_t ;
00463 
00464 
00465 
00466     /* HOURS, TEN'S PLACE <5:4>: ACTUAL HOURS, TEN'S PLACE
00467      *    NOTE: ONLY FOR 24-HOUR MODE, CODED IN BCD FORMAT.
00468      */
00469     typedef enum {
00470         HOURS_24_HOUR_MODE_TEN_PLACE_MASK          =   ( 0b11 << 4U )    /*!<  Hours TEN'S PLACE mask                                */
00471     } PCF85063_24_hour_mode_ten_place_t ;
00472 
00473 
00474 
00475     /* HOURS, UNIT PLACE <3:0>: ACTUAL HOURS, UNIT PLACE
00476      *    NOTE: CODED IN BCD FORMAT.
00477      */
00478     typedef enum {
00479         HOURS_HOURS_UNIT_PLACE_MASK                =   ( 0b1111 << 0U )  /*!<  HOURS UNIT PLACE mask                                 */
00480     } PCF85063_hours_unit_place_t ;
00481 
00482 
00483 
00484     /**
00485       * @brief   Register Days
00486       */
00487     /* DAYS, TEN'S PLACE <5:4>: ACTUAL DAYS, TEN'S PLACE
00488      *    NOTE: CODED IN BCD FORMAT.
00489      */
00490     typedef enum {
00491         DAYS_DAYS_TEN_PLACE_MASK                   =   ( 0b11 << 4U )    /*!<  DAYS TEN'S PLACE mask                                 */
00492     } PCF85063_days_ten_place_t;
00493 
00494 
00495 
00496     /* DAYS, UNIT PLACE <3:0>: ACTUAL DAYS, UNIT PLACE
00497      *    NOTE: CODED IN BCD FORMAT.
00498      */
00499     typedef enum {
00500         DAYS_DAYS_UNIT_PLACE_MASK                  =   ( 0b1111 << 0U )  /*!<  DAYS UNIT PLACE mask                                  */
00501     } PCF85063_days_unit_place_t ;
00502 
00503 
00504 
00505     /**
00506       * @brief   Register Weekdays
00507       */
00508     /* WEEKDAYS <2:0>: ACTUAL WEEKDAY
00509      *    NOTE: N/A.
00510      */
00511     typedef enum {
00512         WEEKDAYS_WEEKDAYS_MASK                     =   ( 0b111 << 0U ),  /*!<  WEEKDAYS mask                                          */
00513         WEEKDAYS_WEEKDAYS_SUNDAY                   =   ( 0b000 << 0U ),  /*!<  WEEKDAYS Sunday                                        */
00514         WEEKDAYS_WEEKDAYS_MONDAY                   =   ( 0b001 << 0U ),  /*!<  WEEKDAYS Monday                                        */
00515         WEEKDAYS_WEEKDAYS_TUESDAY                  =   ( 0b010 << 0U ),  /*!<  WEEKDAYS Tuesday                                       */
00516         WEEKDAYS_WEEKDAYS_WEDNESDAY                =   ( 0b011 << 0U ),  /*!<  WEEKDAYS Wednesday                                     */
00517         WEEKDAYS_WEEKDAYS_THURSDAY                 =   ( 0b100 << 0U ),  /*!<  WEEKDAYS Thursday                                      */
00518         WEEKDAYS_WEEKDAYS_FRIDAY                   =   ( 0b101 << 0U ),  /*!<  WEEKDAYS Friday                                        */
00519         WEEKDAYS_WEEKDAYS_SATURDAY                 =   ( 0b111 << 0U )   /*!<  WEEKDAYS Saturday                          [ Default ] */
00520     } PCF85063_weekdays_weekdays_t;
00521 
00522 
00523 
00524     /**
00525       * @brief   Register Months
00526       */
00527     /* MONTHS <4:0>: ACTUAL MONTH
00528      *    NOTE: CODED IN BCD FORMAT.
00529      */
00530     typedef enum {
00531         MONTHS_MONTHS_MASK                         =   ( 0b11111 << 0U ),  /*!<  MONTHS mask                                            */
00532         MONTHS_MONTHS_JANUARY                      =   ( 0b00001 << 0U ),  /*!<  MONTHS January                             [ Default ] */
00533         MONTHS_MONTHS_FEBRUARY                     =   ( 0b00010 << 0U ),  /*!<  MONTHS February                                        */
00534         MONTHS_MONTHS_MARCH                        =   ( 0b00011 << 0U ),  /*!<  MONTHS March                                           */
00535         MONTHS_MONTHS_APRIL                        =   ( 0b00100 << 0U ),  /*!<  MONTHS April                                           */
00536         MONTHS_MONTHS_MAY                          =   ( 0b00101 << 0U ),  /*!<  MONTHS May                                             */
00537         MONTHS_MONTHS_JUNE                         =   ( 0b00110 << 0U ),  /*!<  MONTHS June                                            */
00538         MONTHS_MONTHS_JULY                         =   ( 0b00111 << 0U ),  /*!<  MONTHS July                                            */
00539         MONTHS_MONTHS_AUGUST                       =   ( 0b01000 << 0U ),  /*!<  MONTHS August                                          */
00540         MONTHS_MONTHS_SEPTEMBER                    =   ( 0b01001 << 0U ),  /*!<  MONTHS September                                       */
00541         MONTHS_MONTHS_OCTOBER                      =   ( 0b10000 << 0U ),  /*!<  MONTHS October                                         */
00542         MONTHS_MONTHS_NOVEMBER                     =   ( 0b10001 << 0U ),  /*!<  MONTHS November                                        */
00543         MONTHS_MONTHS_DECEMBER                     =   ( 0b10010 << 0U )   /*!<  MONTHS December                                        */
00544     } PCF85063_months_months_t;
00545 
00546 
00547 
00548     /**
00549       * @brief   Register Years
00550       */
00551     /* YEARS, TEN'S PLACE <7:4>: ACTUAL YEARS, TEN'S PLACE
00552      *    NOTE: CODED IN BCD FORMAT.
00553      */
00554     typedef enum {
00555         YEARS_YEARS_TEN_PLACE_MASK                 =   ( 0b1111 << 4U )   /*!<  YEARS TEN'S PLACE mask                                 */
00556     } PCF85063_years_ten_place_t;
00557 
00558 
00559 
00560     /* YEARS, UNIT PLACE <3:0>: ACTUAL YEARS, UNIT PLACE
00561      *    NOTE: CODED IN BCD FORMAT.
00562      */
00563     typedef enum {
00564         YEARS_YEARS_UNIT_PLACE_MASK                =   ( 0b1111 << 0U )   /*!<  YEARS UNIT PLACE mask                                  */
00565     } PCF85063_years_unit_place_t ;
00566 
00567 
00568 
00569 
00570 
00571 #ifndef PCF85063_VECTOR_STRUCT_H
00572 #define PCF85063_VECTOR_STRUCT_H
00573     typedef struct {
00574         PCF85063_control_1_12_24_t     Time12H_24HMode;                    /*!<  Time mode: 12-hour or 24-hour mode                    */
00575         PCF85063_hours_ampm_t         TimeAM_PM_Mode;                     /*!<  AM/PM mode ( only for 12-hour mode )                  */
00576 
00577         uint32_t                      BCDtime;                            /*!<  Time ( HHMMSS ) in BCD format                         */
00578         uint8_t                       BCDday;                             /*!<  Day number in BCD format                              */
00579         PCF85063_weekdays_weekdays_t  weekday;                            /*!<  Weekday                                               */
00580         PCF85063_months_months_t      BCDmonth;                           /*!<  Month  in BCD format                                  */
00581         uint8_t                       BCDyear;                            /*!<  Year in BCD format                                    */
00582 
00583         int8_t                        ramByte;                            /*!<  RAM byte                                              */
00584         PCF85063_seconds_os_t         os;                                 /*!<  Oscillator flag                                       */
00585     } PCF85063_data_t;
00586 #endif
00587 
00588 
00589     /**
00590       * @brief   INTERNAL CONSTANTS
00591       */
00592     typedef enum {
00593         PCF85063_SUCCESS    =       0,
00594         PCF85063_FAILURE    =       1,
00595         I2C_SUCCESS          =       0                                     /*!<   I2C communication was fine        */
00596     } PCF85063_status_t;
00597 
00598 
00599 
00600 
00601     /** Create an PCF85063 object connected to the specified I2C pins.
00602       *
00603       * @param sda     I2C data pin
00604       * @param scl     I2C clock pin
00605       * @param addr    I2C slave address
00606       * @param freq    I2C frequency
00607       */
00608     PCF85063 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
00609 
00610     /** Delete PCF85063 object.
00611      */
00612     ~PCF85063();
00613 
00614     /** It sets the external clock test mode.
00615     */
00616     PCF85063_status_t  PCF85063_SetTestMode                       ( PCF85063_control_1_ext_test_t myEXT_TEST                      );
00617 
00618     /** It sets the RTC clock mode.
00619       */
00620     PCF85063_status_t  PCF85063_SetRTCMode                        ( PCF85063_control_1_stop_t  mySTOP                              );
00621 
00622     /** It performs a software reset.
00623       */
00624     PCF85063_status_t  PCF85063_SoftwareReset                     ( void                                                          );
00625 
00626     /** It sets the correction interrupt mode.
00627       */
00628     PCF85063_status_t  PCF85063_SetCorrectionInterruptMode        ( PCF85063_control_1_cie_t  myCIE                                );
00629 
00630     /** It sets 12 or 24 hour mode.
00631       */
00632     PCF85063_status_t  PCF85063_Set12_24_HourMode                 ( PCF85063_data_t my12_24                                       );
00633 
00634     /** It sets the internal oscillator capacitor.
00635       */
00636     PCF85063_status_t  PCF85063_SetInternalOscillatorCapacitor    ( PCF85063_control_1_cap_sel_t  myCAP_SEL                        );
00637 
00638     /** It enables/disables minute/half minute interrupt.
00639       */
00640     PCF85063_status_t  PCF85063_SetMinuteInterrupts               ( PCF85063_control_2_mi_t myMI, PCF85063_control_2_hmi_t  myHMI  );
00641 
00642     /** It gets the status of the timer flag.
00643       */
00644     PCF85063_status_t  PCF85063_GetTimerFlag                      ( PCF85063_control_2_tf_t * myTF                                 );
00645 
00646     /** It resets the status of the timer flag.
00647       */
00648     PCF85063_status_t  PCF85063_ClearTimerFlag                    ( void                                                          );
00649 
00650     /** It sets the clock output frequency.
00651       */
00652     PCF85063_status_t  PCF85063_SetClockOutputFrequency           ( PCF85063_control_2_cof_t  myCOF                                );
00653 
00654     /** It sets the offset.
00655       */
00656     PCF85063_status_t  PCF85063_SetOffset                         ( PCF85063_offset_mode_t myMODE, int8_t myOFFSET                );
00657 
00658     /** It writes into the RAM byte register.
00659       */
00660     PCF85063_status_t  PCF85063_WriteByteRAM                      ( PCF85063_data_t myData                                        );
00661 
00662     /** It reads the RAM byte register.
00663       */
00664     PCF85063_status_t  PCF85063_ReadByteRAM                       ( PCF85063_data_t* myData                                       );
00665 
00666     /** It checks oscillator clock integrity flag.
00667       */
00668     PCF85063_status_t  PCF85063_CheckOscillatorClockIntegrityFlag ( PCF85063_data_t* myOS                                         );
00669 
00670     /** It clears oscillator clock integrity flag.
00671       */
00672     PCF85063_status_t  PCF85063_ClearOscillatorClockIntegrityFlag ( void                                                          );
00673 
00674     /** It sets the AM/PM indicator ( only for 12-hour mode ).
00675       */
00676     PCF85063_status_t  PCF85063_SetAM_PM_Indicator                ( PCF85063_data_t myAM_PM_Indicator                             );
00677 
00678     /** It gets the AM/PM indicator ( only for 12-hour mode ).
00679       */
00680     PCF85063_status_t  PCF85063_GetAM_PM_Indicator                ( PCF85063_data_t* myAM_PM_Indicator                            );
00681 
00682     /** It gets the day ( BCD format ).
00683       */
00684     PCF85063_status_t  PCF85063_GetDay                            ( PCF85063_data_t* myActualDay                                  );
00685 
00686     /** It sets the day ( BCD format ).
00687       */
00688     PCF85063_status_t  PCF85063_SetDay                            ( PCF85063_data_t myNewDay                                      );
00689 
00690     /** It gets the weekday.
00691       */
00692     PCF85063_status_t  PCF85063_GetWeekday                        ( PCF85063_data_t* myActualWeekday                              );
00693 
00694     /** It sets the weekday.
00695       */
00696     PCF85063_status_t  PCF85063_SetWeekday                        ( PCF85063_data_t myNewWeekday                                  );
00697 
00698     /** It gets the month ( BCD format ).
00699       */
00700     PCF85063_status_t  PCF85063_GetMonth                          ( PCF85063_data_t* myActualMonth                                );
00701 
00702     /** It sets the month ( BCD format ).
00703       */
00704     PCF85063_status_t  PCF85063_SetMonth                          ( PCF85063_data_t myNewMonth                                    );
00705 
00706     /** It gets the time ( BCD format ).
00707       */
00708     PCF85063_status_t  PCF85063_GetTime                           ( PCF85063_data_t* myActualTime                                 );
00709 
00710     /** It sets the time ( BCD format ).
00711       */
00712     PCF85063_status_t  PCF85063_SetTime                           ( PCF85063_data_t myNewTime                                     );
00713 
00714     /** It gets the year ( BCD format ).
00715       */
00716     PCF85063_status_t  PCF85063_GetYear                           ( PCF85063_data_t* myActualYear                                 );
00717 
00718     /** It sets the year ( BCD format ).
00719       */
00720     PCF85063_status_t  PCF85063_SetYear                           ( PCF85063_data_t myNewYear                                     );
00721 
00722 
00723 
00724 
00725 private:
00726     I2C      _i2c;
00727     uint32_t _PCF85063_Addr;
00728 };
00729 
00730 #endif