MAXIM DS3231 accurate Real Time Clock Library
Fork of DS3231 by
Diff: DS3231.cpp
- Revision:
- 3:1af2ff7cfe26
- Parent:
- 2:6718c4fabf95
--- a/DS3231.cpp Sat Dec 22 19:58:42 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -#include "DS3231.h" - -DS3231::DS3231(PinName sda, PinName scl) : i2c(sda, scl) - { - } - - -// BCD to decimal conversion -int DS3231::bcd2dec(int k) - {return(((k&0xF0)>>4)*10+(k&0x0F));} - - -// decimal to BCD conversion -int DS3231::dec2bcd(int k) - {return((k/10)*16+(k%10));} - -void DS3231::setI2Cfrequency(int frequency) - {i2c.frequency(frequency); - } - -// read temperature from DS3231 -float DS3231::readTemp() - {char buf[2]; - buf[0]=DS3231_MSB_Temp; - int w=i2c.write(DS3231_Address,buf,1); - int r=i2c.read(DS3231_Address,buf,2); - error=((w!=0)||(r!=0)); - return(buf[0]+buf[1]/256.0);} - -// force temperatue conversion -void DS3231::convertTemperature() - {int Control=readRegister(DS3231_Control)|DS3231_bit_CONV; - writeRegister(DS3231_Control,Control); - } - -// decode time registers -void DS3231::decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds) - {*Hours=bcd2dec(regHours); - *Minutes=bcd2dec(regMinutes); - *Seconds=bcd2dec(regSeconds); - } - - -// read time registers dand decode them to decimal -void DS3231::readTime(int *hours, int *minutes, int *seconds) - {char buf[3]; - buf[0]=DS3231_Seconds; - int w=i2c.write(DS3231_Address,buf,1); - int r=i2c.read(DS3231_Address,buf,3); - decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds); - error=((w!=0)||(r!=0)); - } - -// set time register -void DS3231::setTime(int hours, int minutes, int seconds) - {writeRegister(DS3231_Seconds,dec2bcd(seconds)); - writeRegister(DS3231_Minutes,dec2bcd(minutes)); - writeRegister(DS3231_Hours,dec2bcd(hours)); - } - -// decode date registers -void DS3231::decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year) - {*date=bcd2dec(regDate); - int century=regMonth&128; - *month=bcd2dec(regMonth&127); - *year=bcd2dec(regYear); - if (century==0) // only XXth and XXIst centuries allowed - {*year=*year+1900;} - else - {*year=*year+2000;} - } - -// read date registers -void DS3231::readDate(int *date, int *month, int *year) - {char buf[3]; - buf[0]=DS3231_Date; - int w=i2c.write(DS3231_Address,buf,1); - int r=i2c.read(DS3231_Address,buf,3); - decodeDate(buf[0],buf[1],buf[2],date,month,year); - error=((w!=0)||(r!=0)); - } - -// set the date registers -void DS3231::setDate(int dayOfWeek, int date, int month, int year) - {writeRegister(DS3231_Date,dec2bcd(date)); - writeRegister(DS3231_Day,dayOfWeek); - int century=0; // only XXth and XXIst centuries allowed - if (year<1900){year=1900;} - if (year>2099){year=2099;} - if (year<2000) - {year=year-1900;} - else - {year=year-2000;century=1;} - writeRegister(DS3231_Month_Century,dec2bcd(month)+128*century); - writeRegister(DS3231_Year,dec2bcd(year)); - } - -// read date and time registers -void DS3231::readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds) - {char buf[7]; - buf[0]=DS3231_Seconds; - int w=i2c.write(DS3231_Address,buf,1); - int r=i2c.read(DS3231_Address,buf,7); - decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds); - *dayOfWeek=buf[3]; - decodeDate(buf[4],buf[5],buf[6],date,month,year); - error=((w!=0)||(r!=0)); - } - -// read a register -int DS3231::readRegister(char reg) - {char buf[1]; - buf[0]=reg; - int w=i2c.write(DS3231_Address,buf,1); - int r=i2c.read(DS3231_Address,buf,1); - error=((w!=0)||(r!=0)); - return(buf[0]); - } - -// write a register -void DS3231::writeRegister(int reg,char byte) - {char buf[2]; - buf[0]=reg; - buf[1]=byte; - int w=i2c.write(DS3231_Address,buf,2); - error=(w!=0); - } - -void DS3231::eraseOSF() - {int reg=readRegister(DS3231_Control_Status); - reg=reg&0x7F; - writeRegister(DS3231_Control_Status,reg); - } - -bool DS3231::OSF() - {int reg=readRegister(DS3231_Control_Status); - return(reg&DS3231_bit_OSF); - } \ No newline at end of file