"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
- Committer:
- okano
- Date:
- 2010-06-05
- Revision:
- 0:e13d786ba650
File content as of revision 0:e13d786ba650:
/* * PCF2127A (Integrated RTC, TCXO and quartz crystal) demo * (library) * * PCF2127A is a "real time clock (RTC)" module which is including a Xtal and TCXO * http://www.nxp.com/pip/PCF2127A_2.html * * This is a just simple operation sample of the PCF2127A. * In this sample, the PCF2127A is interfaced by I2C through pin9 and 10 of mbed. * And also the mbed-pin8 is connected to RTC's /INT pin. * The RTC chip is set to generate periodical interrupt in every seconds. * This interrupt triggers the update of the terminal and LCD screen. * * RTC initializing part is ported from... * http://mbed.org/users/roen/notebook/real-time/ * * Released under the MIT License: http://mbed.org/license/mit * * revision 1.0 05-Jun-2010 (a) 1st release * revision 1.1 05-Jun-2010 (a) class name changed * */ #ifndef MBED_NXP_PCF2127A #define MBED_NXP_PCF2127A #include "mbed.h" // PCF2127A IIC address #define PCF2127A_addr 0xA2 // PCF2127A registers #define Control_1 0x00 #define Control_2 0x01 #define Control_3 0x02 #define Seconds 0x03 #define Minutes 0x04 #define Hours 0x05 #define Days 0x06 #define Weekdays 0x07 #define Months 0x08 #define Years 0x09 #define Second_alarm 0x0A #define Minute_alarm 0x0B #define Hour_alarm 0x0C #define Day_alarm 0x0D #define Weekday_alarm 0x0E #define CLKOUT_ctl 0x0F #define Watchdg_tim_ctl 0x10 #define Watchdg_tim_val 0x11 #define Timestp_ctl 0x12 #define Sec_timestp 0x13 #define Min_timestp 0x14 #define Hour_timestp 0x15 #define Day_timestp 0x16 #define Mon_timestp 0x17 #define Year_timestp 0x18 #define Aging_offset 0x19 class NXP_PCF2127A { public: NXP_PCF2127A( PinName sda, PinName sdl, char dev_address = PCF2127A_addr, char vControl_1 = 0x03, char vControl_2 = 0x00, char vControl_3 = 0x60 ) : i2c( sda, sdl ), device_address( dev_address ) { set_register( Control_1, vControl_1 ); set_register( Control_2, vControl_2 ); set_register( Control_3, vControl_3 ); } ~NXP_PCF2127A() { } int is_init_required( void ) { return ( read_register( Seconds ) & 0x80 ? 1 : 0 ); } void set_time( void ) { struct tm dt, *dtp; char buf[ 8 ]; char c; dtp = &dt; //#define TIME_SETTING_TEST #ifndef TIME_SETTING_TEST printf("Enter current date and time:\r\n"); printf("YYYY MM DD HH MM SS[enter]\r\n"); 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) ); 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) ); #else dtp->tm_year = 2010; dtp->tm_mon = 12; dtp->tm_mday = 31; dtp->tm_hour = 23; dtp->tm_min = 59; dtp->tm_sec = 50; #endif // adjust for tm structure required values dtp->tm_year = dtp->tm_year - 1900; dtp->tm_mon = dtp->tm_mon - 1; buf[ 0 ] = Seconds; buf[ 1 ] = i2bcd( dtp->tm_sec ); buf[ 2 ] = i2bcd( dtp->tm_min ); buf[ 3 ] = i2bcd( dtp->tm_hour ); buf[ 4 ] = i2bcd( dtp->tm_mday ); buf[ 5 ] = i2bcd( dtp->tm_wday ); buf[ 6 ] = i2bcd( dtp->tm_mon + 1 ); buf[ 7 ] = i2bcd( dtp->tm_year - 100 ); c = read_register( Seconds ); while ( c == read_register( Seconds ) ) ; i2c.write( device_address, buf, 8 ); } time_t time( time_t *tp ) { struct tm dt, *dtp; time_t t; char buf[ 8 ] = { Seconds }; dtp = &dt; i2c.write( device_address, buf, 1 ); i2c.read( device_address, buf, 7 ); dtp->tm_sec = bcd2i( buf[ 0 ] ); dtp->tm_min = bcd2i( buf[ 1 ] ); dtp->tm_hour = bcd2i( buf[ 2 ] ); dtp->tm_mday = bcd2i( buf[ 3 ] ); dtp->tm_wday = bcd2i( buf[ 4 ] ); dtp->tm_mon = bcd2i( buf[ 5 ] ) - 1; dtp->tm_year = bcd2i( buf[ 6 ] ) + 100; t = mktime( dtp ); if ( tp ) *tp = t; return( t ); } void set_alarm( char addr, char s ) { char v; v = i2bcd( s ); set_register( addr, v ); } void clear_intr( void ) { set_register( Control_2, 0x00 ); } private: I2C i2c; char device_address; void set_register( char addr, char data ) { char b[ 2 ]; b[ 0 ] = addr; b[ 1 ] = data; i2c.write( device_address, b, 2 ); } char read_register( char addr ) { char data; data = addr; i2c.write( device_address, &data, 1 ); i2c.read( device_address, &data, 1 ); return ( data ); } char i2bcd( char n ) { return ( ((n / 10) << 4) | (n % 10) ); } char bcd2i( char bcd ) { return ( ((bcd >> 4) * 10) + (bcd & 0x0F) ); } } ; #endif // end of "#ifndef MBED_NXP_PCF2127A"