RTC-8564NB Real Time Clock Module by EPSON TOYOCOM

Committer:
kenjiArai
Date:
Sat Mar 14 05:00:12 2015 +0000
Revision:
0:863510ffa8ff
Child:
1:d1b58c478a7a
RTC-8564NB Real Time Clock Module by EPSON TOYOCOM, 1st revision.

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