RTC PCF2129 Library

Committer:
king33jp
Date:
Tue Jul 21 15:13:41 2015 +0000
Revision:
1:a2f545432493
Parent:
0:7f72438fee70
i2c addr parameter is deleted.

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