RX-8025NB Real Time Clock Module by EPSON

Dependents:   TYBLE16_simple_data_logger Check_external_RTC

Committer:
kenjiArai
Date:
Tue Aug 22 10:16:48 2017 +0000
Revision:
5:e8e8b1b6c103
Parent:
4:d8ce59684dfa
Child:
6:414dbeb77add
countermeasure for  NonCopyable

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 5:e8e8b1b6c103 6 * Copyright (c) 2015,'16,'17 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 5:e8e8b1b6c103 10 * Revised: August 21st, 2017
kenjiArai 0:cdf2921959b4 11 */
kenjiArai 3:d59c12d14ca9 12
kenjiArai 0:cdf2921959b4 13 /*
kenjiArai 5:e8e8b1b6c103 14 *---------------- REFERENCE ---------------------------------------------------
kenjiArai 0:cdf2921959b4 15 * Original Information
kenjiArai 5:e8e8b1b6c103 16 * http://www5.epsondevice.com/ja/products/rtc/rx8025nb.html
kenjiArai 5:e8e8b1b6c103 17 * Akizuki
kenjiArai 5:e8e8b1b6c103 18 * http://akizukidenshi.com/catalog/g/gK-08585/
kenjiArai 0:cdf2921959b4 19 */
kenjiArai 0:cdf2921959b4 20
kenjiArai 0:cdf2921959b4 21 #ifndef RX8025_H
kenjiArai 0:cdf2921959b4 22 #define RX8025_H
kenjiArai 0:cdf2921959b4 23
kenjiArai 0:cdf2921959b4 24 #include "mbed.h"
kenjiArai 0:cdf2921959b4 25
kenjiArai 0:cdf2921959b4 26 // RTC EPSON RX8025
kenjiArai 2:ce49c4ba4c02 27 // 7bit address = 0b0110010(No other choice)
kenjiArai 0:cdf2921959b4 28 #define RX8025ADDR (0x32 << 1)
kenjiArai 0:cdf2921959b4 29
kenjiArai 0:cdf2921959b4 30 #define RTC_Wk_Sunday ((uint8_t)0x00)
kenjiArai 0:cdf2921959b4 31 #define RTC_Wk_Monday ((uint8_t)0x01)
kenjiArai 0:cdf2921959b4 32 #define RTC_Wk_Tuesday ((uint8_t)0x02)
kenjiArai 0:cdf2921959b4 33 #define RTC_Wk_Wednesday ((uint8_t)0x03)
kenjiArai 0:cdf2921959b4 34 #define RTC_Wk_Thursday ((uint8_t)0x04)
kenjiArai 0:cdf2921959b4 35 #define RTC_Wk_Friday ((uint8_t)0x05)
kenjiArai 0:cdf2921959b4 36 #define RTC_Wk_Saturday ((uint8_t)0x06)
kenjiArai 0:cdf2921959b4 37
kenjiArai 0:cdf2921959b4 38 // Register definition
kenjiArai 4:d8ce59684dfa 39 #define RX8025_REG_SEC 0x0
kenjiArai 4:d8ce59684dfa 40 #define RX8025_REG_MIN 0x1
kenjiArai 4:d8ce59684dfa 41 #define RX8025_REG_HOUR 0x2
kenjiArai 4:d8ce59684dfa 42 #define RX8025_REG_WDAY 0x3
kenjiArai 4:d8ce59684dfa 43 #define RX8025_REG_DAY 0x4
kenjiArai 4:d8ce59684dfa 44 #define RX8025_REG_MON 0x5
kenjiArai 4:d8ce59684dfa 45 #define RX8025_REG_YEAR 0x6
kenjiArai 4:d8ce59684dfa 46 #define RX8025_REG_OFFSET 0x7
kenjiArai 4:d8ce59684dfa 47 #define RX8025_REG_ALARMW_MIN 0x8
kenjiArai 4:d8ce59684dfa 48 #define RX8025_REG_ALARMW_HOUR 0x9
kenjiArai 0:cdf2921959b4 49 #define RX8025_REG_ALARMW_WDAY 0xa
kenjiArai 0:cdf2921959b4 50 #define RX8025_REG_ALARMD_MIN 0xb
kenjiArai 0:cdf2921959b4 51 #define RX8025_REG_ALARMD_HOUR 0xc
kenjiArai 0:cdf2921959b4 52 #define RX8025_REG_RESERVED 0xd
kenjiArai 0:cdf2921959b4 53 #define RX8025_REG_CONTL1 0xe
kenjiArai 0:cdf2921959b4 54 #define RX8025_REG_CONTL2 0xf
kenjiArai 0:cdf2921959b4 55
kenjiArai 0:cdf2921959b4 56 // Buffer size
kenjiArai 0:cdf2921959b4 57 #define RTC_BUF_SIZ (RX8025_REG_CONTL2 + 5)
kenjiArai 0:cdf2921959b4 58
kenjiArai 0:cdf2921959b4 59 /** Interface for RTC (I2C Interface) EPSON RX8025
kenjiArai 0:cdf2921959b4 60 *
kenjiArai 0:cdf2921959b4 61 * Standalone type RTC via I2C interface
kenjiArai 0:cdf2921959b4 62 *
kenjiArai 0:cdf2921959b4 63 * @code
kenjiArai 0:cdf2921959b4 64 * #include "mbed.h"
kenjiArai 0:cdf2921959b4 65 *
kenjiArai 0:cdf2921959b4 66 * // I2C Communication
kenjiArai 0:cdf2921959b4 67 * RX8025 RX8025(dp5,dp27); // RTC(RX8025) SDA, SCL (Fixed address)
kenjiArai 0:cdf2921959b4 68 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:cdf2921959b4 69 * // you need to declare following method.
kenjiArai 0:cdf2921959b4 70 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:cdf2921959b4 71 * RX8025 RX8025(i2c); // RTC(RX8025) (Fixed address)
kenjiArai 0:cdf2921959b4 72 *
kenjiArai 0:cdf2921959b4 73 * int main() {
kenjiArai 0:cdf2921959b4 74 * tm t;
kenjiArai 0:cdf2921959b4 75 * time_t seconds;
kenjiArai 0:cdf2921959b4 76 * char buf[40];
kenjiArai 0:cdf2921959b4 77 *
kenjiArai 2:ce49c4ba4c02 78 * while(1){
kenjiArai 2:ce49c4ba4c02 79 * RX8025.get_time_rtc(&t); // read RTC data
kenjiArai 2:ce49c4ba4c02 80 * seconds = mktime(&t);
kenjiArai 2:ce49c4ba4c02 81 * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 2:ce49c4ba4c02 82 * printf("Date: %s\r\n", buf);
kenjiArai 2:ce49c4ba4c02 83 * }
kenjiArai 0:cdf2921959b4 84 * }
kenjiArai 0:cdf2921959b4 85 * @endcode
kenjiArai 0:cdf2921959b4 86 */
kenjiArai 0:cdf2921959b4 87
kenjiArai 0:cdf2921959b4 88 class RX8025
kenjiArai 0:cdf2921959b4 89 {
kenjiArai 0:cdf2921959b4 90 public:
kenjiArai 0:cdf2921959b4 91
kenjiArai 0:cdf2921959b4 92 typedef struct { // BCD format
kenjiArai 0:cdf2921959b4 93 uint8_t rtc_seconds;
kenjiArai 0:cdf2921959b4 94 uint8_t rtc_minutes;
kenjiArai 0:cdf2921959b4 95 uint8_t rtc_hours;
kenjiArai 0:cdf2921959b4 96 uint8_t rtc_weekday;
kenjiArai 0:cdf2921959b4 97 uint8_t rtc_date;
kenjiArai 0:cdf2921959b4 98 uint8_t rtc_month;
kenjiArai 0:cdf2921959b4 99 uint8_t rtc_year_raw;
kenjiArai 0:cdf2921959b4 100 uint16_t rtc_year;
kenjiArai 0:cdf2921959b4 101 } rtc_time;
kenjiArai 0:cdf2921959b4 102
kenjiArai 5:e8e8b1b6c103 103 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:cdf2921959b4 104 * @param data SDA and SCL pins
kenjiArai 0:cdf2921959b4 105 */
kenjiArai 0:cdf2921959b4 106 RX8025(PinName p_sda, PinName p_scl);
kenjiArai 0:cdf2921959b4 107
kenjiArai 0:cdf2921959b4 108 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:cdf2921959b4 109 * @param I2C previous definition
kenjiArai 0:cdf2921959b4 110 */
kenjiArai 0:cdf2921959b4 111 RX8025(I2C& p_i2c);
kenjiArai 0:cdf2921959b4 112
kenjiArai 0:cdf2921959b4 113 /** Read RTC data with Standard C "struct tm" format
kenjiArai 0:cdf2921959b4 114 * @param tm (data save area)
kenjiArai 0:cdf2921959b4 115 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 116 */
kenjiArai 0:cdf2921959b4 117 void read_rtc_std(tm *);
kenjiArai 0:cdf2921959b4 118 void get_time_rtc(tm *);
kenjiArai 0:cdf2921959b4 119
kenjiArai 0:cdf2921959b4 120 /** Write data to RTC data with Standard C "struct tm" format
kenjiArai 0:cdf2921959b4 121 * @param tm (save writing data)
kenjiArai 0:cdf2921959b4 122 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 123 */
kenjiArai 0:cdf2921959b4 124 void write_rtc_std(tm *);
kenjiArai 0:cdf2921959b4 125 void set_time_rtc(tm *);
kenjiArai 0:cdf2921959b4 126
kenjiArai 2:ce49c4ba4c02 127 /** Set Alarm-D / INTA time
kenjiArai 4:d8ce59684dfa 128 * @param next time (unit: minutes) from now on minimum = 2 minutes!!
kenjiArai 2:ce49c4ba4c02 129 * @return none
kenjiArai 2:ce49c4ba4c02 130 */
kenjiArai 2:ce49c4ba4c02 131 void set_next_alarmD_INTA(uint16_t time);
kenjiArai 2:ce49c4ba4c02 132
kenjiArai 2:ce49c4ba4c02 133 /** Clear Alarm-D / INTA interrupt
kenjiArai 2:ce49c4ba4c02 134 * @param none
kenjiArai 2:ce49c4ba4c02 135 * @return none
kenjiArai 2:ce49c4ba4c02 136 */
kenjiArai 2:ce49c4ba4c02 137 void clear_alarmD_INTA(void);
kenjiArai 2:ce49c4ba4c02 138
kenjiArai 0:cdf2921959b4 139 /** Read one byte from specific register
kenjiArai 0:cdf2921959b4 140 * @param register address
kenjiArai 0:cdf2921959b4 141 * @return register data
kenjiArai 0:cdf2921959b4 142 */
kenjiArai 0:cdf2921959b4 143 uint8_t read_reg_byte(uint8_t reg);
kenjiArai 0:cdf2921959b4 144
kenjiArai 0:cdf2921959b4 145 /** Write one byte into specific register
kenjiArai 0:cdf2921959b4 146 * @param register address, data
kenjiArai 0:cdf2921959b4 147 * @return register saved data
kenjiArai 0:cdf2921959b4 148 */
kenjiArai 0:cdf2921959b4 149 uint8_t write_reg_byte(uint8_t reg, uint8_t data);
kenjiArai 0:cdf2921959b4 150
kenjiArai 0:cdf2921959b4 151 /** Read RTC data with own format
kenjiArai 0:cdf2921959b4 152 * @param tm (data save area)
kenjiArai 0:cdf2921959b4 153 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 154 */
kenjiArai 0:cdf2921959b4 155 void read_rtc_direct(rtc_time *);
kenjiArai 0:cdf2921959b4 156
kenjiArai 0:cdf2921959b4 157 /** Read RTC data with own format
kenjiArai 0:cdf2921959b4 158 * @param tm (save writing data)
kenjiArai 0:cdf2921959b4 159 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 160 */
kenjiArai 0:cdf2921959b4 161 void write_rtc_direct(rtc_time *);
kenjiArai 0:cdf2921959b4 162
kenjiArai 0:cdf2921959b4 163 /** Set I2C clock frequency
kenjiArai 0:cdf2921959b4 164 * @param freq.
kenjiArai 0:cdf2921959b4 165 * @return none
kenjiArai 0:cdf2921959b4 166 */
kenjiArai 0:cdf2921959b4 167 void frequency(int hz);
kenjiArai 0:cdf2921959b4 168
kenjiArai 0:cdf2921959b4 169 protected:
kenjiArai 5:e8e8b1b6c103 170 I2C *_i2c_p;
kenjiArai 5:e8e8b1b6c103 171 I2C &_i2c;
kenjiArai 2:ce49c4ba4c02 172
kenjiArai 0:cdf2921959b4 173 uint8_t bin2bcd(uint8_t);
kenjiArai 0:cdf2921959b4 174 uint8_t bcd2bin(uint8_t);
kenjiArai 4:d8ce59684dfa 175 uint8_t set_alarmD_reg (uint16_t time);
kenjiArai 1:817e81048235 176 void init(void);
kenjiArai 0:cdf2921959b4 177
kenjiArai 0:cdf2921959b4 178 private:
kenjiArai 0:cdf2921959b4 179 uint8_t RX8025_addr;
kenjiArai 2:ce49c4ba4c02 180 char rtc_buf[RTC_BUF_SIZ]; // buffer for RTC
kenjiArai 0:cdf2921959b4 181 };
kenjiArai 0:cdf2921959b4 182
kenjiArai 0:cdf2921959b4 183 #endif // RX8025_H