DS3231 driver with timestamp string function

Dependents:   swimate_v2

Fork of DS3231 by Robert Fischer

Committer:
paulbartell
Date:
Wed May 28 22:56:11 2014 +0000
Revision:
5:71aad49938bc
Parent:
4:b5736355af3a
minor changes to loss of power detection;

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