RX-8025NB Real Time Clock Module by EPSON

Dependents:   TYBLE16_simple_data_logger Check_external_RTC

Committer:
kenjiArai
Date:
Sun Jun 07 07:50:14 2015 +0000
Revision:
1:817e81048235
Parent:
0:cdf2921959b4
Child:
2:ce49c4ba4c02
Changed default setting 24 Hours format

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 1:817e81048235 10 * Revised: June 7th, 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 1:817e81048235 25 init();
kenjiArai 0:cdf2921959b4 26 }
kenjiArai 0:cdf2921959b4 27
kenjiArai 0:cdf2921959b4 28 RX8025::RX8025 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 0:cdf2921959b4 29 {
kenjiArai 0:cdf2921959b4 30 RX8025_addr = RX8025ADDR;
kenjiArai 1:817e81048235 31 init();
kenjiArai 1:817e81048235 32 }
kenjiArai 1:817e81048235 33
kenjiArai 1:817e81048235 34 /////////////// Initialize ////////////////////////////////
kenjiArai 1:817e81048235 35 void RX8025::init()
kenjiArai 1:817e81048235 36 {
kenjiArai 1:817e81048235 37 uint8_t dt[2];
kenjiArai 1:817e81048235 38
kenjiArai 1:817e81048235 39 _i2c.frequency(400000);
kenjiArai 1:817e81048235 40 dt[0] = RX8025_REG_CONTL1;
kenjiArai 1:817e81048235 41 dt[1] = 0x20; // Set 24Hr mode
kenjiArai 1:817e81048235 42 _i2c.write((int)RX8025_addr, (char *)dt, 2, false);
kenjiArai 0:cdf2921959b4 43 }
kenjiArai 0:cdf2921959b4 44
kenjiArai 0:cdf2921959b4 45 /////////////// Read RTC data /////////////////////////////
kenjiArai 0:cdf2921959b4 46 void RX8025::get_time_rtc (tm *t)
kenjiArai 0:cdf2921959b4 47 {
kenjiArai 0:cdf2921959b4 48 read_rtc_std(t);
kenjiArai 0:cdf2921959b4 49 }
kenjiArai 0:cdf2921959b4 50
kenjiArai 0:cdf2921959b4 51 void RX8025::read_rtc_std (tm *t)
kenjiArai 0:cdf2921959b4 52 {
kenjiArai 0:cdf2921959b4 53 rtc_time time;
kenjiArai 0:cdf2921959b4 54
kenjiArai 0:cdf2921959b4 55 read_rtc_direct(&time);
kenjiArai 0:cdf2921959b4 56 t->tm_sec = time.rtc_seconds;
kenjiArai 0:cdf2921959b4 57 t->tm_min = time.rtc_minutes;
kenjiArai 0:cdf2921959b4 58 t->tm_hour = time.rtc_hours;
kenjiArai 0:cdf2921959b4 59 t->tm_mday = time.rtc_date;
kenjiArai 0:cdf2921959b4 60 if ( time.rtc_weekday == RTC_Wk_Sunday) {
kenjiArai 0:cdf2921959b4 61 t->tm_wday = 0; // Sun is not 7 but 0
kenjiArai 0:cdf2921959b4 62 } else {
kenjiArai 0:cdf2921959b4 63 t->tm_wday = time.rtc_weekday;
kenjiArai 0:cdf2921959b4 64 }
kenjiArai 0:cdf2921959b4 65 t->tm_mon = time.rtc_month - 1;
kenjiArai 0:cdf2921959b4 66 t->tm_year = time.rtc_year_raw + 100;
kenjiArai 0:cdf2921959b4 67 t->tm_isdst= 0;
kenjiArai 0:cdf2921959b4 68 }
kenjiArai 0:cdf2921959b4 69
kenjiArai 0:cdf2921959b4 70 /////////////// Write data to RTC /////////////////////////
kenjiArai 0:cdf2921959b4 71 void RX8025::set_time_rtc (tm *t)
kenjiArai 0:cdf2921959b4 72 {
kenjiArai 0:cdf2921959b4 73 write_rtc_std(t);
kenjiArai 0:cdf2921959b4 74 }
kenjiArai 0:cdf2921959b4 75
kenjiArai 0:cdf2921959b4 76 void RX8025::write_rtc_std (tm *t)
kenjiArai 0:cdf2921959b4 77 {
kenjiArai 0:cdf2921959b4 78 rtc_time time;
kenjiArai 0:cdf2921959b4 79
kenjiArai 0:cdf2921959b4 80 time.rtc_seconds = t->tm_sec;
kenjiArai 0:cdf2921959b4 81 time.rtc_minutes = t->tm_min;
kenjiArai 0:cdf2921959b4 82 time.rtc_hours = t->tm_hour;
kenjiArai 0:cdf2921959b4 83 time.rtc_date = t->tm_mday;
kenjiArai 0:cdf2921959b4 84 if ( t->tm_wday == 0) {
kenjiArai 0:cdf2921959b4 85 time.rtc_weekday = RTC_Wk_Sunday;
kenjiArai 0:cdf2921959b4 86 } else {
kenjiArai 0:cdf2921959b4 87 time.rtc_weekday = t->tm_wday;
kenjiArai 0:cdf2921959b4 88 }
kenjiArai 0:cdf2921959b4 89 time.rtc_month = t->tm_mon + 1;
kenjiArai 0:cdf2921959b4 90 time.rtc_year_raw = t->tm_year - 100;
kenjiArai 0:cdf2921959b4 91 write_rtc_direct(&time);
kenjiArai 0:cdf2921959b4 92 }
kenjiArai 0:cdf2921959b4 93
kenjiArai 0:cdf2921959b4 94 /////////////// Read/Write specific register //////////////
kenjiArai 0:cdf2921959b4 95 uint8_t RX8025::read_reg_byte(uint8_t reg)
kenjiArai 0:cdf2921959b4 96 {
kenjiArai 0:cdf2921959b4 97 uint8_t dt[2];
kenjiArai 0:cdf2921959b4 98
kenjiArai 0:cdf2921959b4 99 dt[0] = reg;
kenjiArai 0:cdf2921959b4 100 _i2c.write((int)RX8025_addr, (char *)dt, 1, true);
kenjiArai 0:cdf2921959b4 101 _i2c.read((int)RX8025_addr, (char *)dt, 1, false);
kenjiArai 0:cdf2921959b4 102 return dt[0];
kenjiArai 0:cdf2921959b4 103 }
kenjiArai 0:cdf2921959b4 104
kenjiArai 0:cdf2921959b4 105 uint8_t RX8025::write_reg_byte(uint8_t reg, uint8_t data)
kenjiArai 0:cdf2921959b4 106 {
kenjiArai 0:cdf2921959b4 107 uint8_t dt[2];
kenjiArai 0:cdf2921959b4 108
kenjiArai 0:cdf2921959b4 109 dt[0] = reg;
kenjiArai 0:cdf2921959b4 110 dt[1] = data;
kenjiArai 0:cdf2921959b4 111 _i2c.write((int)RX8025_addr, (char *)dt, 2, false);
kenjiArai 0:cdf2921959b4 112 dt[1] = read_reg_byte(reg);
kenjiArai 0:cdf2921959b4 113 return dt[1];
kenjiArai 0:cdf2921959b4 114 }
kenjiArai 0:cdf2921959b4 115
kenjiArai 0:cdf2921959b4 116 /////////////// I2C Freq. /////////////////////////////////
kenjiArai 0:cdf2921959b4 117 void RX8025::frequency(int hz)
kenjiArai 0:cdf2921959b4 118 {
kenjiArai 0:cdf2921959b4 119 _i2c.frequency(hz);
kenjiArai 0:cdf2921959b4 120 }
kenjiArai 0:cdf2921959b4 121
kenjiArai 0:cdf2921959b4 122 /////////////// Read/Write RTC another format /////////////
kenjiArai 0:cdf2921959b4 123 void RX8025::read_rtc_direct (rtc_time *tm)
kenjiArai 0:cdf2921959b4 124 {
kenjiArai 0:cdf2921959b4 125 uint8_t dt;
kenjiArai 0:cdf2921959b4 126
kenjiArai 0:cdf2921959b4 127 dt = RX8025_REG_SEC;
kenjiArai 0:cdf2921959b4 128 _i2c.write((int)RX8025_addr, (char *)dt, 1, true);
kenjiArai 0:cdf2921959b4 129 _i2c.read((int)RX8025_addr, (char *)rtc_buf, RX8025_REG_CONTL2 + 1, false);
kenjiArai 0:cdf2921959b4 130 tm->rtc_seconds = bcd2bin(rtc_buf[RX8025_REG_SEC] & 0x7f);
kenjiArai 0:cdf2921959b4 131 tm->rtc_minutes = bcd2bin(rtc_buf[RX8025_REG_MIN] & 0x7f);
kenjiArai 0:cdf2921959b4 132 tm->rtc_hours = bcd2bin(rtc_buf[RX8025_REG_HOUR] & 0x3f);
kenjiArai 0:cdf2921959b4 133 tm->rtc_date = bcd2bin(rtc_buf[RX8025_REG_DAY] & 0x3f);
kenjiArai 0:cdf2921959b4 134 tm->rtc_weekday = rtc_buf[RX8025_REG_WDAY] & 0x07;
kenjiArai 0:cdf2921959b4 135 tm->rtc_month = bcd2bin(rtc_buf[RX8025_REG_MON] & 0x1f);
kenjiArai 0:cdf2921959b4 136 tm->rtc_year_raw= bcd2bin(rtc_buf[RX8025_REG_YEAR]);
kenjiArai 0:cdf2921959b4 137 tm->rtc_year = tm->rtc_year_raw + 100 + 1900;
kenjiArai 0:cdf2921959b4 138 }
kenjiArai 0:cdf2921959b4 139
kenjiArai 0:cdf2921959b4 140 void RX8025::write_rtc_direct (rtc_time *tm)
kenjiArai 0:cdf2921959b4 141 {
kenjiArai 0:cdf2921959b4 142 rtc_buf[RX8025_REG_YEAR + 1] = bin2bcd(tm->rtc_year_raw);
kenjiArai 0:cdf2921959b4 143 rtc_buf[RX8025_REG_MON + 1] = bin2bcd(tm->rtc_month);
kenjiArai 0:cdf2921959b4 144 rtc_buf[RX8025_REG_WDAY + 1] = (tm->rtc_weekday & 0x07);
kenjiArai 0:cdf2921959b4 145 rtc_buf[RX8025_REG_DAY + 1] = bin2bcd(tm->rtc_date);
kenjiArai 0:cdf2921959b4 146 rtc_buf[RX8025_REG_HOUR + 1] = bin2bcd(tm->rtc_hours);
kenjiArai 0:cdf2921959b4 147 rtc_buf[RX8025_REG_MIN + 1] = bin2bcd(tm->rtc_minutes);
kenjiArai 0:cdf2921959b4 148 rtc_buf[RX8025_REG_SEC + 1] = bin2bcd(tm->rtc_seconds);
kenjiArai 0:cdf2921959b4 149 rtc_buf[0] = RX8025_REG_SEC;
kenjiArai 0:cdf2921959b4 150 _i2c.write((int)RX8025_addr, (char *)rtc_buf, 8, false);
kenjiArai 0:cdf2921959b4 151 }
kenjiArai 0:cdf2921959b4 152
kenjiArai 0:cdf2921959b4 153 uint8_t RX8025::bin2bcd (uint8_t dt)
kenjiArai 0:cdf2921959b4 154 {
kenjiArai 0:cdf2921959b4 155 uint8_t bcdhigh = 0;
kenjiArai 0:cdf2921959b4 156
kenjiArai 0:cdf2921959b4 157 while (dt >= 10) {
kenjiArai 0:cdf2921959b4 158 bcdhigh++;
kenjiArai 0:cdf2921959b4 159 dt -= 10;
kenjiArai 0:cdf2921959b4 160 }
kenjiArai 0:cdf2921959b4 161 return ((uint8_t)(bcdhigh << 4) | dt);
kenjiArai 0:cdf2921959b4 162 }
kenjiArai 0:cdf2921959b4 163
kenjiArai 0:cdf2921959b4 164 uint8_t RX8025::bcd2bin (uint8_t dt)
kenjiArai 0:cdf2921959b4 165 {
kenjiArai 0:cdf2921959b4 166 uint8_t tmp = 0;
kenjiArai 0:cdf2921959b4 167
kenjiArai 0:cdf2921959b4 168 tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
kenjiArai 0:cdf2921959b4 169 return (tmp + (dt & (uint8_t)0x0f));
kenjiArai 0:cdf2921959b4 170 }