Library to make use of the DS1302 timekeeping IC. The functions are identical to those used by the mbed RTC's

Dependents:   temp_humid_time_DS1302_LM35_DHT11 temp_humid_light_time_DS1302_LM35_DHT11_LDR DSKY DS1302_HelloWorld ... more

HelloWorld program: https://mbed.org/users/Sissors/code/DS1302_HelloWorld/

For usage of the returned UNIX time code, see for example https://mbed.org/handbook/Time, http://www.cplusplus.com/reference/ctime/strftime/?kw=strftime and http://mbed.org/handbook/Time?action=view&revision=11592

Committer:
Sissors
Date:
Mon Mar 31 20:53:13 2014 +0000
Revision:
0:c7cea2a415c3
v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:c7cea2a415c3 1 #include "DS1302.h"
Sissors 0:c7cea2a415c3 2
Sissors 0:c7cea2a415c3 3 DS1302::DS1302(PinName SCLK, PinName IO, PinName CE) : _SCLK(SCLK), _IO(IO), _CE(CE)
Sissors 0:c7cea2a415c3 4 {
Sissors 0:c7cea2a415c3 5 _CE = 0;
Sissors 0:c7cea2a415c3 6 _SCLK = 0;
Sissors 0:c7cea2a415c3 7 _IO.input();
Sissors 0:c7cea2a415c3 8 writeProtect = true;
Sissors 0:c7cea2a415c3 9 }
Sissors 0:c7cea2a415c3 10
Sissors 0:c7cea2a415c3 11 void DS1302::set_time(time_t t)
Sissors 0:c7cea2a415c3 12 {
Sissors 0:c7cea2a415c3 13 struct tm *_t = localtime(&t);
Sissors 0:c7cea2a415c3 14 writeReg(Seconds, (_t->tm_sec % 10) + ((_t->tm_sec / 10) << 4));
Sissors 0:c7cea2a415c3 15 writeReg(Minutes, (_t->tm_min % 10) + ((_t->tm_min / 10) << 4));
Sissors 0:c7cea2a415c3 16 writeReg(Hours, (_t->tm_hour % 10) + ((_t->tm_hour / 10) << 4));
Sissors 0:c7cea2a415c3 17 writeReg(Dates, (_t->tm_mday % 10) + ((_t->tm_mday / 10) << 4));
Sissors 0:c7cea2a415c3 18 writeReg(Months, ((_t->tm_mon + 1) % 10) + (((_t->tm_mon + 1) / 10) << 4));
Sissors 0:c7cea2a415c3 19 writeReg(Days, _t->tm_wday + 1);
Sissors 0:c7cea2a415c3 20 writeReg(Years, ((_t->tm_year - 100) % 10) + (((_t->tm_year - 100) / 10) << 4));
Sissors 0:c7cea2a415c3 21 }
Sissors 0:c7cea2a415c3 22
Sissors 0:c7cea2a415c3 23 time_t DS1302::time(time_t *t)
Sissors 0:c7cea2a415c3 24 {
Sissors 0:c7cea2a415c3 25 char regs[7];
Sissors 0:c7cea2a415c3 26 _CE = 1;
Sissors 0:c7cea2a415c3 27 wait_us(4);
Sissors 0:c7cea2a415c3 28 writeByte(ClockBurst | 1);
Sissors 0:c7cea2a415c3 29 for (int i = 0; i<7; i++)
Sissors 0:c7cea2a415c3 30 regs[i] = readByte();
Sissors 0:c7cea2a415c3 31 _CE = 0;
Sissors 0:c7cea2a415c3 32
Sissors 0:c7cea2a415c3 33 struct tm _t;
Sissors 0:c7cea2a415c3 34 _t.tm_sec = (regs[0] & 0xF) + (regs[0] >> 4) * 10;
Sissors 0:c7cea2a415c3 35 _t.tm_min = (regs[1] & 0xF) + (regs[1] >> 4) * 10;
Sissors 0:c7cea2a415c3 36 _t.tm_hour = (regs[2] & 0xF) + (regs[2] >> 4) * 10;
Sissors 0:c7cea2a415c3 37 _t.tm_mday = (regs[3] & 0xF) + (regs[3] >> 4) * 10;
Sissors 0:c7cea2a415c3 38 _t.tm_mon = (regs[4] & 0xF) + (regs[4] >> 4) * 10 - 1;
Sissors 0:c7cea2a415c3 39 _t.tm_year = (regs[6] & 0xF) + (regs[6] >> 4) * 10 + 100;
Sissors 0:c7cea2a415c3 40
Sissors 0:c7cea2a415c3 41 // convert to timestamp and display (1256729737)
Sissors 0:c7cea2a415c3 42 return mktime(&_t);
Sissors 0:c7cea2a415c3 43 }
Sissors 0:c7cea2a415c3 44
Sissors 0:c7cea2a415c3 45 void DS1302::storeByte(char address, char data)
Sissors 0:c7cea2a415c3 46 {
Sissors 0:c7cea2a415c3 47 if (address > 30)
Sissors 0:c7cea2a415c3 48 return;
Sissors 0:c7cea2a415c3 49 char command = RAMBase + (address << 1);
Sissors 0:c7cea2a415c3 50 writeReg(command, data);
Sissors 0:c7cea2a415c3 51 }
Sissors 0:c7cea2a415c3 52
Sissors 0:c7cea2a415c3 53 char DS1302::recallByte(char address)
Sissors 0:c7cea2a415c3 54 {
Sissors 0:c7cea2a415c3 55 if (address > 30)
Sissors 0:c7cea2a415c3 56 return 0;
Sissors 0:c7cea2a415c3 57 char command = RAMBase + (address << 1) + 1;
Sissors 0:c7cea2a415c3 58 return readReg(command);
Sissors 0:c7cea2a415c3 59 }
Sissors 0:c7cea2a415c3 60
Sissors 0:c7cea2a415c3 61 char DS1302::readReg(char reg)
Sissors 0:c7cea2a415c3 62 {
Sissors 0:c7cea2a415c3 63 char retval;
Sissors 0:c7cea2a415c3 64
Sissors 0:c7cea2a415c3 65 _CE = 1;
Sissors 0:c7cea2a415c3 66 wait_us(4);
Sissors 0:c7cea2a415c3 67 writeByte(reg);
Sissors 0:c7cea2a415c3 68 retval = readByte();
Sissors 0:c7cea2a415c3 69 wait_us(4);
Sissors 0:c7cea2a415c3 70 _CE = 0;
Sissors 0:c7cea2a415c3 71 return retval;
Sissors 0:c7cea2a415c3 72 }
Sissors 0:c7cea2a415c3 73
Sissors 0:c7cea2a415c3 74 void DS1302::writeReg(char reg, char val)
Sissors 0:c7cea2a415c3 75 {
Sissors 0:c7cea2a415c3 76 if (writeProtect) {
Sissors 0:c7cea2a415c3 77 writeProtect = false;
Sissors 0:c7cea2a415c3 78 writeReg(WriteProtect, 0);
Sissors 0:c7cea2a415c3 79 }
Sissors 0:c7cea2a415c3 80 _CE = 1;
Sissors 0:c7cea2a415c3 81 wait_us(4);
Sissors 0:c7cea2a415c3 82 writeByte(reg);
Sissors 0:c7cea2a415c3 83 writeByte(val);
Sissors 0:c7cea2a415c3 84 wait_us(4);
Sissors 0:c7cea2a415c3 85 _CE = 0;
Sissors 0:c7cea2a415c3 86 }
Sissors 0:c7cea2a415c3 87
Sissors 0:c7cea2a415c3 88
Sissors 0:c7cea2a415c3 89 /*********************PRIVATE***********************/
Sissors 0:c7cea2a415c3 90 void DS1302::writeByte(char data)
Sissors 0:c7cea2a415c3 91 {
Sissors 0:c7cea2a415c3 92 _IO.output();
Sissors 0:c7cea2a415c3 93 for (int i = 0; i<8; i++) {
Sissors 0:c7cea2a415c3 94 _IO = data & 0x01;
Sissors 0:c7cea2a415c3 95 wait_us(1);
Sissors 0:c7cea2a415c3 96 _SCLK = 1;
Sissors 0:c7cea2a415c3 97 wait_us(1);
Sissors 0:c7cea2a415c3 98 _SCLK = 0;
Sissors 0:c7cea2a415c3 99 data >>= 1;
Sissors 0:c7cea2a415c3 100 }
Sissors 0:c7cea2a415c3 101 _IO.input();
Sissors 0:c7cea2a415c3 102 }
Sissors 0:c7cea2a415c3 103
Sissors 0:c7cea2a415c3 104 char DS1302::readByte(void)
Sissors 0:c7cea2a415c3 105 {
Sissors 0:c7cea2a415c3 106 char retval = 0;
Sissors 0:c7cea2a415c3 107
Sissors 0:c7cea2a415c3 108 _IO.input();
Sissors 0:c7cea2a415c3 109 for (int i = 0; i<8; i++) {
Sissors 0:c7cea2a415c3 110 retval |= _IO << i;
Sissors 0:c7cea2a415c3 111 wait_us(1);
Sissors 0:c7cea2a415c3 112 _SCLK = 1;
Sissors 0:c7cea2a415c3 113 wait_us(1);
Sissors 0:c7cea2a415c3 114 _SCLK = 0;
Sissors 0:c7cea2a415c3 115 }
Sissors 0:c7cea2a415c3 116 return retval;
Sissors 0:c7cea2a415c3 117 }