Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of RTC-DS1307 by
Rtc_Ds1307.cpp@3:e89d63f3342e, 2013-06-23 (annotated)
- Committer:
- leihen
- Date:
- Sun Jun 23 11:26:26 2013 +0000
- Revision:
- 3:e89d63f3342e
- Parent:
- 2:ee81f2c5a706
- Child:
- 4:d2cc690aaac7
Working Revision.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leihen | 0:3940f0ad2ca5 | 1 | /* Rtc_Ds1307.cpp */ |
leihen | 0:3940f0ad2ca5 | 2 | |
leihen | 0:3940f0ad2ca5 | 3 | #include "Rtc_Ds1307.h" |
leihen | 3:e89d63f3342e | 4 | #define DEBUG |
leihen | 3:e89d63f3342e | 5 | #include "debug.h" |
leihen | 0:3940f0ad2ca5 | 6 | |
leihen | 1:64274190e842 | 7 | const char *Rtc_Ds1307::m_weekDays[] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" }; |
leihen | 0:3940f0ad2ca5 | 8 | |
leihen | 0:3940f0ad2ca5 | 9 | |
leihen | 0:3940f0ad2ca5 | 10 | Rtc_Ds1307::Rtc_Ds1307(PinName sda, PinName scl) |
leihen | 0:3940f0ad2ca5 | 11 | { |
leihen | 0:3940f0ad2ca5 | 12 | // Create a new I2C object |
leihen | 0:3940f0ad2ca5 | 13 | m_rtc = new I2C(sda, scl); |
leihen | 0:3940f0ad2ca5 | 14 | if (m_rtc == NULL) |
leihen | 0:3940f0ad2ca5 | 15 | error("Rtc_Ds1307"); |
leihen | 1:64274190e842 | 16 | |
leihen | 1:64274190e842 | 17 | // Set the frequency to standard 100kHz |
leihen | 1:64274190e842 | 18 | m_rtc->frequency(100000); |
leihen | 0:3940f0ad2ca5 | 19 | } |
leihen | 0:3940f0ad2ca5 | 20 | |
leihen | 0:3940f0ad2ca5 | 21 | Rtc_Ds1307::~Rtc_Ds1307() |
leihen | 0:3940f0ad2ca5 | 22 | { |
leihen | 0:3940f0ad2ca5 | 23 | if (m_rtc != NULL) |
leihen | 0:3940f0ad2ca5 | 24 | delete m_rtc; |
leihen | 0:3940f0ad2ca5 | 25 | } |
leihen | 0:3940f0ad2ca5 | 26 | |
leihen | 1:64274190e842 | 27 | bool Rtc_Ds1307::setTime(Time& time, bool start, bool thm) |
leihen | 0:3940f0ad2ca5 | 28 | { |
leihen | 2:ee81f2c5a706 | 29 | char buffer[7]; |
leihen | 2:ee81f2c5a706 | 30 | INFO("reading clock registers to write the new time : %d:%d:%d\n", time.hour, time.min, time.sec); |
leihen | 2:ee81f2c5a706 | 31 | if (!read(0,buffer,7)) { |
leihen | 2:ee81f2c5a706 | 32 | ERR("Failed to read from RTC\n"); |
leihen | 2:ee81f2c5a706 | 33 | return false; |
leihen | 2:ee81f2c5a706 | 34 | } |
leihen | 2:ee81f2c5a706 | 35 | // Now update only the time part (saving the existing flags) |
leihen | 2:ee81f2c5a706 | 36 | if (start) { buffer[0] &= 0x7F; } else { buffer[0] |= 0x80; } |
leihen | 2:ee81f2c5a706 | 37 | buffer[0] = (buffer[0]&0x80) | (decimalToBcd(time.sec)& 0x7f); |
leihen | 2:ee81f2c5a706 | 38 | buffer[1] = decimalToBcd(time.min); |
leihen | 2:ee81f2c5a706 | 39 | if (thm) { |
leihen | 2:ee81f2c5a706 | 40 | // AM PM format |
leihen | 2:ee81f2c5a706 | 41 | buffer[2] = (buffer[2]& 196) | (time.hour>12 ? (0x20 | ((decimalToBcd(time.hour-12)))) : decimalToBcd(time.hour)); |
leihen | 2:ee81f2c5a706 | 42 | } |
leihen | 2:ee81f2c5a706 | 43 | else { |
leihen | 2:ee81f2c5a706 | 44 | // 24 hours format |
leihen | 2:ee81f2c5a706 | 45 | buffer[2] = (buffer[2]& 196) | (decimalToBcd(time.hour) & 0x3F); |
leihen | 2:ee81f2c5a706 | 46 | } |
leihen | 2:ee81f2c5a706 | 47 | buffer[3] = time.wday; |
leihen | 2:ee81f2c5a706 | 48 | buffer[4] = decimalToBcd(time.date); |
leihen | 2:ee81f2c5a706 | 49 | buffer[5] = decimalToBcd(time.mon); |
leihen | 2:ee81f2c5a706 | 50 | buffer[6] = decimalToBcd(time.year-2000); |
leihen | 2:ee81f2c5a706 | 51 | INFO("Writing new time and date data to RTC\n"); |
leihen | 2:ee81f2c5a706 | 52 | if (!write(0, buffer, 7) ) { |
leihen | 2:ee81f2c5a706 | 53 | ERR("Failed to write the data to RTC!\n"); |
leihen | 2:ee81f2c5a706 | 54 | return false; |
leihen | 2:ee81f2c5a706 | 55 | } |
leihen | 0:3940f0ad2ca5 | 56 | return true; |
leihen | 0:3940f0ad2ca5 | 57 | } |
leihen | 0:3940f0ad2ca5 | 58 | |
leihen | 1:64274190e842 | 59 | bool Rtc_Ds1307::getTime(Time& time) |
leihen | 0:3940f0ad2ca5 | 60 | { |
leihen | 1:64274190e842 | 61 | char buffer[7]; |
leihen | 1:64274190e842 | 62 | bool thm = false; |
leihen | 1:64274190e842 | 63 | |
leihen | 1:64274190e842 | 64 | INFO("Getting time from RTC\n"); |
leihen | 2:ee81f2c5a706 | 65 | if (!read(0, buffer, 7) ) { |
leihen | 1:64274190e842 | 66 | // Failed to read |
leihen | 1:64274190e842 | 67 | ERR("Failed to read from RTC\n"); |
leihen | 1:64274190e842 | 68 | return false; |
leihen | 1:64274190e842 | 69 | } |
leihen | 1:64274190e842 | 70 | thm = ((buffer[2] & 64) == 64); |
leihen | 1:64274190e842 | 71 | time.sec = bcdToDecimal(buffer[0]&0x7F); |
leihen | 1:64274190e842 | 72 | time.min = bcdToDecimal(buffer[1]); |
leihen | 1:64274190e842 | 73 | if (thm) { |
leihen | 1:64274190e842 | 74 | // in 12-hour-mode, we need to add 12 hours if PM bit is set |
leihen | 1:64274190e842 | 75 | time.hour = Rtc_Ds1307::bcdToDecimal( buffer[2] & 31 ); |
leihen | 1:64274190e842 | 76 | if ((buffer[2] & 32) == 32) |
leihen | 1:64274190e842 | 77 | time.hour += 12; |
leihen | 1:64274190e842 | 78 | } |
leihen | 1:64274190e842 | 79 | else { |
leihen | 1:64274190e842 | 80 | time.hour = Rtc_Ds1307::bcdToDecimal( buffer[2] & 63 ); |
leihen | 1:64274190e842 | 81 | } |
leihen | 1:64274190e842 | 82 | time.wday = buffer[3]; |
leihen | 1:64274190e842 | 83 | time.date = Rtc_Ds1307::bcdToDecimal( buffer[4]); |
leihen | 1:64274190e842 | 84 | time.mon = Rtc_Ds1307::bcdToDecimal( buffer[5]); |
leihen | 2:ee81f2c5a706 | 85 | time.year = Rtc_Ds1307::bcdToDecimal(buffer[6]) + 2000; // plus hundret is because RTC is giving the years since 2000, but std c struct tm needs years since 1900 |
leihen | 2:ee81f2c5a706 | 86 | |
leihen | 2:ee81f2c5a706 | 87 | return true; |
leihen | 2:ee81f2c5a706 | 88 | } |
leihen | 2:ee81f2c5a706 | 89 | |
leihen | 2:ee81f2c5a706 | 90 | |
leihen | 2:ee81f2c5a706 | 91 | bool Rtc_Ds1307::startClock() |
leihen | 2:ee81f2c5a706 | 92 | { |
leihen | 2:ee81f2c5a706 | 93 | char strtStop; |
leihen | 2:ee81f2c5a706 | 94 | |
leihen | 2:ee81f2c5a706 | 95 | INFO ("Reading clock start/stop register value\n"); |
leihen | 2:ee81f2c5a706 | 96 | if (!read(0, &strtStop, 1)) { |
leihen | 2:ee81f2c5a706 | 97 | ERR("Failed to read clock start stop register !\n"); |
leihen | 2:ee81f2c5a706 | 98 | return false; |
leihen | 2:ee81f2c5a706 | 99 | } |
leihen | 2:ee81f2c5a706 | 100 | |
leihen | 2:ee81f2c5a706 | 101 | strtStop &= 0x7F; |
leihen | 2:ee81f2c5a706 | 102 | |
leihen | 2:ee81f2c5a706 | 103 | INFO("Writing back start/stop register value\n"); |
leihen | 2:ee81f2c5a706 | 104 | if (!write(0, &strtStop, 1)) { |
leihen | 2:ee81f2c5a706 | 105 | ERR("Failed to write the start stop register !\n"); |
leihen | 2:ee81f2c5a706 | 106 | return false; |
leihen | 2:ee81f2c5a706 | 107 | } |
leihen | 2:ee81f2c5a706 | 108 | |
leihen | 2:ee81f2c5a706 | 109 | INFO("Start/stop register value successfully written\n"); |
leihen | 2:ee81f2c5a706 | 110 | return true; |
leihen | 2:ee81f2c5a706 | 111 | } |
leihen | 2:ee81f2c5a706 | 112 | |
leihen | 2:ee81f2c5a706 | 113 | bool Rtc_Ds1307::stopClock() |
leihen | 2:ee81f2c5a706 | 114 | { |
leihen | 2:ee81f2c5a706 | 115 | char strtStop; |
leihen | 2:ee81f2c5a706 | 116 | |
leihen | 2:ee81f2c5a706 | 117 | INFO ("Reading clock start/stop register value\n"); |
leihen | 2:ee81f2c5a706 | 118 | if (!read(0, &strtStop, 1)) { |
leihen | 2:ee81f2c5a706 | 119 | ERR("Failed to read clock start stop register !\n"); |
leihen | 2:ee81f2c5a706 | 120 | return false; |
leihen | 2:ee81f2c5a706 | 121 | } |
leihen | 1:64274190e842 | 122 | |
leihen | 2:ee81f2c5a706 | 123 | strtStop |= 0x80; |
leihen | 2:ee81f2c5a706 | 124 | |
leihen | 2:ee81f2c5a706 | 125 | INFO("Writing back start/stop register value\n"); |
leihen | 2:ee81f2c5a706 | 126 | if (!write(0, &strtStop, 1)) { |
leihen | 2:ee81f2c5a706 | 127 | ERR("Failed to write the start stop register !\n"); |
leihen | 2:ee81f2c5a706 | 128 | return false; |
leihen | 2:ee81f2c5a706 | 129 | } |
leihen | 2:ee81f2c5a706 | 130 | |
leihen | 2:ee81f2c5a706 | 131 | INFO("Start/stop register value successfully written\n"); |
leihen | 2:ee81f2c5a706 | 132 | return true; |
leihen | 0:3940f0ad2ca5 | 133 | } |
leihen | 1:64274190e842 | 134 | |
leihen | 2:ee81f2c5a706 | 135 | bool Rtc_Ds1307::setSquareWaveOutput(bool ena, RateSelect_t rs) |
leihen | 2:ee81f2c5a706 | 136 | { |
leihen | 2:ee81f2c5a706 | 137 | char reg; |
leihen | 2:ee81f2c5a706 | 138 | INFO("Reading register value first\n"); |
leihen | 2:ee81f2c5a706 | 139 | |
leihen | 2:ee81f2c5a706 | 140 | if (!read(7,®, 1)) { |
leihen | 2:ee81f2c5a706 | 141 | ERR("Failed to read register value !\n"); |
leihen | 2:ee81f2c5a706 | 142 | return false; |
leihen | 2:ee81f2c5a706 | 143 | } |
leihen | 2:ee81f2c5a706 | 144 | INFO("[Reg:0x07] = %02x\n", reg); |
leihen | 2:ee81f2c5a706 | 145 | |
leihen | 2:ee81f2c5a706 | 146 | // preserve the OUT control bit while writing the frequency and enable bits |
leihen | 2:ee81f2c5a706 | 147 | reg = (reg & 0x80) | (ena ? 0x10 : 0) | ((char)rs & 0x03); |
leihen | 2:ee81f2c5a706 | 148 | |
leihen | 2:ee81f2c5a706 | 149 | INFO("Writing back register value\n"); |
leihen | 2:ee81f2c5a706 | 150 | INFO("[Reg:0x07] = %02x\n", reg); |
leihen | 2:ee81f2c5a706 | 151 | |
leihen | 2:ee81f2c5a706 | 152 | if (!write(7, ®, 1)) { |
leihen | 2:ee81f2c5a706 | 153 | ERR("Failed to write register value !\n"); |
leihen | 2:ee81f2c5a706 | 154 | return false; |
leihen | 2:ee81f2c5a706 | 155 | } |
leihen | 2:ee81f2c5a706 | 156 | |
leihen | 2:ee81f2c5a706 | 157 | INFO("Successfully changed the square wave output.\n"); |
leihen | 2:ee81f2c5a706 | 158 | return true; |
leihen | 2:ee81f2c5a706 | 159 | } |
leihen | 2:ee81f2c5a706 | 160 | |
leihen | 2:ee81f2c5a706 | 161 | |
leihen | 1:64274190e842 | 162 | |
leihen | 1:64274190e842 | 163 | bool Rtc_Ds1307::read(int address, char *buffer, int len) |
leihen | 1:64274190e842 | 164 | { |
leihen | 1:64274190e842 | 165 | char buffer2[2] = {(char)address, 0}; |
leihen | 1:64274190e842 | 166 | |
leihen | 2:ee81f2c5a706 | 167 | // m_rtc->start(); |
leihen | 1:64274190e842 | 168 | if (m_rtc->write(0xd0, buffer2, 1) != 0) { |
leihen | 1:64274190e842 | 169 | ERR("Failed to write register address on rtv!\n"); |
leihen | 1:64274190e842 | 170 | m_rtc->stop(); |
leihen | 1:64274190e842 | 171 | return false; |
leihen | 1:64274190e842 | 172 | } |
leihen | 1:64274190e842 | 173 | if (m_rtc->read(0xd0, buffer, len) != 0) { |
leihen | 1:64274190e842 | 174 | ERR("Failed to read register !\n"); |
leihen | 1:64274190e842 | 175 | return false; |
leihen | 1:64274190e842 | 176 | } |
leihen | 1:64274190e842 | 177 | m_rtc->stop(); |
leihen | 1:64274190e842 | 178 | |
leihen | 1:64274190e842 | 179 | INFO("Successfully read %d registers from RTC\n", len); |
leihen | 1:64274190e842 | 180 | return true; |
leihen | 1:64274190e842 | 181 | } |
leihen | 1:64274190e842 | 182 | |
leihen | 1:64274190e842 | 183 | bool Rtc_Ds1307::write(int address, char *buffer, int len) |
leihen | 1:64274190e842 | 184 | { |
leihen | 1:64274190e842 | 185 | char buffer2[10]; |
leihen | 1:64274190e842 | 186 | buffer2[0] = address&0xFF; |
leihen | 1:64274190e842 | 187 | for (int i = 0 ; i < len ; i++) |
leihen | 1:64274190e842 | 188 | buffer2[i+1] = buffer[i]; |
leihen | 1:64274190e842 | 189 | |
leihen | 2:ee81f2c5a706 | 190 | // m_rtc->start(); |
leihen | 1:64274190e842 | 191 | if (m_rtc->write(0xd0, buffer2, len+1) != 0) { |
leihen | 1:64274190e842 | 192 | ERR("Failed to write data to rtc\n"); |
leihen | 1:64274190e842 | 193 | m_rtc->stop(); |
leihen | 1:64274190e842 | 194 | return false; |
leihen | 1:64274190e842 | 195 | } |
leihen | 1:64274190e842 | 196 | m_rtc->stop(); |
leihen | 1:64274190e842 | 197 | return true; |
leihen | 1:64274190e842 | 198 | } |