Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DS3231 by
DS3231.cpp
00001 #include "DS3231.h" 00002 00003 DS3231::DS3231(PinName sda, PinName scl) : i2c(sda, scl) 00004 { 00005 00006 powerFailure = OSF(); 00007 00008 } 00009 00010 00011 // BCD to decimal conversion 00012 int DS3231::bcd2dec(int k) 00013 {return(((k&0xF0)>>4)*10+(k&0x0F));} 00014 00015 00016 // decimal to BCD conversion 00017 int DS3231::dec2bcd(int k) 00018 {return((k/10)*16+(k%10));} 00019 00020 void DS3231::setI2Cfrequency(int frequency) 00021 {i2c.frequency(frequency); 00022 } 00023 00024 // read temperature from DS3231 00025 float DS3231::readTemp() 00026 {char buf[2]; 00027 buf[0]=DS3231_MSB_Temp; 00028 int w=i2c.write(DS3231_Address,buf,1); 00029 int r=i2c.read(DS3231_Address,buf,2); 00030 error=((w!=0)||(r!=0)); 00031 return(buf[0]+buf[1]/256.0);} 00032 00033 // force temperatue conversion 00034 void DS3231::convertTemperature() 00035 {int Control=readRegister(DS3231_Control)|DS3231_bit_CONV; 00036 writeRegister(DS3231_Control,Control); 00037 } 00038 00039 // decode time registers 00040 void DS3231::decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds) 00041 {*Hours=bcd2dec(regHours); 00042 *Minutes=bcd2dec(regMinutes); 00043 *Seconds=bcd2dec(regSeconds); 00044 } 00045 00046 00047 // read time registers dand decode them to decimal 00048 void DS3231::readTime(int *hours, int *minutes, int *seconds) 00049 {char buf[3]; 00050 buf[0]=DS3231_Seconds; 00051 int w=i2c.write(DS3231_Address,buf,1); 00052 int r=i2c.read(DS3231_Address,buf,3); 00053 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds); 00054 error=((w!=0)||(r!=0)); 00055 } 00056 00057 // set time register 00058 void DS3231::setTime(int hours, int minutes, int seconds) 00059 {writeRegister(DS3231_Seconds,dec2bcd(seconds)); 00060 writeRegister(DS3231_Minutes,dec2bcd(minutes)); 00061 writeRegister(DS3231_Hours,dec2bcd(hours)); 00062 } 00063 00064 // decode date registers 00065 void DS3231::decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year) 00066 {*date=bcd2dec(regDate); 00067 int century=regMonth&128; 00068 *month=bcd2dec(regMonth&127); 00069 *year=bcd2dec(regYear); 00070 if (century==0) // only XXth and XXIst centuries allowed 00071 {*year=*year+1900;} 00072 else 00073 {*year=*year+2000;} 00074 } 00075 00076 // read date registers 00077 void DS3231::readDate(int *date, int *month, int *year) 00078 {char buf[3]; 00079 buf[0]=DS3231_Date; 00080 int w=i2c.write(DS3231_Address,buf,1); 00081 int r=i2c.read(DS3231_Address,buf,3); 00082 decodeDate(buf[0],buf[1],buf[2],date,month,year); 00083 error=((w!=0)||(r!=0)); 00084 } 00085 00086 // set the date registers 00087 void DS3231::setDate(int dayOfWeek, int date, int month, int year) 00088 {writeRegister(DS3231_Date,dec2bcd(date)); 00089 writeRegister(DS3231_Day,dayOfWeek); 00090 int century=0; // only XXth and XXIst centuries allowed 00091 if (year<1900){year=1900;} 00092 if (year>2099){year=2099;} 00093 if (year<2000) 00094 {year=year-1900;} 00095 else 00096 {year=year-2000;century=1;} 00097 writeRegister(DS3231_Month_Century,dec2bcd(month)+128*century); 00098 writeRegister(DS3231_Year,dec2bcd(year)); 00099 } 00100 00101 char* DS3231::getTimestamp() 00102 { 00103 00104 int dayOfWeek, date, month, year, hours, minutes, seconds; 00105 readDateTime(&dayOfWeek, &date, &month, &year, &hours, &minutes, &seconds); 00106 sprintf(charbuf, "%04d-%02d-%02d %02d:%02d:%02d",year,month,date,hours,minutes,seconds); 00107 return charbuf; 00108 00109 } 00110 // read date and time registers 00111 void DS3231::readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds) 00112 {char buf[7]; 00113 buf[0]=DS3231_Seconds; 00114 int w=i2c.write(DS3231_Address,buf,1); 00115 int r=i2c.read(DS3231_Address,buf,7); 00116 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds); 00117 *dayOfWeek=buf[3]; 00118 decodeDate(buf[4],buf[5],buf[6],date,month,year); 00119 error=((w!=0)||(r!=0)); 00120 } 00121 00122 // read a register 00123 int DS3231::readRegister(char reg) 00124 {char buf[1]; 00125 buf[0]=reg; 00126 int w=i2c.write(DS3231_Address,buf,1); 00127 int r=i2c.read(DS3231_Address,buf,1); 00128 error=((w!=0)||(r!=0)); 00129 return(buf[0]); 00130 } 00131 00132 // write a register 00133 void DS3231::writeRegister(int reg,char byte) 00134 {char buf[2]; 00135 buf[0]=reg; 00136 buf[1]=byte; 00137 int w=i2c.write(DS3231_Address,buf,2); 00138 error=(w!=0); 00139 } 00140 00141 void DS3231::eraseOSF() 00142 {int reg=readRegister(DS3231_Control_Status); 00143 reg=reg&0x7F; 00144 writeRegister(DS3231_Control_Status,reg); 00145 powerFailure = false; 00146 } 00147 00148 bool DS3231::OSF() 00149 {int reg=readRegister(DS3231_Control_Status); 00150 return(reg&DS3231_bit_OSF); 00151 } 00152 00153 bool DS3231::checkClockIntegrity() 00154 { 00155 return !powerFailure; 00156 }
Generated on Fri Aug 5 2022 13:32:17 by
1.7.2
