DS3231 driver with timestamp string function
Fork of DS3231 by
DS3231.cpp@5:71aad49938bc, 2014-05-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |