CSE477 / DS3231

Dependents:   swimate_v2

Fork of DS3231 by Robert Fischer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DS3231.cpp Source File

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 }