RTC PCF2129 Library

Committer:
king33jp
Date:
Thu Jul 16 14:51:05 2015 +0000
Revision:
0:7f72438fee70
Child:
1:a2f545432493
rtc PCF2129

Who changed what in which revision?

UserRevisionLine numberNew contents of line
king33jp 0:7f72438fee70 1 /*
king33jp 0:7f72438fee70 2 * PCF2129 library
king33jp 0:7f72438fee70 3 *
king33jp 0:7f72438fee70 4 */
king33jp 0:7f72438fee70 5
king33jp 0:7f72438fee70 6 #include "mbed.h"
king33jp 0:7f72438fee70 7 #include "PCF2129.h"
king33jp 0:7f72438fee70 8
king33jp 0:7f72438fee70 9 PCF2129::PCF2129( PinName sda, PinName scl, char addr ) : m_i2c( sda, scl),m_addr(addr)
king33jp 0:7f72438fee70 10 {
king33jp 0:7f72438fee70 11 init( 0, 0, 0, 0x07 ); // int disable,CLKout diable
king33jp 0:7f72438fee70 12 }
king33jp 0:7f72438fee70 13
king33jp 0:7f72438fee70 14 PCF2129::~PCF2129()
king33jp 0:7f72438fee70 15 {
king33jp 0:7f72438fee70 16 // if ( NULL != m_i2c )
king33jp 0:7f72438fee70 17 // delete m_i2c;
king33jp 0:7f72438fee70 18 }
king33jp 0:7f72438fee70 19
king33jp 0:7f72438fee70 20 int PCF2129::init( char vControl_1, char vControl_2, char vControl_3, char vCLKOUT_ctl )
king33jp 0:7f72438fee70 21 {
king33jp 0:7f72438fee70 22 char data[ 4 ];
king33jp 0:7f72438fee70 23 int err;
king33jp 0:7f72438fee70 24
king33jp 0:7f72438fee70 25 data[ 0 ] = 0; // Control_1; // access start register address
king33jp 0:7f72438fee70 26 data[ 1 ] = vControl_1;
king33jp 0:7f72438fee70 27 data[ 2 ] = vControl_2;
king33jp 0:7f72438fee70 28 data[ 3 ] = vControl_3;
king33jp 0:7f72438fee70 29
king33jp 0:7f72438fee70 30 err = m_i2c.write( m_addr , data, sizeof( data ) );
king33jp 0:7f72438fee70 31 err |= set_register( 0x0F, vCLKOUT_ctl ); // ClockOut Control
king33jp 0:7f72438fee70 32
king33jp 0:7f72438fee70 33 return ( err ? I2C_ACCESS_FAIL : NO_ERROR );
king33jp 0:7f72438fee70 34 }
king33jp 0:7f72438fee70 35
king33jp 0:7f72438fee70 36 int PCF2129::is_init_required( void )
king33jp 0:7f72438fee70 37 {
king33jp 0:7f72438fee70 38 return ( read_register( 0x03 ) & 0x80 ? true : false );
king33jp 0:7f72438fee70 39 }
king33jp 0:7f72438fee70 40
king33jp 0:7f72438fee70 41 int PCF2129::set_time( struct tm *dtp ){
king33jp 0:7f72438fee70 42 char buf[ 8 ];
king33jp 0:7f72438fee70 43 char err;
king33jp 0:7f72438fee70 44
king33jp 0:7f72438fee70 45 buf[ 0 ] = 0x03; // Seconds;
king33jp 0:7f72438fee70 46 buf[ 1 ] = Dec2RtcData( dtp->tm_sec );
king33jp 0:7f72438fee70 47 buf[ 2 ] = Dec2RtcData( dtp->tm_min );
king33jp 0:7f72438fee70 48 buf[ 3 ] = Dec2RtcData( dtp->tm_hour );
king33jp 0:7f72438fee70 49 buf[ 4 ] = Dec2RtcData( dtp->tm_mday );
king33jp 0:7f72438fee70 50 buf[ 5 ] = Dec2RtcData( dtp->tm_wday );
king33jp 0:7f72438fee70 51 buf[ 6 ] = Dec2RtcData( dtp->tm_mon + 1 );
king33jp 0:7f72438fee70 52 buf[ 7 ] = Dec2RtcData( dtp->tm_year - 100 );
king33jp 0:7f72438fee70 53
king33jp 0:7f72438fee70 54 err = m_i2c.write( m_addr, buf, 8 );
king33jp 0:7f72438fee70 55
king33jp 0:7f72438fee70 56 return ( err ? I2C_ACCESS_FAIL : NO_ERROR );
king33jp 0:7f72438fee70 57 }
king33jp 0:7f72438fee70 58
king33jp 0:7f72438fee70 59 int PCF2129::set_time( time_t *tp ){
king33jp 0:7f72438fee70 60 return ( set_time( localtime( tp ) ) );
king33jp 0:7f72438fee70 61 }
king33jp 0:7f72438fee70 62
king33jp 0:7f72438fee70 63 time_t PCF2129::get_time( time_t *tp ){
king33jp 0:7f72438fee70 64 struct tm dt, *dtp;
king33jp 0:7f72438fee70 65 time_t t;
king33jp 0:7f72438fee70 66 char buf[ 8 ];
king33jp 0:7f72438fee70 67
king33jp 0:7f72438fee70 68 dtp = &dt;
king33jp 0:7f72438fee70 69
king33jp 0:7f72438fee70 70 buf[ 0 ] = 0x03; //Seconds; // read start register address
king33jp 0:7f72438fee70 71
king33jp 0:7f72438fee70 72 if ( m_i2c.write( m_addr, buf, 1 ) )
king33jp 0:7f72438fee70 73 return ( TIME_FUNC_ERROR );
king33jp 0:7f72438fee70 74
king33jp 0:7f72438fee70 75 if ( m_i2c.read( m_addr, buf, 7 ) )
king33jp 0:7f72438fee70 76 return ( TIME_FUNC_ERROR );
king33jp 0:7f72438fee70 77
king33jp 0:7f72438fee70 78 dtp->tm_sec = RtcData2Dec( buf[ 0 ] );
king33jp 0:7f72438fee70 79 dtp->tm_min = RtcData2Dec( buf[ 1 ] );
king33jp 0:7f72438fee70 80 dtp->tm_hour = RtcData2Dec( buf[ 2 ] );
king33jp 0:7f72438fee70 81 dtp->tm_mday = RtcData2Dec( buf[ 3 ] );
king33jp 0:7f72438fee70 82 dtp->tm_wday = RtcData2Dec( buf[ 4 ] );
king33jp 0:7f72438fee70 83 dtp->tm_mon = RtcData2Dec( buf[ 5 ] ) - 1;
king33jp 0:7f72438fee70 84 dtp->tm_year = RtcData2Dec( buf[ 6 ] ) + 100;
king33jp 0:7f72438fee70 85
king33jp 0:7f72438fee70 86 t = mktime( dtp );
king33jp 0:7f72438fee70 87
king33jp 0:7f72438fee70 88 if ( tp )
king33jp 0:7f72438fee70 89 *tp = t;
king33jp 0:7f72438fee70 90
king33jp 0:7f72438fee70 91 return( t );
king33jp 0:7f72438fee70 92 }
king33jp 0:7f72438fee70 93
king33jp 0:7f72438fee70 94 char PCF2129::Dec2RtcData(char tmp){
king33jp 0:7f72438fee70 95 return ((tmp/10)<<4) | ((tmp%10)&0x0F);
king33jp 0:7f72438fee70 96 }
king33jp 0:7f72438fee70 97
king33jp 0:7f72438fee70 98 char PCF2129::RtcData2Dec(char tmp){
king33jp 0:7f72438fee70 99 return (tmp&0x0F) + (tmp>>4)*10;
king33jp 0:7f72438fee70 100 }
king33jp 0:7f72438fee70 101
king33jp 0:7f72438fee70 102 int PCF2129::set_register( char reg_addr, char reg_data )
king33jp 0:7f72438fee70 103 {
king33jp 0:7f72438fee70 104 char b[ 2 ];
king33jp 0:7f72438fee70 105
king33jp 0:7f72438fee70 106 b[ 0 ] = reg_addr;
king33jp 0:7f72438fee70 107 b[ 1 ] = reg_data;
king33jp 0:7f72438fee70 108
king33jp 0:7f72438fee70 109 return ( m_i2c.write( m_addr, b, sizeof( b ) ) );
king33jp 0:7f72438fee70 110 }
king33jp 0:7f72438fee70 111
king33jp 0:7f72438fee70 112 int PCF2129::read_register( char reg_addr )
king33jp 0:7f72438fee70 113 {
king33jp 0:7f72438fee70 114 char data;
king33jp 0:7f72438fee70 115
king33jp 0:7f72438fee70 116 data = reg_addr;
king33jp 0:7f72438fee70 117 m_i2c.write( m_addr, &data, 1 );
king33jp 0:7f72438fee70 118 m_i2c.read( m_addr, &data, 1 );
king33jp 0:7f72438fee70 119
king33jp 0:7f72438fee70 120 return ( data );
king33jp 0:7f72438fee70 121 }
king33jp 0:7f72438fee70 122