"PCF2127A" : RTC chip with TCXO and quartz crystal demo Please refer >> http://mbed.org/users/okano/notebook/nxp_pcf2172a-demo-code/

Dependencies:   mbed

Information

Latest version is available on components page.

Committer:
okano
Date:
Sat Jun 05 02:18:50 2010 +0000
Revision:
0:e13d786ba650

        

Who changed what in which revision?

UserRevisionLine numberNew 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"