RTC PCF2129 Library
Diff: PCF2129.cpp
- Revision:
- 0:7f72438fee70
- Child:
- 1:a2f545432493
--- /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 ); +} +