MAXIM DS3231 accurate Real Time Clock Library

Dependents:   I2C-LCD-DHT22 wifigpslcd HomeStatus project ... more

Committer:
cromda
Date:
Sat Dec 22 19:58:42 2012 +0000
Revision:
2:6718c4fabf95
Parent:
1:84ccc64067d8
Doc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cromda 0:11dfd7ac4188 1 #include "DS3231.h"
cromda 0:11dfd7ac4188 2
cromda 0:11dfd7ac4188 3 DS3231::DS3231(PinName sda, PinName scl) : i2c(sda, scl)
cromda 0:11dfd7ac4188 4 {
cromda 0:11dfd7ac4188 5 }
cromda 0:11dfd7ac4188 6
cromda 0:11dfd7ac4188 7
cromda 0:11dfd7ac4188 8 // BCD to decimal conversion
cromda 0:11dfd7ac4188 9 int DS3231::bcd2dec(int k)
cromda 0:11dfd7ac4188 10 {return(((k&0xF0)>>4)*10+(k&0x0F));}
cromda 0:11dfd7ac4188 11
cromda 0:11dfd7ac4188 12
cromda 0:11dfd7ac4188 13 // decimal to BCD conversion
cromda 0:11dfd7ac4188 14 int DS3231::dec2bcd(int k)
cromda 0:11dfd7ac4188 15 {return((k/10)*16+(k%10));}
cromda 0:11dfd7ac4188 16
cromda 0:11dfd7ac4188 17 void DS3231::setI2Cfrequency(int frequency)
cromda 0:11dfd7ac4188 18 {i2c.frequency(frequency);
cromda 0:11dfd7ac4188 19 }
cromda 0:11dfd7ac4188 20
cromda 0:11dfd7ac4188 21 // read temperature from DS3231
cromda 0:11dfd7ac4188 22 float DS3231::readTemp()
cromda 0:11dfd7ac4188 23 {char buf[2];
cromda 0:11dfd7ac4188 24 buf[0]=DS3231_MSB_Temp;
cromda 0:11dfd7ac4188 25 int w=i2c.write(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 26 int r=i2c.read(DS3231_Address,buf,2);
cromda 0:11dfd7ac4188 27 error=((w!=0)||(r!=0));
cromda 1:84ccc64067d8 28 return(buf[0]+buf[1]/256.0);}
cromda 1:84ccc64067d8 29
cromda 1:84ccc64067d8 30 // force temperatue conversion
cromda 1:84ccc64067d8 31 void DS3231::convertTemperature()
cromda 1:84ccc64067d8 32 {int Control=readRegister(DS3231_Control)|DS3231_bit_CONV;
cromda 1:84ccc64067d8 33 writeRegister(DS3231_Control,Control);
cromda 1:84ccc64067d8 34 }
cromda 0:11dfd7ac4188 35
cromda 0:11dfd7ac4188 36 // decode time registers
cromda 0:11dfd7ac4188 37 void DS3231::decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds)
cromda 0:11dfd7ac4188 38 {*Hours=bcd2dec(regHours);
cromda 0:11dfd7ac4188 39 *Minutes=bcd2dec(regMinutes);
cromda 0:11dfd7ac4188 40 *Seconds=bcd2dec(regSeconds);
cromda 0:11dfd7ac4188 41 }
cromda 0:11dfd7ac4188 42
cromda 0:11dfd7ac4188 43
cromda 0:11dfd7ac4188 44 // read time registers dand decode them to decimal
cromda 0:11dfd7ac4188 45 void DS3231::readTime(int *hours, int *minutes, int *seconds)
cromda 0:11dfd7ac4188 46 {char buf[3];
cromda 0:11dfd7ac4188 47 buf[0]=DS3231_Seconds;
cromda 0:11dfd7ac4188 48 int w=i2c.write(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 49 int r=i2c.read(DS3231_Address,buf,3);
cromda 0:11dfd7ac4188 50 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds);
cromda 0:11dfd7ac4188 51 error=((w!=0)||(r!=0));
cromda 0:11dfd7ac4188 52 }
cromda 0:11dfd7ac4188 53
cromda 0:11dfd7ac4188 54 // set time register
cromda 0:11dfd7ac4188 55 void DS3231::setTime(int hours, int minutes, int seconds)
cromda 0:11dfd7ac4188 56 {writeRegister(DS3231_Seconds,dec2bcd(seconds));
cromda 0:11dfd7ac4188 57 writeRegister(DS3231_Minutes,dec2bcd(minutes));
cromda 0:11dfd7ac4188 58 writeRegister(DS3231_Hours,dec2bcd(hours));
cromda 0:11dfd7ac4188 59 }
cromda 0:11dfd7ac4188 60
cromda 0:11dfd7ac4188 61 // decode date registers
cromda 0:11dfd7ac4188 62 void DS3231::decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year)
cromda 0:11dfd7ac4188 63 {*date=bcd2dec(regDate);
cromda 0:11dfd7ac4188 64 int century=regMonth&128;
cromda 0:11dfd7ac4188 65 *month=bcd2dec(regMonth&127);
cromda 0:11dfd7ac4188 66 *year=bcd2dec(regYear);
cromda 0:11dfd7ac4188 67 if (century==0) // only XXth and XXIst centuries allowed
cromda 0:11dfd7ac4188 68 {*year=*year+1900;}
cromda 0:11dfd7ac4188 69 else
cromda 0:11dfd7ac4188 70 {*year=*year+2000;}
cromda 0:11dfd7ac4188 71 }
cromda 0:11dfd7ac4188 72
cromda 0:11dfd7ac4188 73 // read date registers
cromda 0:11dfd7ac4188 74 void DS3231::readDate(int *date, int *month, int *year)
cromda 0:11dfd7ac4188 75 {char buf[3];
cromda 0:11dfd7ac4188 76 buf[0]=DS3231_Date;
cromda 0:11dfd7ac4188 77 int w=i2c.write(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 78 int r=i2c.read(DS3231_Address,buf,3);
cromda 0:11dfd7ac4188 79 decodeDate(buf[0],buf[1],buf[2],date,month,year);
cromda 0:11dfd7ac4188 80 error=((w!=0)||(r!=0));
cromda 0:11dfd7ac4188 81 }
cromda 0:11dfd7ac4188 82
cromda 0:11dfd7ac4188 83 // set the date registers
cromda 0:11dfd7ac4188 84 void DS3231::setDate(int dayOfWeek, int date, int month, int year)
cromda 0:11dfd7ac4188 85 {writeRegister(DS3231_Date,dec2bcd(date));
cromda 0:11dfd7ac4188 86 writeRegister(DS3231_Day,dayOfWeek);
cromda 0:11dfd7ac4188 87 int century=0; // only XXth and XXIst centuries allowed
cromda 0:11dfd7ac4188 88 if (year<1900){year=1900;}
cromda 0:11dfd7ac4188 89 if (year>2099){year=2099;}
cromda 0:11dfd7ac4188 90 if (year<2000)
cromda 0:11dfd7ac4188 91 {year=year-1900;}
cromda 0:11dfd7ac4188 92 else
cromda 0:11dfd7ac4188 93 {year=year-2000;century=1;}
cromda 0:11dfd7ac4188 94 writeRegister(DS3231_Month_Century,dec2bcd(month)+128*century);
cromda 0:11dfd7ac4188 95 writeRegister(DS3231_Year,dec2bcd(year));
cromda 0:11dfd7ac4188 96 }
cromda 0:11dfd7ac4188 97
cromda 0:11dfd7ac4188 98 // read date and time registers
cromda 0:11dfd7ac4188 99 void DS3231::readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds)
cromda 0:11dfd7ac4188 100 {char buf[7];
cromda 0:11dfd7ac4188 101 buf[0]=DS3231_Seconds;
cromda 0:11dfd7ac4188 102 int w=i2c.write(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 103 int r=i2c.read(DS3231_Address,buf,7);
cromda 0:11dfd7ac4188 104 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds);
cromda 0:11dfd7ac4188 105 *dayOfWeek=buf[3];
cromda 0:11dfd7ac4188 106 decodeDate(buf[4],buf[5],buf[6],date,month,year);
cromda 0:11dfd7ac4188 107 error=((w!=0)||(r!=0));
cromda 0:11dfd7ac4188 108 }
cromda 0:11dfd7ac4188 109
cromda 0:11dfd7ac4188 110 // read a register
cromda 0:11dfd7ac4188 111 int DS3231::readRegister(char reg)
cromda 0:11dfd7ac4188 112 {char buf[1];
cromda 0:11dfd7ac4188 113 buf[0]=reg;
cromda 0:11dfd7ac4188 114 int w=i2c.write(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 115 int r=i2c.read(DS3231_Address,buf,1);
cromda 0:11dfd7ac4188 116 error=((w!=0)||(r!=0));
cromda 0:11dfd7ac4188 117 return(buf[0]);
cromda 0:11dfd7ac4188 118 }
cromda 0:11dfd7ac4188 119
cromda 0:11dfd7ac4188 120 // write a register
cromda 0:11dfd7ac4188 121 void DS3231::writeRegister(int reg,char byte)
cromda 0:11dfd7ac4188 122 {char buf[2];
cromda 0:11dfd7ac4188 123 buf[0]=reg;
cromda 0:11dfd7ac4188 124 buf[1]=byte;
cromda 0:11dfd7ac4188 125 int w=i2c.write(DS3231_Address,buf,2);
cromda 0:11dfd7ac4188 126 error=(w!=0);
cromda 0:11dfd7ac4188 127 }
cromda 0:11dfd7ac4188 128
cromda 0:11dfd7ac4188 129 void DS3231::eraseOSF()
cromda 0:11dfd7ac4188 130 {int reg=readRegister(DS3231_Control_Status);
cromda 0:11dfd7ac4188 131 reg=reg&0x7F;
cromda 0:11dfd7ac4188 132 writeRegister(DS3231_Control_Status,reg);
cromda 0:11dfd7ac4188 133 }
cromda 0:11dfd7ac4188 134
cromda 0:11dfd7ac4188 135 bool DS3231::OSF()
cromda 0:11dfd7ac4188 136 {int reg=readRegister(DS3231_Control_Status);
cromda 0:11dfd7ac4188 137 return(reg&DS3231_bit_OSF);
cromda 0:11dfd7ac4188 138 }