Kenji Arai / RTC8564
Committer:
kenjiArai
Date:
Sat Mar 14 05:00:12 2015 +0000
Revision:
0:863510ffa8ff
Child:
1:d1b58c478a7a
RTC-8564NB Real Time Clock Module by EPSON TOYOCOM, 1st revision.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:863510ffa8ff 1 /*
kenjiArai 0:863510ffa8ff 2 * mbed library program
kenjiArai 0:863510ffa8ff 3 * Control RTC-8564NB Real Time Clock Module
kenjiArai 0:863510ffa8ff 4 * EPSON TOYOCOM
kenjiArai 0:863510ffa8ff 5 *
kenjiArai 0:863510ffa8ff 6 * Copyright (c) 2015 Kenji Arai / JH1PJL
kenjiArai 0:863510ffa8ff 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:863510ffa8ff 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:863510ffa8ff 9 * Created: Feburary 1st, 2015
kenjiArai 0:863510ffa8ff 10 * Revised: March 14th, 2015
kenjiArai 0:863510ffa8ff 11 *
kenjiArai 0:863510ffa8ff 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:863510ffa8ff 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:863510ffa8ff 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:863510ffa8ff 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:863510ffa8ff 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:863510ffa8ff 17 */
kenjiArai 0:863510ffa8ff 18
kenjiArai 0:863510ffa8ff 19 #include "mbed.h"
kenjiArai 0:863510ffa8ff 20 #include "RTC8564.h"
kenjiArai 0:863510ffa8ff 21
kenjiArai 0:863510ffa8ff 22 RTC8564::RTC8564 (PinName p_sda, PinName p_scl) : _i2c(p_sda, p_scl)
kenjiArai 0:863510ffa8ff 23 {
kenjiArai 0:863510ffa8ff 24 RTC8564_addr = RTC8564ADDR;
kenjiArai 0:863510ffa8ff 25 }
kenjiArai 0:863510ffa8ff 26
kenjiArai 0:863510ffa8ff 27 RTC8564::RTC8564 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:863510ffa8ff 28 {
kenjiArai 0:863510ffa8ff 29 RTC8564_addr = RTC8564ADDR;
kenjiArai 0:863510ffa8ff 30 }
kenjiArai 0:863510ffa8ff 31
kenjiArai 0:863510ffa8ff 32 /////////////// Read RTC data /////////////////////////////
kenjiArai 0:863510ffa8ff 33 void RTC8564::get_time_rtc (tm *t)
kenjiArai 0:863510ffa8ff 34 {
kenjiArai 0:863510ffa8ff 35 read_rtc_std(t);
kenjiArai 0:863510ffa8ff 36 }
kenjiArai 0:863510ffa8ff 37
kenjiArai 0:863510ffa8ff 38 void RTC8564::read_rtc_std (tm *t)
kenjiArai 0:863510ffa8ff 39 {
kenjiArai 0:863510ffa8ff 40 rtc_time time;
kenjiArai 0:863510ffa8ff 41
kenjiArai 0:863510ffa8ff 42 read_rtc_direct(&time);
kenjiArai 0:863510ffa8ff 43 t->tm_sec = time.rtc_seconds;
kenjiArai 0:863510ffa8ff 44 t->tm_min = time.rtc_minutes;
kenjiArai 0:863510ffa8ff 45 t->tm_hour = time.rtc_hours;
kenjiArai 0:863510ffa8ff 46 t->tm_mday = time.rtc_date;
kenjiArai 0:863510ffa8ff 47 if ( time.rtc_weekday == RTC_Wk_Sunday) {
kenjiArai 0:863510ffa8ff 48 t->tm_wday = 0; // Sun is not 7 but 0
kenjiArai 0:863510ffa8ff 49 } else {
kenjiArai 0:863510ffa8ff 50 t->tm_wday = time.rtc_weekday;
kenjiArai 0:863510ffa8ff 51 }
kenjiArai 0:863510ffa8ff 52 t->tm_mon = time.rtc_month - 1;
kenjiArai 0:863510ffa8ff 53 t->tm_year = time.rtc_year_raw + 100;
kenjiArai 0:863510ffa8ff 54 t->tm_isdst= 0;
kenjiArai 0:863510ffa8ff 55 }
kenjiArai 0:863510ffa8ff 56
kenjiArai 0:863510ffa8ff 57 /////////////// Write data to RTC /////////////////////////
kenjiArai 0:863510ffa8ff 58 void RTC8564::set_time_rtc (tm *t)
kenjiArai 0:863510ffa8ff 59 {
kenjiArai 0:863510ffa8ff 60 write_rtc_std(t);
kenjiArai 0:863510ffa8ff 61 }
kenjiArai 0:863510ffa8ff 62
kenjiArai 0:863510ffa8ff 63 void RTC8564::write_rtc_std (tm *t)
kenjiArai 0:863510ffa8ff 64 {
kenjiArai 0:863510ffa8ff 65 rtc_time time;
kenjiArai 0:863510ffa8ff 66
kenjiArai 0:863510ffa8ff 67 time.rtc_seconds = t->tm_sec;
kenjiArai 0:863510ffa8ff 68 time.rtc_minutes = t->tm_min;
kenjiArai 0:863510ffa8ff 69 time.rtc_hours = t->tm_hour;
kenjiArai 0:863510ffa8ff 70 time.rtc_date = t->tm_mday;
kenjiArai 0:863510ffa8ff 71 if ( t->tm_wday == 0) {
kenjiArai 0:863510ffa8ff 72 time.rtc_weekday = RTC_Wk_Sunday;
kenjiArai 0:863510ffa8ff 73 } else {
kenjiArai 0:863510ffa8ff 74 time.rtc_weekday = t->tm_wday;
kenjiArai 0:863510ffa8ff 75 }
kenjiArai 0:863510ffa8ff 76 time.rtc_month = t->tm_mon + 1;
kenjiArai 0:863510ffa8ff 77 time.rtc_year_raw = t->tm_year - 100;
kenjiArai 0:863510ffa8ff 78 write_rtc_direct(&time);
kenjiArai 0:863510ffa8ff 79 }
kenjiArai 0:863510ffa8ff 80
kenjiArai 0:863510ffa8ff 81 /////////////// Read/Write specific register //////////////
kenjiArai 0:863510ffa8ff 82 uint8_t RTC8564::read_reg_byte(uint8_t reg)
kenjiArai 0:863510ffa8ff 83 {
kenjiArai 0:863510ffa8ff 84 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 85
kenjiArai 0:863510ffa8ff 86 dt[0] = reg;
kenjiArai 0:863510ffa8ff 87 _i2c.write((int)RTC8564_addr, (char *)dt, 1, true);
kenjiArai 0:863510ffa8ff 88 _i2c.read((int)RTC8564_addr, (char *)dt, 1, false);
kenjiArai 0:863510ffa8ff 89 return dt[0];
kenjiArai 0:863510ffa8ff 90 }
kenjiArai 0:863510ffa8ff 91
kenjiArai 0:863510ffa8ff 92 uint8_t RTC8564::write_reg_byte(uint8_t reg, uint8_t data)
kenjiArai 0:863510ffa8ff 93 {
kenjiArai 0:863510ffa8ff 94 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 95
kenjiArai 0:863510ffa8ff 96 dt[0] = reg;
kenjiArai 0:863510ffa8ff 97 dt[1] = data;
kenjiArai 0:863510ffa8ff 98 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 99 dt[1] = read_reg_byte(reg);
kenjiArai 0:863510ffa8ff 100 return dt[1];
kenjiArai 0:863510ffa8ff 101 }
kenjiArai 0:863510ffa8ff 102
kenjiArai 0:863510ffa8ff 103 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:863510ffa8ff 104 void RTC8564::frequency(int hz)
kenjiArai 0:863510ffa8ff 105 {
kenjiArai 0:863510ffa8ff 106 _i2c.frequency(hz);
kenjiArai 0:863510ffa8ff 107 }
kenjiArai 0:863510ffa8ff 108
kenjiArai 0:863510ffa8ff 109 /////////////// Read/Write RTC another format /////////////
kenjiArai 0:863510ffa8ff 110 void RTC8564::read_rtc_direct (rtc_time *tm)
kenjiArai 0:863510ffa8ff 111 {
kenjiArai 0:863510ffa8ff 112 uint8_t dt;
kenjiArai 0:863510ffa8ff 113
kenjiArai 0:863510ffa8ff 114 dt = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 115 _i2c.write((int)RTC8564_addr, (char *)dt, 1, true);
kenjiArai 0:863510ffa8ff 116 _i2c.read((int)RTC8564_addr, (char *)rtc_buf, RTC8564_REG_TIMER + 1, false);
kenjiArai 0:863510ffa8ff 117 tm->rtc_seconds = bcd2bin(rtc_buf[RTC8564_REG_SEC] & 0x7f);
kenjiArai 0:863510ffa8ff 118 tm->rtc_minutes = bcd2bin(rtc_buf[RTC8564_REG_MIN] & 0x7f);
kenjiArai 0:863510ffa8ff 119 tm->rtc_hours = bcd2bin(rtc_buf[RTC8564_REG_HOUR] & 0x3f);
kenjiArai 0:863510ffa8ff 120 tm->rtc_date = bcd2bin(rtc_buf[RTC8564_REG_DAY] & 0x3f);
kenjiArai 0:863510ffa8ff 121 tm->rtc_weekday = rtc_buf[RTC8564_REG_WDAY] & 0x07;
kenjiArai 0:863510ffa8ff 122 tm->rtc_month = bcd2bin(rtc_buf[RTC8564_REG_MON] & 0x1f);
kenjiArai 0:863510ffa8ff 123 tm->rtc_year_raw= bcd2bin(rtc_buf[RTC8564_REG_YEAR]);
kenjiArai 0:863510ffa8ff 124 tm->rtc_year = tm->rtc_year_raw + 100 + 1900;
kenjiArai 0:863510ffa8ff 125 }
kenjiArai 0:863510ffa8ff 126
kenjiArai 0:863510ffa8ff 127 void RTC8564::write_rtc_direct (rtc_time *tm)
kenjiArai 0:863510ffa8ff 128 {
kenjiArai 0:863510ffa8ff 129 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 130
kenjiArai 0:863510ffa8ff 131 rtc_buf[RTC8564_REG_YEAR - 1] = bin2bcd(tm->rtc_year_raw);
kenjiArai 0:863510ffa8ff 132 rtc_buf[RTC8564_REG_MON - 1] = bin2bcd(tm->rtc_month);
kenjiArai 0:863510ffa8ff 133 rtc_buf[RTC8564_REG_WDAY - 1] = (tm->rtc_weekday & 0x07);
kenjiArai 0:863510ffa8ff 134 rtc_buf[RTC8564_REG_DAY - 1] = bin2bcd(tm->rtc_date);
kenjiArai 0:863510ffa8ff 135 rtc_buf[RTC8564_REG_HOUR - 1] = bin2bcd(tm->rtc_hours);
kenjiArai 0:863510ffa8ff 136 rtc_buf[RTC8564_REG_MIN - 1] = bin2bcd(tm->rtc_minutes);
kenjiArai 0:863510ffa8ff 137 rtc_buf[RTC8564_REG_SEC - 1] = bin2bcd(tm->rtc_seconds);
kenjiArai 0:863510ffa8ff 138 dt[0] = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 139 dt[1] = 0x20;
kenjiArai 0:863510ffa8ff 140 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 141 rtc_buf[0] = RTC8564_REG_SEC;
kenjiArai 0:863510ffa8ff 142 _i2c.write((int)RTC8564_addr, (char *)rtc_buf, 8, false);
kenjiArai 0:863510ffa8ff 143 dt[0] = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 144 dt[1] = 0x00;
kenjiArai 0:863510ffa8ff 145 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 146 }
kenjiArai 0:863510ffa8ff 147
kenjiArai 0:863510ffa8ff 148 uint8_t RTC8564::bin2bcd (uint8_t dt)
kenjiArai 0:863510ffa8ff 149 {
kenjiArai 0:863510ffa8ff 150 uint8_t bcdhigh = 0;
kenjiArai 0:863510ffa8ff 151
kenjiArai 0:863510ffa8ff 152 while (dt >= 10) {
kenjiArai 0:863510ffa8ff 153 bcdhigh++;
kenjiArai 0:863510ffa8ff 154 dt -= 10;
kenjiArai 0:863510ffa8ff 155 }
kenjiArai 0:863510ffa8ff 156 return ((uint8_t)(bcdhigh << 4) | dt);
kenjiArai 0:863510ffa8ff 157 }
kenjiArai 0:863510ffa8ff 158
kenjiArai 0:863510ffa8ff 159 uint8_t RTC8564::bcd2bin (uint8_t dt)
kenjiArai 0:863510ffa8ff 160 {
kenjiArai 0:863510ffa8ff 161 uint8_t tmp = 0;
kenjiArai 0:863510ffa8ff 162
kenjiArai 0:863510ffa8ff 163 tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
kenjiArai 0:863510ffa8ff 164 return (tmp + (dt & (uint8_t)0x0f));
kenjiArai 0:863510ffa8ff 165 }