MAXIM DS3231 accurate Real Time Clock Library
Fork of DS3231 by
DS3231.h
- Committer:
- cromda
- Date:
- 2012-12-22
- Revision:
- 1:84ccc64067d8
- Parent:
- 0:11dfd7ac4188
- Child:
- 2:6718c4fabf95
File content as of revision 1:84ccc64067d8:
/** mbded library for driving the PMAXIM DS3231 Real Time Clock * datasheet link : http://datasheets.maximintegrated.com/en/ds/DS3231.pdf * breakout : MACETECH ChronoDot V2.1 High Precision RTC * remi cormier 2012 * WARNING : sda and sdl should be pulled up with 2.2k resistor */ /** Example code * @code // DS3231 Library test program // remi cormier 2012 #include "mbed.h" #include "DS3231.h" Serial pc(USBTX, USBRX); int hour; int minute; int second; int dayOfWeek; int date; int month; int year; DS3231 RTC(p28,p27); int main() {printf("\r\n\nDS3231 Library test program\r\nremi cormier 2012\r\n\n"); RTC.setI2Cfrequency(400000); //RTC.writeRegister(DS3231_Aging_Offset,0); // uncomment to set Aging Offset 1LSB = approx. 0.1 ppm according from datasheet = 0.05 ppm @ 21 °C from my measurments int reg=RTC.readRegister(DS3231_Aging_Offset); if (reg>127) {reg=reg-256;} pc.printf("Aging offset : %i\r\n",reg); pc.printf("OSF flag : %i",RTC.OSF()); pc.printf("\r\n"); RTC.readDate(&date,&month,&year); pc.printf("date : %02i-%02i-%02i",date,month,year); pc.printf("\r\n"); //RTC.setTime(19,48,45); // uncomment to set time RTC.readTime(&hour,&minute,&second); pc.printf("time : %02i:%02i:%02i",hour,minute,second); pc.printf("\r\n"); //RTC.setDate(6,22,12,2012); // uncomment to set date RTC.readDateTime(&dayOfWeek,&date,&month,&year,&hour,&minute,&second); pc.printf("date time : %i / %02i-%02i-%02i %02i:%02i:%02i",dayOfWeek,date,month,year,hour,minute,second); pc.printf("\r\n"); pc.printf("temperature :%6.2f",RTC.readTemp()); pc.printf("\r\n"); } * @endcode */ #include "mbed.h" #ifndef MBED_DS3231_H #define MBED_DS3231_H //DS3231 8 bit adress #define DS3231_Address 0xD0 //DS3231 registers #define DS3231_Seconds 0x00 #define DS3231_Minutes 0x01 #define DS3231_Hours 0x02 // DS3231 Hours bits #define DS3231_bit_AM_PM 0x20 #define DS3231_bit_12_24 0x40 #define DS3231_Day 0x03 #define DS3231_Date 0x04 #define DS3231_Month_Century 0x05 #define DS3231_Year 0x06 #define DS3231_Alarm1_Seconds 0x07 #define DS3231_Alarm1_Minutes 0x08 #define DS3231_Alarm1_Hours 0x09 #define DS3231_Alarm1_Day_Date 0x0A #define DS3231_Alarm2_Minutes 0x0B #define DS3231_Alarm2_Hours 0x0C #define DS3231_Alarm_2_Day_Date 0x0D #define DS3231_Control 0x0E // DS3231 Control bits #define DS3231_bit_A1IE 1 #define DS3231_bit_A2IE 2 #define DS3231_bit_INTCN 4 #define DS3231_bit_SQW_1Hz 0 #define DS3231_bit_SQW_1024Hz 8 #define DS3231_bit_SQW_4096Hz 16 #define DS3231_bit_SQW_8192Hz 24 #define DS3231_bit_CONV 32 #define DS3231_bit_BBSQW 64 #define DS3231_bit_EOSCb 128 #define DS3231_Control_Status 0x0F // DS3231 Control/Status bits #define DS3231_bit_BSY 0x04 #define DS3231_bit_EN32kHz 0x08 #define DS3231_bit_OSF 0x80 #define DS3231_Aging_Offset 0x10 #define DS3231_MSB_Temp 0x11 #define DS3231_LSB_Temp 0x12 /* Interface to MAXIM DS3231 RTC */ class DS3231 {public : /** Create an instance of the DS3231 connected to specfied I2C pins * * @param sda The I2C data pin * @param scl The I2C clock pin */ DS3231(PinName sda, PinName scl); /** set I2C bus speed * @param frequency : I2C clocl frequenct (Hz) */ void setI2Cfrequency(int frequency); /** Read the temperature * * @return The temperature */ float readTemp(); /** Read the time registers * @param hours * @param minutes * @param seconds */ void readTime(int *hours, int *minutes, int *seconds); /** force temperature conversion * */ void convertTemperature(); /** Set the time registers * @param hours * @param minutes * @param seconds */ void setTime(int hours, int minutes, int seconds); /** Read the date registers * @param date * @param month * @param year */ void readDate(int *date, int *month, int *year); /** Set the date registers * @param dayOfWeek : day of week * @param date * @param month * @param year */ void setDate(int dayOfWeek, int date, int month, int year); /** Read the date and time registers * @param dayOfWeek : day of week * @param date * @param month * @param year * @param hours * @param minutes * @param seconds */ void readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds); /** Read a register * @param reg : register address * @return The register content */ int readRegister(char reg); /** Write to a register * @param reg : register address * @param The register content */ void writeRegister(int reg,char byte); /** set OSF (Oscillator Stop Flag) bit to 0 in Control Status register * should be done just after power up DS3231 * OSF bit is automaticaly set to 1 when on power up or when the DS3231 oscillator stops */ void eraseOSF(); /** Return OSF bit. If true the oscillator stopped or the DS3231 just powered up * @return The OSF bit */ bool OSF(); bool error; private : I2C i2c; int bcd2dec(int k); // bcd to decimal conversion int dec2bcd(int k); // decimal to bcd conversion void decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds); void decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year); }; #endif