RX-8025NB Real Time Clock Module by EPSON
Dependents: TYBLE16_simple_data_logger Check_external_RTC
Diff: RX8025NB.cpp
- Revision:
- 2:ce49c4ba4c02
- Parent:
- 1:817e81048235
- Child:
- 3:d59c12d14ca9
--- a/RX8025NB.cpp Sun Jun 07 07:50:14 2015 +0000 +++ b/RX8025NB.cpp Wed Mar 09 12:41:13 2016 +0000 @@ -3,11 +3,11 @@ * Control RX-8025NB Real Time Clock Module * EPSON * - * Copyright (c) 2015 Kenji Arai / JH1PJL + * Copyright (c) 2015,'16 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: June 3rd, 2015 - * Revised: June 7th, 2015 + * Revised: March 8th, 2016 * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE @@ -34,12 +34,32 @@ /////////////// Initialize //////////////////////////////// void RX8025::init() { - uint8_t dt[2]; + tm t; + char dt; _i2c.frequency(400000); - dt[0] = RX8025_REG_CONTL1; - dt[1] = 0x20; // Set 24Hr mode - _i2c.write((int)RX8025_addr, (char *)dt, 2, false); + dt = read_reg_byte(RX8025_REG_CONTL2); + if (dt & 0x10){ // Power on reset + dt = write_reg_byte(RX8025_REG_CONTL2, 0); // all clear + // Set 24H + dt = read_reg_byte(RX8025_REG_CONTL1); + dt |= 0x20; + dt = write_reg_byte(RX8025_REG_CONTL1, dt); + // set January 1st,2016 1am as a default + t.tm_sec = 0; + t.tm_min = 0; + t.tm_hour = 1; + t.tm_mday = 1; + t.tm_wday = 0; + t.tm_mon = 0; + t.tm_year = 116; + write_rtc_std(&t); + } else { + // Set 24H + dt = read_reg_byte(RX8025_REG_CONTL1); + dt |= 0x20; + dt = write_reg_byte(RX8025_REG_CONTL1, dt); + } } /////////////// Read RTC data ///////////////////////////// @@ -91,26 +111,57 @@ write_rtc_direct(&time); } +/////////////// Set Alarm-D / INTA //////////////////////// +void RX8025::set_next_alarmD_INTA (uint16_t time) +{ + tm t; + char dt; + + dt = read_reg_byte(RX8025_REG_CONTL1); + dt &= ~0x40; // DALE = 0 + dt = write_reg_byte(RX8025_REG_CONTL1, dt); + if (time > 1440){ + time = 1440; + } else if ((time == 0) || (time == 1)){ + time = 2; + } + read_rtc_std(&t); // read current time + rtc_buf[2] = bin2bcd((t.tm_hour + (time / 60)) % 24U); + rtc_buf[1] = bin2bcd((t.tm_min + (time % 60)) % 60U); + rtc_buf[0] = RX8025_REG_ALARMD_MIN << 4; + _i2c.write(RX8025_addr, rtc_buf, 3, false); + dt = read_reg_byte(RX8025_REG_CONTL1); + dt |= 0x40; // DALE = 1 + dt = write_reg_byte(RX8025_REG_CONTL1, dt); +} + +/////////////// Clear Alarm-D / INTA interrupt //////////// +void RX8025::clear_alarmD_INTA () +{ + char dt; + + dt = read_reg_byte(RX8025_REG_CONTL2); + if (dt & 0x01){ // if DAFG = 1 then clear + dt &= ~0x01; // DAFG = 0 + } + dt = write_reg_byte(RX8025_REG_CONTL1, dt); +} + /////////////// Read/Write specific register ////////////// uint8_t RX8025::read_reg_byte(uint8_t reg) { - uint8_t dt[2]; - - dt[0] = reg; - _i2c.write((int)RX8025_addr, (char *)dt, 1, true); - _i2c.read((int)RX8025_addr, (char *)dt, 1, false); - return dt[0]; + rtc_buf[0] = reg << 4; + _i2c.write(RX8025_addr, rtc_buf, 1, true); + _i2c.read(RX8025_addr, rtc_buf, 1, false); + return rtc_buf[0]; } uint8_t RX8025::write_reg_byte(uint8_t reg, uint8_t data) { - uint8_t dt[2]; - - dt[0] = reg; - dt[1] = data; - _i2c.write((int)RX8025_addr, (char *)dt, 2, false); - dt[1] = read_reg_byte(reg); - return dt[1]; + rtc_buf[0] = reg << 4; + rtc_buf[1] = data; + _i2c.write(RX8025_addr, rtc_buf, 2, false); + return read_reg_byte(reg); } /////////////// I2C Freq. ///////////////////////////////// @@ -122,11 +173,9 @@ /////////////// Read/Write RTC another format ///////////// void RX8025::read_rtc_direct (rtc_time *tm) { - uint8_t dt; - - dt = RX8025_REG_SEC; - _i2c.write((int)RX8025_addr, (char *)dt, 1, true); - _i2c.read((int)RX8025_addr, (char *)rtc_buf, RX8025_REG_CONTL2 + 1, false); + rtc_buf[0] = RX8025_REG_SEC << 4; + _i2c.write(RX8025_addr, rtc_buf, 1, true); + _i2c.read(RX8025_addr, rtc_buf, 10, false); tm->rtc_seconds = bcd2bin(rtc_buf[RX8025_REG_SEC] & 0x7f); tm->rtc_minutes = bcd2bin(rtc_buf[RX8025_REG_MIN] & 0x7f); tm->rtc_hours = bcd2bin(rtc_buf[RX8025_REG_HOUR] & 0x3f); @@ -140,14 +189,14 @@ void RX8025::write_rtc_direct (rtc_time *tm) { rtc_buf[RX8025_REG_YEAR + 1] = bin2bcd(tm->rtc_year_raw); - rtc_buf[RX8025_REG_MON + 1] = bin2bcd(tm->rtc_month); + rtc_buf[RX8025_REG_MON + 1] = bin2bcd(tm->rtc_month); rtc_buf[RX8025_REG_WDAY + 1] = (tm->rtc_weekday & 0x07); - rtc_buf[RX8025_REG_DAY + 1] = bin2bcd(tm->rtc_date); + rtc_buf[RX8025_REG_DAY + 1] = bin2bcd(tm->rtc_date); rtc_buf[RX8025_REG_HOUR + 1] = bin2bcd(tm->rtc_hours); - rtc_buf[RX8025_REG_MIN + 1] = bin2bcd(tm->rtc_minutes); - rtc_buf[RX8025_REG_SEC + 1] = bin2bcd(tm->rtc_seconds); - rtc_buf[0] = RX8025_REG_SEC; - _i2c.write((int)RX8025_addr, (char *)rtc_buf, 8, false); + rtc_buf[RX8025_REG_MIN + 1] = bin2bcd(tm->rtc_minutes); + rtc_buf[RX8025_REG_SEC + 1] = bin2bcd(tm->rtc_seconds); + rtc_buf[0] = RX8025_REG_SEC << 4; + _i2c.write(RX8025_addr, rtc_buf, 8, false); } uint8_t RX8025::bin2bcd (uint8_t dt)