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 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:863510ffa8ff 14 * Original Information
kenjiArai 0:863510ffa8ff 15 * http://www.epsondevice.com/docs/qd/ja/DownloadServlet?id=ID000514
kenjiArai 0:863510ffa8ff 16 * http://www5.epsondevice.com/ja/quartz/product/rtc/i2c_bus/rtc8564je_nb.html
kenjiArai 0:863510ffa8ff 17 * Sensor board
kenjiArai 0:863510ffa8ff 18 * http://akizukidenshi.com/catalog/g/gI-00233/
kenjiArai 0:863510ffa8ff 19 */
kenjiArai 0:863510ffa8ff 20
kenjiArai 0:863510ffa8ff 21 #ifndef RTC8564_H
kenjiArai 0:863510ffa8ff 22 #define RTC8564_H
kenjiArai 0:863510ffa8ff 23
kenjiArai 0:863510ffa8ff 24 #include "mbed.h"
kenjiArai 0:863510ffa8ff 25
kenjiArai 0:863510ffa8ff 26 // RTC EPSON TOYOCOM RTC8564
kenjiArai 0:863510ffa8ff 27 // 7bit address = 0b1010001(No other choice)
kenjiArai 0:863510ffa8ff 28 #define RTC8564ADDR (0x51 << 1)
kenjiArai 0:863510ffa8ff 29
kenjiArai 0:863510ffa8ff 30 #define RTC_Wk_Monday ((uint8_t)0x01)
kenjiArai 0:863510ffa8ff 31 #define RTC_Wk_Tuesday ((uint8_t)0x02)
kenjiArai 0:863510ffa8ff 32 #define RTC_Wk_Wednesday ((uint8_t)0x03)
kenjiArai 0:863510ffa8ff 33 #define RTC_Wk_Thursday ((uint8_t)0x04)
kenjiArai 0:863510ffa8ff 34 #define RTC_Wk_Friday ((uint8_t)0x05)
kenjiArai 0:863510ffa8ff 35 #define RTC_Wk_Saturday ((uint8_t)0x06)
kenjiArai 0:863510ffa8ff 36 #define RTC_Wk_Sunday ((uint8_t)0x07)
kenjiArai 0:863510ffa8ff 37
kenjiArai 0:863510ffa8ff 38 // Register definition
kenjiArai 0:863510ffa8ff 39 #define RTC8564_REG_CONTL1 0
kenjiArai 0:863510ffa8ff 40 #define RTC8564_REG_CONTL2 1
kenjiArai 0:863510ffa8ff 41 #define RTC8564_REG_SEC 2
kenjiArai 0:863510ffa8ff 42 #define RTC8564_REG_MIN 3
kenjiArai 0:863510ffa8ff 43 #define RTC8564_REG_HOUR 4
kenjiArai 0:863510ffa8ff 44 #define RTC8564_REG_DAY 5
kenjiArai 0:863510ffa8ff 45 #define RTC8564_REG_WDAY 6
kenjiArai 0:863510ffa8ff 46 #define RTC8564_REG_MON 7
kenjiArai 0:863510ffa8ff 47 #define RTC8564_REG_YEAR 8
kenjiArai 0:863510ffa8ff 48 #define RTC8564_REG_ALARM_MIN 9
kenjiArai 0:863510ffa8ff 49 #define RTC8564_REG_ALARM_HOUR 0xa
kenjiArai 0:863510ffa8ff 50 #define RTC8564_REG_ALARM_DAY 0xb
kenjiArai 0:863510ffa8ff 51 #define RTC8564_REG_ALARM_WDAY 0xc
kenjiArai 0:863510ffa8ff 52 #define RTC8564_REG_CLK_OUT 0xd
kenjiArai 0:863510ffa8ff 53 #define RTC8564_REG_TMR_CTRL 0xe
kenjiArai 0:863510ffa8ff 54 #define RTC8564_REG_TIMER 0xf
kenjiArai 0:863510ffa8ff 55
kenjiArai 0:863510ffa8ff 56 // Buffer size
kenjiArai 0:863510ffa8ff 57 #define RTC_BUF_SIZ (RTC8564_REG_TIMER + 5)
kenjiArai 0:863510ffa8ff 58
kenjiArai 0:863510ffa8ff 59 /** Interface for RTC (I2C Interface) EPSON TOYOCOM RTC8564
kenjiArai 0:863510ffa8ff 60 *
kenjiArai 0:863510ffa8ff 61 * Standalone type RTC via I2C interface
kenjiArai 0:863510ffa8ff 62 *
kenjiArai 0:863510ffa8ff 63 * @code
kenjiArai 0:863510ffa8ff 64 * #include "mbed.h"
kenjiArai 0:863510ffa8ff 65 *
kenjiArai 0:863510ffa8ff 66 * // I2C Communication
kenjiArai 0:863510ffa8ff 67 * RTC8564 rtc8564(dp5,dp27); // RTC(RTC8564) SDA, SCL (Fixed address)
kenjiArai 0:863510ffa8ff 68 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:863510ffa8ff 69 * // you need to declare following method.
kenjiArai 0:863510ffa8ff 70 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:863510ffa8ff 71 * RTC8564 rtc8564(i2c); // RTC(RTC8564) (Fixed address)
kenjiArai 0:863510ffa8ff 72 *
kenjiArai 0:863510ffa8ff 73 * int main() {
kenjiArai 0:863510ffa8ff 74 * tm t;
kenjiArai 0:863510ffa8ff 75 * time_t seconds;
kenjiArai 0:863510ffa8ff 76 * char buf[40];
kenjiArai 0:863510ffa8ff 77 *
kenjiArai 0:863510ffa8ff 78 * rtc8564.get_time_rtc(&t); // read RTC data
kenjiArai 0:863510ffa8ff 79 * seconds = mktime(&t);
kenjiArai 0:863510ffa8ff 80 * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 0:863510ffa8ff 81 * printf("Date: %s\r\n", buf);
kenjiArai 0:863510ffa8ff 82 * }
kenjiArai 0:863510ffa8ff 83 * @endcode
kenjiArai 0:863510ffa8ff 84 */
kenjiArai 0:863510ffa8ff 85
kenjiArai 0:863510ffa8ff 86 class RTC8564
kenjiArai 0:863510ffa8ff 87 {
kenjiArai 0:863510ffa8ff 88 public:
kenjiArai 0:863510ffa8ff 89
kenjiArai 0:863510ffa8ff 90 typedef struct { // BCD format
kenjiArai 0:863510ffa8ff 91 uint8_t rtc_seconds;
kenjiArai 0:863510ffa8ff 92 uint8_t rtc_minutes;
kenjiArai 0:863510ffa8ff 93 uint8_t rtc_hours;
kenjiArai 0:863510ffa8ff 94 uint8_t rtc_weekday;
kenjiArai 0:863510ffa8ff 95 uint8_t rtc_date;
kenjiArai 0:863510ffa8ff 96 uint8_t rtc_month;
kenjiArai 0:863510ffa8ff 97 uint8_t rtc_year_raw;
kenjiArai 0:863510ffa8ff 98 uint16_t rtc_year;
kenjiArai 0:863510ffa8ff 99 } rtc_time;
kenjiArai 0:863510ffa8ff 100
kenjiArai 0:863510ffa8ff 101 /** Configure data pin
kenjiArai 0:863510ffa8ff 102 * @param data SDA and SCL pins
kenjiArai 0:863510ffa8ff 103 */
kenjiArai 0:863510ffa8ff 104 RTC8564(PinName p_sda, PinName p_scl);
kenjiArai 0:863510ffa8ff 105
kenjiArai 0:863510ffa8ff 106 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:863510ffa8ff 107 * @param I2C previous definition
kenjiArai 0:863510ffa8ff 108 */
kenjiArai 0:863510ffa8ff 109 RTC8564(I2C& p_i2c);
kenjiArai 0:863510ffa8ff 110
kenjiArai 0:863510ffa8ff 111 /** Read RTC data with Standard C "struct tm" format
kenjiArai 0:863510ffa8ff 112 * @param tm (data save area)
kenjiArai 0:863510ffa8ff 113 * @return none but all data in tm
kenjiArai 0:863510ffa8ff 114 */
kenjiArai 0:863510ffa8ff 115 void read_rtc_std(tm *);
kenjiArai 0:863510ffa8ff 116 void get_time_rtc(tm *);
kenjiArai 0:863510ffa8ff 117
kenjiArai 0:863510ffa8ff 118 /** Write data to RTC data with Standard C "struct tm" format
kenjiArai 0:863510ffa8ff 119 * @param tm (save writing data)
kenjiArai 0:863510ffa8ff 120 * @return none but all data in tm
kenjiArai 0:863510ffa8ff 121 */
kenjiArai 0:863510ffa8ff 122 void write_rtc_std(tm *);
kenjiArai 0:863510ffa8ff 123 void set_time_rtc(tm *);
kenjiArai 0:863510ffa8ff 124
kenjiArai 0:863510ffa8ff 125 /** Read one byte from specific register
kenjiArai 0:863510ffa8ff 126 * @param register address
kenjiArai 0:863510ffa8ff 127 * @return register data
kenjiArai 0:863510ffa8ff 128 */
kenjiArai 0:863510ffa8ff 129 uint8_t read_reg_byte(uint8_t reg);
kenjiArai 0:863510ffa8ff 130
kenjiArai 0:863510ffa8ff 131 /** Write one byte into specific register
kenjiArai 0:863510ffa8ff 132 * @param register address, data
kenjiArai 0:863510ffa8ff 133 * @return register saved data
kenjiArai 0:863510ffa8ff 134 */
kenjiArai 0:863510ffa8ff 135 uint8_t write_reg_byte(uint8_t reg, uint8_t data);
kenjiArai 0:863510ffa8ff 136
kenjiArai 0:863510ffa8ff 137 /** Read RTC data with own format
kenjiArai 0:863510ffa8ff 138 * @param tm (data save area)
kenjiArai 0:863510ffa8ff 139 * @return none but all data in tm
kenjiArai 0:863510ffa8ff 140 */
kenjiArai 0:863510ffa8ff 141 void read_rtc_direct(rtc_time *);
kenjiArai 0:863510ffa8ff 142
kenjiArai 0:863510ffa8ff 143 /** Read RTC data with own format
kenjiArai 0:863510ffa8ff 144 * @param tm (save writing data)
kenjiArai 0:863510ffa8ff 145 * @return none but all data in tm
kenjiArai 0:863510ffa8ff 146 */
kenjiArai 0:863510ffa8ff 147 void write_rtc_direct(rtc_time *);
kenjiArai 0:863510ffa8ff 148
kenjiArai 0:863510ffa8ff 149 /** Set I2C clock frequency
kenjiArai 0:863510ffa8ff 150 * @param freq.
kenjiArai 0:863510ffa8ff 151 * @return none
kenjiArai 0:863510ffa8ff 152 */
kenjiArai 0:863510ffa8ff 153 void frequency(int hz);
kenjiArai 0:863510ffa8ff 154
kenjiArai 0:863510ffa8ff 155 protected:
kenjiArai 0:863510ffa8ff 156 uint8_t bin2bcd(uint8_t);
kenjiArai 0:863510ffa8ff 157 uint8_t bcd2bin(uint8_t);
kenjiArai 0:863510ffa8ff 158
kenjiArai 1:d1b58c478a7a 159 I2C *_i2c_p;
kenjiArai 1:d1b58c478a7a 160 I2C &_i2c;
kenjiArai 0:863510ffa8ff 161
kenjiArai 0:863510ffa8ff 162 private:
kenjiArai 0:863510ffa8ff 163 uint8_t RTC8564_addr;
kenjiArai 0:863510ffa8ff 164 uint8_t rtc_buf[RTC_BUF_SIZ]; // buffer for RTC
kenjiArai 0:863510ffa8ff 165 };
kenjiArai 0:863510ffa8ff 166
kenjiArai 0:863510ffa8ff 167 #endif // RTC8564_H
kenjiArai 1:d1b58c478a7a 168