DS3231

Dependents:   LoRa_Access_Point

Committer:
lukas_formanek
Date:
Thu Mar 28 09:55:44 2019 +0000
Revision:
15:bf11392ccaea
Child:
16:610f7091e0ac
28.3.2019 working SD,RTC

Who changed what in which revision?

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