RX-8025NB Real Time Clock Module by EPSON

Dependents:   TYBLE16_simple_data_logger Check_external_RTC

Committer:
kenjiArai
Date:
Fri Jun 05 10:43:42 2015 +0000
Revision:
0:cdf2921959b4
Child:
1:817e81048235
RX-8025NB Real Time Clock Module by EPSON, 1st revision.

Who changed what in which revision?

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