RTC PCF2129 Library
PCF2129.cpp@0:7f72438fee70, 2015-07-16 (annotated)
- 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?
User | Revision | Line number | New 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 |