RTC PCF2129 Library

Files at this revision

API Documentation at this revision

Comitter:
king33jp
Date:
Thu Jul 16 14:51:05 2015 +0000
Child:
1:a2f545432493
Commit message:
rtc PCF2129

Changed in this revision

PCF2129.cpp Show annotated file Show diff for this revision Revisions of this file
PCF2129.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF2129.cpp	Thu Jul 16 14:51:05 2015 +0000
@@ -0,0 +1,122 @@
+/*
+ *  PCF2129 library
+ *
+ */
+
+#include    "mbed.h"
+#include    "PCF2129.h"
+
+PCF2129::PCF2129( PinName sda, PinName scl, char addr ) : m_i2c( sda, scl),m_addr(addr)
+{
+    init( 0, 0, 0, 0x07 );      // int disable,CLKout diable
+}
+
+PCF2129::~PCF2129()
+{
+//    if ( NULL != m_i2c )
+//        delete  m_i2c;
+}
+
+int PCF2129::init( char vControl_1, char vControl_2, char vControl_3, char vCLKOUT_ctl )
+{
+    char    data[ 4 ];
+    int     err;
+
+    data[ 0 ]   = 0;            // Control_1; //  access start register address
+    data[ 1 ]   = vControl_1;
+    data[ 2 ]   = vControl_2;
+    data[ 3 ]   = vControl_3;
+
+    err     = m_i2c.write( m_addr , data, sizeof( data ) );
+    err    |= set_register( 0x0F, vCLKOUT_ctl );    // ClockOut Control
+
+    return ( err ? I2C_ACCESS_FAIL : NO_ERROR );
+}
+
+int PCF2129::is_init_required( void )
+{
+    return ( read_register( 0x03 ) & 0x80 ? true : false );
+}
+
+int PCF2129::set_time( struct tm *dtp ){
+    char        buf[ 8 ];
+    char        err;
+
+    buf[ 0 ]    = 0x03;             // Seconds;
+    buf[ 1 ]    = Dec2RtcData( dtp->tm_sec  );
+    buf[ 2 ]    = Dec2RtcData( dtp->tm_min  );
+    buf[ 3 ]    = Dec2RtcData( dtp->tm_hour );
+    buf[ 4 ]    = Dec2RtcData( dtp->tm_mday );
+    buf[ 5 ]    = Dec2RtcData( dtp->tm_wday );
+    buf[ 6 ]    = Dec2RtcData( dtp->tm_mon  + 1   );
+    buf[ 7 ]    = Dec2RtcData( dtp->tm_year - 100 );
+
+    err = m_i2c.write( m_addr, buf, 8 );
+
+    return ( err ? I2C_ACCESS_FAIL : NO_ERROR );
+}
+
+int PCF2129::set_time( time_t *tp ){
+    return ( set_time( localtime( tp ) ) );
+}
+
+time_t PCF2129::get_time( time_t *tp ){
+    struct tm   dt, *dtp;
+    time_t      t;
+    char        buf[ 8 ];
+
+    dtp = &dt;
+
+    buf[ 0 ]    = 0x03;         //Seconds;  //  read start register address
+
+    if ( m_i2c.write( m_addr, buf, 1 ) )
+        return ( TIME_FUNC_ERROR );
+
+    if ( m_i2c.read( m_addr, buf, 7 ) )
+        return ( TIME_FUNC_ERROR );
+
+    dtp->tm_sec     = RtcData2Dec( buf[ 0 ] );
+    dtp->tm_min     = RtcData2Dec( buf[ 1 ] );
+    dtp->tm_hour    = RtcData2Dec( buf[ 2 ] );
+    dtp->tm_mday    = RtcData2Dec( buf[ 3 ] );
+    dtp->tm_wday    = RtcData2Dec( buf[ 4 ] );
+    dtp->tm_mon     = RtcData2Dec( buf[ 5 ] ) - 1;
+    dtp->tm_year    = RtcData2Dec( buf[ 6 ] ) + 100;
+
+    t   = mktime( dtp );
+
+    if ( tp )
+        *tp  = t;
+
+    return( t );
+}
+
+char PCF2129::Dec2RtcData(char tmp){
+    return ((tmp/10)<<4) | ((tmp%10)&0x0F);
+}
+
+char PCF2129::RtcData2Dec(char tmp){
+    return (tmp&0x0F) + (tmp>>4)*10;
+}
+
+int PCF2129::set_register( char reg_addr, char reg_data )
+{
+    char    b[ 2 ];
+
+    b[ 0 ]    = reg_addr;
+    b[ 1 ]    = reg_data;
+
+    return ( m_i2c.write( m_addr, b, sizeof( b ) ) );
+}
+
+int PCF2129::read_register( char reg_addr )
+{
+    char    data;
+
+    data    = reg_addr;
+    m_i2c.write( m_addr, &data, 1 );
+    m_i2c.read( m_addr, &data, 1 );
+
+    return ( data );
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF2129.h	Thu Jul 16 14:51:05 2015 +0000
@@ -0,0 +1,123 @@
+ /*
+ *  PCF2129 mbed library
+ *
+ *  @author     king33jp , imAkichi
+ *  @version    0.1
+ *  @date       13-Jul-2015
+ *
+ *  datasheet:
+ *  http://www.jp.nxp.com/products/interface_and_connectivity/real_time_clocks/rtcs_with_temp_compensation/PCF2129T.html
+ *
+ */
+
+#ifndef        MBED_PCF2129
+#define        MBED_PCF2129
+
+#include    "mbed.h"
+
+/** PCF2129 class
+ *
+ *  PCF2129AT is RTC IC.
+ *  datasheet is followed.
+ *  http://www.jp.nxp.com/products/interface_and_connectivity/real_time_clocks/rtcs_with_temp_compensation/PCF2129T.html
+ *  Example:
+ *  @code
+ *  #include "mbed.h"
+ *  #include "PCF2129.h"
+ *  
+ *  PCF2129 rtc( PTE0, PTE1 );  // sda,scl 
+ *  
+ *  int main()
+ *   struct tm dt,*dtp;
+ *   dtp = &dt;
+ *   dt.tm_sec     = 0;
+ *   dt.tm_min     = 0;
+ *   dt.tm_hour    = 23;
+ *   dt.tm_mday    = 25;
+ *   dt.tm_mon     = 12 - 1;     // Janualy=0
+ *   dt.tm_year    = 115;        // 1900 is start. PCF2129 is start 2000
+ *    
+ *   t   = mktime( &dt );
+ *   dtp = localtime(&t);
+ *
+ *  {
+ *      if ( rtc.is_init_required() ) {
+ *          rtc.set_time( dtp );
+ *      }
+ *  
+ *      while ( 1 ) {
+ *          t   = rtc.time( NULL );
+ *          printf( "%s\r", ctime( &t ) );
+ *          wait( 0.25 );
+ *      }
+ *  }
+ *  @endcode
+ */
+
+class PCF2129
+{
+public:
+    /** Error code */
+    typedef enum {
+        NO_ERROR                = 0,
+        CLOCK_INTEGRITY_FAIL    = 1,
+        I2C_ACCESS_FAIL         = 2,
+        TIME_FUNC_ERROR         = ((time_t)-1)
+    }
+    ErrorNum;
+
+    /** Create a PCF2129 instance connected to specified I2C pins with specified address
+     *
+     *  @param I2C_sda      I2C-bus SDA pin
+     *  @param I2C_scl      I2C-bus SCL pin
+     *  @param I2C_addr     I2C-bus slave address
+     */
+    PCF2129( PinName sda, PinName scl , char addr);
+
+    /** Destractor
+     */
+    ~PCF2129();
+
+
+    /** Clock integrity check
+     *
+     *  @return     non-zero value if the clock was stopped (means need to set the time)
+     */
+    int     is_init_required( void );
+
+    /** Set the time
+     *
+     *  @param dtp  Pointer to struct tm
+     *  @return     Error code (NO_ERROR==0)
+     */
+    int     set_time( struct tm *dtp );
+
+    /** Set the time
+     *
+     *  @param tp   pointer to time_t
+     *  @return     Error code (NO_ERROR==0)
+     */
+    int     set_time( time_t *tp );
+
+    /** Get time of day
+     *
+     *  This function works similar to "time()" in standard-C-library
+     *
+     *  @param tp   Pointer to time_t
+     *  @return     Error code (NO_ERROR==0)
+     */
+    time_t  get_time( time_t *tp );
+
+    char    Dec2RtcData(char tmp);
+    char    RtcData2Dec(char tmp);
+
+private:
+    int     init( char vControl_1, char vControl_2, char vControl_3, char vCLKOUT_ctl );
+    int     set_register( char reg_addr, char reg_data );
+    int     read_register( char reg_addr );
+   
+    I2C     m_i2c;
+    char    m_addr;
+}
+;
+#endif  // end of "#ifndef MBED_PCF2129"