RTC-8564NB Real Time Clock Module by EPSON TOYOCOM

Committer:
kenjiArai
Date:
Wed Aug 23 09:27:22 2017 +0000
Revision:
1:d1b58c478a7a
Parent:
0:863510ffa8ff
countermeasure for  NonCopyable

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 1:d1b58c478a7a 6 * Copyright (c) 2015,'17 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 1:d1b58c478a7a 9 * Created: Feburary 1st, 2015
kenjiArai 1:d1b58c478a7a 10 * Revised: August 23rd, 2017
kenjiArai 0:863510ffa8ff 11 */
kenjiArai 0:863510ffa8ff 12
kenjiArai 0:863510ffa8ff 13 #include "mbed.h"
kenjiArai 0:863510ffa8ff 14 #include "RTC8564.h"
kenjiArai 0:863510ffa8ff 15
kenjiArai 1:d1b58c478a7a 16 RTC8564::RTC8564 (PinName p_sda, PinName p_scl)
kenjiArai 1:d1b58c478a7a 17 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:863510ffa8ff 18 {
kenjiArai 0:863510ffa8ff 19 RTC8564_addr = RTC8564ADDR;
kenjiArai 0:863510ffa8ff 20 }
kenjiArai 0:863510ffa8ff 21
kenjiArai 1:d1b58c478a7a 22 RTC8564::RTC8564 (I2C& p_i2c)
kenjiArai 1:d1b58c478a7a 23 : _i2c(p_i2c)
kenjiArai 0:863510ffa8ff 24 {
kenjiArai 0:863510ffa8ff 25 RTC8564_addr = RTC8564ADDR;
kenjiArai 0:863510ffa8ff 26 }
kenjiArai 0:863510ffa8ff 27
kenjiArai 0:863510ffa8ff 28 /////////////// Read RTC data /////////////////////////////
kenjiArai 0:863510ffa8ff 29 void RTC8564::get_time_rtc (tm *t)
kenjiArai 0:863510ffa8ff 30 {
kenjiArai 0:863510ffa8ff 31 read_rtc_std(t);
kenjiArai 0:863510ffa8ff 32 }
kenjiArai 0:863510ffa8ff 33
kenjiArai 0:863510ffa8ff 34 void RTC8564::read_rtc_std (tm *t)
kenjiArai 0:863510ffa8ff 35 {
kenjiArai 0:863510ffa8ff 36 rtc_time time;
kenjiArai 0:863510ffa8ff 37
kenjiArai 0:863510ffa8ff 38 read_rtc_direct(&time);
kenjiArai 0:863510ffa8ff 39 t->tm_sec = time.rtc_seconds;
kenjiArai 0:863510ffa8ff 40 t->tm_min = time.rtc_minutes;
kenjiArai 0:863510ffa8ff 41 t->tm_hour = time.rtc_hours;
kenjiArai 0:863510ffa8ff 42 t->tm_mday = time.rtc_date;
kenjiArai 0:863510ffa8ff 43 if ( time.rtc_weekday == RTC_Wk_Sunday) {
kenjiArai 0:863510ffa8ff 44 t->tm_wday = 0; // Sun is not 7 but 0
kenjiArai 0:863510ffa8ff 45 } else {
kenjiArai 0:863510ffa8ff 46 t->tm_wday = time.rtc_weekday;
kenjiArai 0:863510ffa8ff 47 }
kenjiArai 0:863510ffa8ff 48 t->tm_mon = time.rtc_month - 1;
kenjiArai 0:863510ffa8ff 49 t->tm_year = time.rtc_year_raw + 100;
kenjiArai 0:863510ffa8ff 50 t->tm_isdst= 0;
kenjiArai 0:863510ffa8ff 51 }
kenjiArai 0:863510ffa8ff 52
kenjiArai 0:863510ffa8ff 53 /////////////// Write data to RTC /////////////////////////
kenjiArai 0:863510ffa8ff 54 void RTC8564::set_time_rtc (tm *t)
kenjiArai 0:863510ffa8ff 55 {
kenjiArai 0:863510ffa8ff 56 write_rtc_std(t);
kenjiArai 0:863510ffa8ff 57 }
kenjiArai 0:863510ffa8ff 58
kenjiArai 0:863510ffa8ff 59 void RTC8564::write_rtc_std (tm *t)
kenjiArai 0:863510ffa8ff 60 {
kenjiArai 0:863510ffa8ff 61 rtc_time time;
kenjiArai 0:863510ffa8ff 62
kenjiArai 0:863510ffa8ff 63 time.rtc_seconds = t->tm_sec;
kenjiArai 0:863510ffa8ff 64 time.rtc_minutes = t->tm_min;
kenjiArai 0:863510ffa8ff 65 time.rtc_hours = t->tm_hour;
kenjiArai 0:863510ffa8ff 66 time.rtc_date = t->tm_mday;
kenjiArai 0:863510ffa8ff 67 if ( t->tm_wday == 0) {
kenjiArai 0:863510ffa8ff 68 time.rtc_weekday = RTC_Wk_Sunday;
kenjiArai 0:863510ffa8ff 69 } else {
kenjiArai 0:863510ffa8ff 70 time.rtc_weekday = t->tm_wday;
kenjiArai 0:863510ffa8ff 71 }
kenjiArai 0:863510ffa8ff 72 time.rtc_month = t->tm_mon + 1;
kenjiArai 0:863510ffa8ff 73 time.rtc_year_raw = t->tm_year - 100;
kenjiArai 0:863510ffa8ff 74 write_rtc_direct(&time);
kenjiArai 0:863510ffa8ff 75 }
kenjiArai 0:863510ffa8ff 76
kenjiArai 0:863510ffa8ff 77 /////////////// Read/Write specific register //////////////
kenjiArai 0:863510ffa8ff 78 uint8_t RTC8564::read_reg_byte(uint8_t reg)
kenjiArai 0:863510ffa8ff 79 {
kenjiArai 0:863510ffa8ff 80 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 81
kenjiArai 0:863510ffa8ff 82 dt[0] = reg;
kenjiArai 0:863510ffa8ff 83 _i2c.write((int)RTC8564_addr, (char *)dt, 1, true);
kenjiArai 0:863510ffa8ff 84 _i2c.read((int)RTC8564_addr, (char *)dt, 1, false);
kenjiArai 0:863510ffa8ff 85 return dt[0];
kenjiArai 0:863510ffa8ff 86 }
kenjiArai 0:863510ffa8ff 87
kenjiArai 0:863510ffa8ff 88 uint8_t RTC8564::write_reg_byte(uint8_t reg, uint8_t data)
kenjiArai 0:863510ffa8ff 89 {
kenjiArai 0:863510ffa8ff 90 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 91
kenjiArai 0:863510ffa8ff 92 dt[0] = reg;
kenjiArai 0:863510ffa8ff 93 dt[1] = data;
kenjiArai 0:863510ffa8ff 94 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 95 dt[1] = read_reg_byte(reg);
kenjiArai 0:863510ffa8ff 96 return dt[1];
kenjiArai 0:863510ffa8ff 97 }
kenjiArai 0:863510ffa8ff 98
kenjiArai 0:863510ffa8ff 99 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:863510ffa8ff 100 void RTC8564::frequency(int hz)
kenjiArai 0:863510ffa8ff 101 {
kenjiArai 0:863510ffa8ff 102 _i2c.frequency(hz);
kenjiArai 0:863510ffa8ff 103 }
kenjiArai 0:863510ffa8ff 104
kenjiArai 0:863510ffa8ff 105 /////////////// Read/Write RTC another format /////////////
kenjiArai 0:863510ffa8ff 106 void RTC8564::read_rtc_direct (rtc_time *tm)
kenjiArai 0:863510ffa8ff 107 {
kenjiArai 0:863510ffa8ff 108 uint8_t dt;
kenjiArai 0:863510ffa8ff 109
kenjiArai 0:863510ffa8ff 110 dt = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 111 _i2c.write((int)RTC8564_addr, (char *)dt, 1, true);
kenjiArai 0:863510ffa8ff 112 _i2c.read((int)RTC8564_addr, (char *)rtc_buf, RTC8564_REG_TIMER + 1, false);
kenjiArai 0:863510ffa8ff 113 tm->rtc_seconds = bcd2bin(rtc_buf[RTC8564_REG_SEC] & 0x7f);
kenjiArai 0:863510ffa8ff 114 tm->rtc_minutes = bcd2bin(rtc_buf[RTC8564_REG_MIN] & 0x7f);
kenjiArai 0:863510ffa8ff 115 tm->rtc_hours = bcd2bin(rtc_buf[RTC8564_REG_HOUR] & 0x3f);
kenjiArai 0:863510ffa8ff 116 tm->rtc_date = bcd2bin(rtc_buf[RTC8564_REG_DAY] & 0x3f);
kenjiArai 0:863510ffa8ff 117 tm->rtc_weekday = rtc_buf[RTC8564_REG_WDAY] & 0x07;
kenjiArai 0:863510ffa8ff 118 tm->rtc_month = bcd2bin(rtc_buf[RTC8564_REG_MON] & 0x1f);
kenjiArai 0:863510ffa8ff 119 tm->rtc_year_raw= bcd2bin(rtc_buf[RTC8564_REG_YEAR]);
kenjiArai 0:863510ffa8ff 120 tm->rtc_year = tm->rtc_year_raw + 100 + 1900;
kenjiArai 0:863510ffa8ff 121 }
kenjiArai 0:863510ffa8ff 122
kenjiArai 0:863510ffa8ff 123 void RTC8564::write_rtc_direct (rtc_time *tm)
kenjiArai 0:863510ffa8ff 124 {
kenjiArai 0:863510ffa8ff 125 uint8_t dt[2];
kenjiArai 0:863510ffa8ff 126
kenjiArai 0:863510ffa8ff 127 rtc_buf[RTC8564_REG_YEAR - 1] = bin2bcd(tm->rtc_year_raw);
kenjiArai 0:863510ffa8ff 128 rtc_buf[RTC8564_REG_MON - 1] = bin2bcd(tm->rtc_month);
kenjiArai 0:863510ffa8ff 129 rtc_buf[RTC8564_REG_WDAY - 1] = (tm->rtc_weekday & 0x07);
kenjiArai 0:863510ffa8ff 130 rtc_buf[RTC8564_REG_DAY - 1] = bin2bcd(tm->rtc_date);
kenjiArai 0:863510ffa8ff 131 rtc_buf[RTC8564_REG_HOUR - 1] = bin2bcd(tm->rtc_hours);
kenjiArai 0:863510ffa8ff 132 rtc_buf[RTC8564_REG_MIN - 1] = bin2bcd(tm->rtc_minutes);
kenjiArai 0:863510ffa8ff 133 rtc_buf[RTC8564_REG_SEC - 1] = bin2bcd(tm->rtc_seconds);
kenjiArai 0:863510ffa8ff 134 dt[0] = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 135 dt[1] = 0x20;
kenjiArai 0:863510ffa8ff 136 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 137 rtc_buf[0] = RTC8564_REG_SEC;
kenjiArai 0:863510ffa8ff 138 _i2c.write((int)RTC8564_addr, (char *)rtc_buf, 8, false);
kenjiArai 0:863510ffa8ff 139 dt[0] = RTC8564_REG_CONTL1;
kenjiArai 0:863510ffa8ff 140 dt[1] = 0x00;
kenjiArai 0:863510ffa8ff 141 _i2c.write((int)RTC8564_addr, (char *)dt, 2, false);
kenjiArai 0:863510ffa8ff 142 }
kenjiArai 0:863510ffa8ff 143
kenjiArai 0:863510ffa8ff 144 uint8_t RTC8564::bin2bcd (uint8_t dt)
kenjiArai 0:863510ffa8ff 145 {
kenjiArai 0:863510ffa8ff 146 uint8_t bcdhigh = 0;
kenjiArai 0:863510ffa8ff 147
kenjiArai 0:863510ffa8ff 148 while (dt >= 10) {
kenjiArai 0:863510ffa8ff 149 bcdhigh++;
kenjiArai 0:863510ffa8ff 150 dt -= 10;
kenjiArai 0:863510ffa8ff 151 }
kenjiArai 0:863510ffa8ff 152 return ((uint8_t)(bcdhigh << 4) | dt);
kenjiArai 0:863510ffa8ff 153 }
kenjiArai 0:863510ffa8ff 154
kenjiArai 0:863510ffa8ff 155 uint8_t RTC8564::bcd2bin (uint8_t dt)
kenjiArai 0:863510ffa8ff 156 {
kenjiArai 0:863510ffa8ff 157 uint8_t tmp = 0;
kenjiArai 0:863510ffa8ff 158
kenjiArai 0:863510ffa8ff 159 tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
kenjiArai 0:863510ffa8ff 160 return (tmp + (dt & (uint8_t)0x0f));
kenjiArai 0:863510ffa8ff 161 }
kenjiArai 1:d1b58c478a7a 162
kenjiArai 1:d1b58c478a7a 163