"PCF2127A" : RTC chip with TCXO and quartz crystal demo Please refer >> http://mbed.org/users/okano/notebook/nxp_pcf2172a-demo-code/
Information
Latest version is available on components page.
NXP_PCF2127A.h@0:e13d786ba650, 2010-06-05 (annotated)
- Committer:
- okano
- Date:
- Sat Jun 05 02:18:50 2010 +0000
- Revision:
- 0:e13d786ba650
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:e13d786ba650 | 1 | /* |
okano | 0:e13d786ba650 | 2 | * PCF2127A (Integrated RTC, TCXO and quartz crystal) demo |
okano | 0:e13d786ba650 | 3 | * (library) |
okano | 0:e13d786ba650 | 4 | * |
okano | 0:e13d786ba650 | 5 | * PCF2127A is a "real time clock (RTC)" module which is including a Xtal and TCXO |
okano | 0:e13d786ba650 | 6 | * http://www.nxp.com/pip/PCF2127A_2.html |
okano | 0:e13d786ba650 | 7 | * |
okano | 0:e13d786ba650 | 8 | * This is a just simple operation sample of the PCF2127A. |
okano | 0:e13d786ba650 | 9 | * In this sample, the PCF2127A is interfaced by I2C through pin9 and 10 of mbed. |
okano | 0:e13d786ba650 | 10 | * And also the mbed-pin8 is connected to RTC's /INT pin. |
okano | 0:e13d786ba650 | 11 | * The RTC chip is set to generate periodical interrupt in every seconds. |
okano | 0:e13d786ba650 | 12 | * This interrupt triggers the update of the terminal and LCD screen. |
okano | 0:e13d786ba650 | 13 | * |
okano | 0:e13d786ba650 | 14 | * RTC initializing part is ported from... |
okano | 0:e13d786ba650 | 15 | * http://mbed.org/users/roen/notebook/real-time/ |
okano | 0:e13d786ba650 | 16 | * |
okano | 0:e13d786ba650 | 17 | * Released under the MIT License: http://mbed.org/license/mit |
okano | 0:e13d786ba650 | 18 | * |
okano | 0:e13d786ba650 | 19 | * revision 1.0 05-Jun-2010 (a) 1st release |
okano | 0:e13d786ba650 | 20 | * revision 1.1 05-Jun-2010 (a) class name changed |
okano | 0:e13d786ba650 | 21 | * |
okano | 0:e13d786ba650 | 22 | */ |
okano | 0:e13d786ba650 | 23 | |
okano | 0:e13d786ba650 | 24 | |
okano | 0:e13d786ba650 | 25 | #ifndef MBED_NXP_PCF2127A |
okano | 0:e13d786ba650 | 26 | #define MBED_NXP_PCF2127A |
okano | 0:e13d786ba650 | 27 | |
okano | 0:e13d786ba650 | 28 | |
okano | 0:e13d786ba650 | 29 | #include "mbed.h" |
okano | 0:e13d786ba650 | 30 | |
okano | 0:e13d786ba650 | 31 | |
okano | 0:e13d786ba650 | 32 | // PCF2127A IIC address |
okano | 0:e13d786ba650 | 33 | #define PCF2127A_addr 0xA2 |
okano | 0:e13d786ba650 | 34 | |
okano | 0:e13d786ba650 | 35 | // PCF2127A registers |
okano | 0:e13d786ba650 | 36 | #define Control_1 0x00 |
okano | 0:e13d786ba650 | 37 | #define Control_2 0x01 |
okano | 0:e13d786ba650 | 38 | #define Control_3 0x02 |
okano | 0:e13d786ba650 | 39 | #define Seconds 0x03 |
okano | 0:e13d786ba650 | 40 | #define Minutes 0x04 |
okano | 0:e13d786ba650 | 41 | #define Hours 0x05 |
okano | 0:e13d786ba650 | 42 | #define Days 0x06 |
okano | 0:e13d786ba650 | 43 | #define Weekdays 0x07 |
okano | 0:e13d786ba650 | 44 | #define Months 0x08 |
okano | 0:e13d786ba650 | 45 | #define Years 0x09 |
okano | 0:e13d786ba650 | 46 | #define Second_alarm 0x0A |
okano | 0:e13d786ba650 | 47 | #define Minute_alarm 0x0B |
okano | 0:e13d786ba650 | 48 | #define Hour_alarm 0x0C |
okano | 0:e13d786ba650 | 49 | #define Day_alarm 0x0D |
okano | 0:e13d786ba650 | 50 | #define Weekday_alarm 0x0E |
okano | 0:e13d786ba650 | 51 | #define CLKOUT_ctl 0x0F |
okano | 0:e13d786ba650 | 52 | #define Watchdg_tim_ctl 0x10 |
okano | 0:e13d786ba650 | 53 | #define Watchdg_tim_val 0x11 |
okano | 0:e13d786ba650 | 54 | #define Timestp_ctl 0x12 |
okano | 0:e13d786ba650 | 55 | #define Sec_timestp 0x13 |
okano | 0:e13d786ba650 | 56 | #define Min_timestp 0x14 |
okano | 0:e13d786ba650 | 57 | #define Hour_timestp 0x15 |
okano | 0:e13d786ba650 | 58 | #define Day_timestp 0x16 |
okano | 0:e13d786ba650 | 59 | #define Mon_timestp 0x17 |
okano | 0:e13d786ba650 | 60 | #define Year_timestp 0x18 |
okano | 0:e13d786ba650 | 61 | #define Aging_offset 0x19 |
okano | 0:e13d786ba650 | 62 | |
okano | 0:e13d786ba650 | 63 | class NXP_PCF2127A { |
okano | 0:e13d786ba650 | 64 | public: |
okano | 0:e13d786ba650 | 65 | |
okano | 0:e13d786ba650 | 66 | NXP_PCF2127A( |
okano | 0:e13d786ba650 | 67 | PinName sda, |
okano | 0:e13d786ba650 | 68 | PinName sdl, |
okano | 0:e13d786ba650 | 69 | char dev_address = PCF2127A_addr, |
okano | 0:e13d786ba650 | 70 | char vControl_1 = 0x03, |
okano | 0:e13d786ba650 | 71 | char vControl_2 = 0x00, |
okano | 0:e13d786ba650 | 72 | char vControl_3 = 0x60 |
okano | 0:e13d786ba650 | 73 | ) |
okano | 0:e13d786ba650 | 74 | : i2c( sda, sdl ), device_address( dev_address ) { |
okano | 0:e13d786ba650 | 75 | set_register( Control_1, vControl_1 ); |
okano | 0:e13d786ba650 | 76 | set_register( Control_2, vControl_2 ); |
okano | 0:e13d786ba650 | 77 | set_register( Control_3, vControl_3 ); |
okano | 0:e13d786ba650 | 78 | } |
okano | 0:e13d786ba650 | 79 | |
okano | 0:e13d786ba650 | 80 | ~NXP_PCF2127A() { |
okano | 0:e13d786ba650 | 81 | } |
okano | 0:e13d786ba650 | 82 | |
okano | 0:e13d786ba650 | 83 | int is_init_required( void ) { |
okano | 0:e13d786ba650 | 84 | return ( read_register( Seconds ) & 0x80 ? 1 : 0 ); |
okano | 0:e13d786ba650 | 85 | } |
okano | 0:e13d786ba650 | 86 | |
okano | 0:e13d786ba650 | 87 | void set_time( void ) { |
okano | 0:e13d786ba650 | 88 | struct tm dt, *dtp; |
okano | 0:e13d786ba650 | 89 | char buf[ 8 ]; |
okano | 0:e13d786ba650 | 90 | char c; |
okano | 0:e13d786ba650 | 91 | |
okano | 0:e13d786ba650 | 92 | dtp = &dt; |
okano | 0:e13d786ba650 | 93 | |
okano | 0:e13d786ba650 | 94 | //#define TIME_SETTING_TEST |
okano | 0:e13d786ba650 | 95 | #ifndef TIME_SETTING_TEST |
okano | 0:e13d786ba650 | 96 | printf("Enter current date and time:\r\n"); |
okano | 0:e13d786ba650 | 97 | printf("YYYY MM DD HH MM SS[enter]\r\n"); |
okano | 0:e13d786ba650 | 98 | scanf("%d %d %d %d %d %d", &(dtp->tm_year), &(dtp->tm_mon), &(dtp->tm_mday), &(dtp->tm_hour), &(dtp->tm_min), &(dtp->tm_sec) ); |
okano | 0:e13d786ba650 | 99 | printf("%d/%d/%d - %d:%d:%d\r\n", (dtp->tm_year), (dtp->tm_mon), (dtp->tm_mday), (dtp->tm_hour), (dtp->tm_min), (dtp->tm_sec) ); |
okano | 0:e13d786ba650 | 100 | |
okano | 0:e13d786ba650 | 101 | #else |
okano | 0:e13d786ba650 | 102 | dtp->tm_year = 2010; |
okano | 0:e13d786ba650 | 103 | dtp->tm_mon = 12; |
okano | 0:e13d786ba650 | 104 | dtp->tm_mday = 31; |
okano | 0:e13d786ba650 | 105 | dtp->tm_hour = 23; |
okano | 0:e13d786ba650 | 106 | dtp->tm_min = 59; |
okano | 0:e13d786ba650 | 107 | dtp->tm_sec = 50; |
okano | 0:e13d786ba650 | 108 | |
okano | 0:e13d786ba650 | 109 | #endif |
okano | 0:e13d786ba650 | 110 | |
okano | 0:e13d786ba650 | 111 | // adjust for tm structure required values |
okano | 0:e13d786ba650 | 112 | dtp->tm_year = dtp->tm_year - 1900; |
okano | 0:e13d786ba650 | 113 | dtp->tm_mon = dtp->tm_mon - 1; |
okano | 0:e13d786ba650 | 114 | |
okano | 0:e13d786ba650 | 115 | buf[ 0 ] = Seconds; |
okano | 0:e13d786ba650 | 116 | buf[ 1 ] = i2bcd( dtp->tm_sec ); |
okano | 0:e13d786ba650 | 117 | buf[ 2 ] = i2bcd( dtp->tm_min ); |
okano | 0:e13d786ba650 | 118 | buf[ 3 ] = i2bcd( dtp->tm_hour ); |
okano | 0:e13d786ba650 | 119 | buf[ 4 ] = i2bcd( dtp->tm_mday ); |
okano | 0:e13d786ba650 | 120 | buf[ 5 ] = i2bcd( dtp->tm_wday ); |
okano | 0:e13d786ba650 | 121 | buf[ 6 ] = i2bcd( dtp->tm_mon + 1 ); |
okano | 0:e13d786ba650 | 122 | buf[ 7 ] = i2bcd( dtp->tm_year - 100 ); |
okano | 0:e13d786ba650 | 123 | |
okano | 0:e13d786ba650 | 124 | c = read_register( Seconds ); |
okano | 0:e13d786ba650 | 125 | while ( c == read_register( Seconds ) ) |
okano | 0:e13d786ba650 | 126 | ; |
okano | 0:e13d786ba650 | 127 | |
okano | 0:e13d786ba650 | 128 | i2c.write( device_address, buf, 8 ); |
okano | 0:e13d786ba650 | 129 | } |
okano | 0:e13d786ba650 | 130 | |
okano | 0:e13d786ba650 | 131 | |
okano | 0:e13d786ba650 | 132 | time_t time( time_t *tp ) { |
okano | 0:e13d786ba650 | 133 | struct tm dt, *dtp; |
okano | 0:e13d786ba650 | 134 | time_t t; |
okano | 0:e13d786ba650 | 135 | char buf[ 8 ] = { Seconds }; |
okano | 0:e13d786ba650 | 136 | |
okano | 0:e13d786ba650 | 137 | dtp = &dt; |
okano | 0:e13d786ba650 | 138 | |
okano | 0:e13d786ba650 | 139 | i2c.write( device_address, buf, 1 ); |
okano | 0:e13d786ba650 | 140 | i2c.read( device_address, buf, 7 ); |
okano | 0:e13d786ba650 | 141 | |
okano | 0:e13d786ba650 | 142 | dtp->tm_sec = bcd2i( buf[ 0 ] ); |
okano | 0:e13d786ba650 | 143 | dtp->tm_min = bcd2i( buf[ 1 ] ); |
okano | 0:e13d786ba650 | 144 | dtp->tm_hour = bcd2i( buf[ 2 ] ); |
okano | 0:e13d786ba650 | 145 | dtp->tm_mday = bcd2i( buf[ 3 ] ); |
okano | 0:e13d786ba650 | 146 | dtp->tm_wday = bcd2i( buf[ 4 ] ); |
okano | 0:e13d786ba650 | 147 | dtp->tm_mon = bcd2i( buf[ 5 ] ) - 1; |
okano | 0:e13d786ba650 | 148 | dtp->tm_year = bcd2i( buf[ 6 ] ) + 100; |
okano | 0:e13d786ba650 | 149 | |
okano | 0:e13d786ba650 | 150 | t = mktime( dtp ); |
okano | 0:e13d786ba650 | 151 | |
okano | 0:e13d786ba650 | 152 | if ( tp ) |
okano | 0:e13d786ba650 | 153 | *tp = t; |
okano | 0:e13d786ba650 | 154 | |
okano | 0:e13d786ba650 | 155 | return( t ); |
okano | 0:e13d786ba650 | 156 | } |
okano | 0:e13d786ba650 | 157 | |
okano | 0:e13d786ba650 | 158 | void set_alarm( char addr, char s ) { |
okano | 0:e13d786ba650 | 159 | char v; |
okano | 0:e13d786ba650 | 160 | |
okano | 0:e13d786ba650 | 161 | v = i2bcd( s ); |
okano | 0:e13d786ba650 | 162 | set_register( addr, v ); |
okano | 0:e13d786ba650 | 163 | } |
okano | 0:e13d786ba650 | 164 | |
okano | 0:e13d786ba650 | 165 | void clear_intr( void ) { |
okano | 0:e13d786ba650 | 166 | set_register( Control_2, 0x00 ); |
okano | 0:e13d786ba650 | 167 | } |
okano | 0:e13d786ba650 | 168 | |
okano | 0:e13d786ba650 | 169 | private: |
okano | 0:e13d786ba650 | 170 | I2C i2c; |
okano | 0:e13d786ba650 | 171 | char device_address; |
okano | 0:e13d786ba650 | 172 | |
okano | 0:e13d786ba650 | 173 | void set_register( char addr, char data ) { |
okano | 0:e13d786ba650 | 174 | char b[ 2 ]; |
okano | 0:e13d786ba650 | 175 | |
okano | 0:e13d786ba650 | 176 | b[ 0 ] = addr; |
okano | 0:e13d786ba650 | 177 | b[ 1 ] = data; |
okano | 0:e13d786ba650 | 178 | |
okano | 0:e13d786ba650 | 179 | i2c.write( device_address, b, 2 ); |
okano | 0:e13d786ba650 | 180 | } |
okano | 0:e13d786ba650 | 181 | |
okano | 0:e13d786ba650 | 182 | char read_register( char addr ) { |
okano | 0:e13d786ba650 | 183 | char data; |
okano | 0:e13d786ba650 | 184 | |
okano | 0:e13d786ba650 | 185 | data = addr; |
okano | 0:e13d786ba650 | 186 | i2c.write( device_address, &data, 1 ); |
okano | 0:e13d786ba650 | 187 | i2c.read( device_address, &data, 1 ); |
okano | 0:e13d786ba650 | 188 | |
okano | 0:e13d786ba650 | 189 | return ( data ); |
okano | 0:e13d786ba650 | 190 | } |
okano | 0:e13d786ba650 | 191 | |
okano | 0:e13d786ba650 | 192 | char i2bcd( char n ) { |
okano | 0:e13d786ba650 | 193 | return ( ((n / 10) << 4) | (n % 10) ); |
okano | 0:e13d786ba650 | 194 | } |
okano | 0:e13d786ba650 | 195 | |
okano | 0:e13d786ba650 | 196 | char bcd2i( char bcd ) { |
okano | 0:e13d786ba650 | 197 | return ( ((bcd >> 4) * 10) + (bcd & 0x0F) ); |
okano | 0:e13d786ba650 | 198 | } |
okano | 0:e13d786ba650 | 199 | } |
okano | 0:e13d786ba650 | 200 | ; |
okano | 0:e13d786ba650 | 201 | #endif // end of "#ifndef MBED_NXP_PCF2127A" |