RTC PCF2129 Library
PCF2129.cpp@1:a2f545432493, 2015-07-21 (annotated)
- 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?
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 | 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 |