RX-8025NB Real Time Clock Module by EPSON

Dependents:   TYBLE16_simple_data_logger Check_external_RTC

Committer:
kenjiArai
Date:
Fri Aug 07 06:21:58 2020 +0000
Revision:
8:c8aebe7e802d
Parent:
7:4793c4817590
deleted unused line

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 7:4793c4817590 6 * Copyright (c) 2015,'16,'17,'19,'20 Kenji Arai / JH1PJL
kenjiArai 7:4793c4817590 7 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 7:4793c4817590 8 * https://os.mbed.com/users/kenjiArai/
kenjiArai 7:4793c4817590 9 * Created: June 3rd, 2015
kenjiArai 7:4793c4817590 10 * Revised: August 7th, 2020
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 // Register definition
kenjiArai 4:d8ce59684dfa 31 #define RX8025_REG_SEC 0x0
kenjiArai 4:d8ce59684dfa 32 #define RX8025_REG_MIN 0x1
kenjiArai 4:d8ce59684dfa 33 #define RX8025_REG_HOUR 0x2
kenjiArai 4:d8ce59684dfa 34 #define RX8025_REG_WDAY 0x3
kenjiArai 4:d8ce59684dfa 35 #define RX8025_REG_DAY 0x4
kenjiArai 4:d8ce59684dfa 36 #define RX8025_REG_MON 0x5
kenjiArai 4:d8ce59684dfa 37 #define RX8025_REG_YEAR 0x6
kenjiArai 4:d8ce59684dfa 38 #define RX8025_REG_OFFSET 0x7
kenjiArai 4:d8ce59684dfa 39 #define RX8025_REG_ALARMW_MIN 0x8
kenjiArai 4:d8ce59684dfa 40 #define RX8025_REG_ALARMW_HOUR 0x9
kenjiArai 0:cdf2921959b4 41 #define RX8025_REG_ALARMW_WDAY 0xa
kenjiArai 0:cdf2921959b4 42 #define RX8025_REG_ALARMD_MIN 0xb
kenjiArai 0:cdf2921959b4 43 #define RX8025_REG_ALARMD_HOUR 0xc
kenjiArai 0:cdf2921959b4 44 #define RX8025_REG_RESERVED 0xd
kenjiArai 0:cdf2921959b4 45 #define RX8025_REG_CONTL1 0xe
kenjiArai 0:cdf2921959b4 46 #define RX8025_REG_CONTL2 0xf
kenjiArai 0:cdf2921959b4 47
kenjiArai 0:cdf2921959b4 48 // Buffer size
kenjiArai 0:cdf2921959b4 49 #define RTC_BUF_SIZ (RX8025_REG_CONTL2 + 5)
kenjiArai 0:cdf2921959b4 50
kenjiArai 7:4793c4817590 51 typedef enum {
kenjiArai 7:4793c4817590 52 RTC_SQW_NONE = 0,
kenjiArai 7:4793c4817590 53 RTC_SQW_32KHZ
kenjiArai 7:4793c4817590 54 } sq_wave_t;
kenjiArai 7:4793c4817590 55
kenjiArai 0:cdf2921959b4 56 /** Interface for RTC (I2C Interface) EPSON RX8025
kenjiArai 0:cdf2921959b4 57 *
kenjiArai 0:cdf2921959b4 58 * Standalone type RTC via I2C interface
kenjiArai 0:cdf2921959b4 59 *
kenjiArai 0:cdf2921959b4 60 * @code
kenjiArai 0:cdf2921959b4 61 * #include "mbed.h"
kenjiArai 7:4793c4817590 62 * #include "RX8025NB.h"
kenjiArai 0:cdf2921959b4 63 *
kenjiArai 0:cdf2921959b4 64 * // I2C Communication
kenjiArai 0:cdf2921959b4 65 * RX8025 RX8025(dp5,dp27); // RTC(RX8025) SDA, SCL (Fixed address)
kenjiArai 0:cdf2921959b4 66 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:cdf2921959b4 67 * // you need to declare following method.
kenjiArai 0:cdf2921959b4 68 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:cdf2921959b4 69 * RX8025 RX8025(i2c); // RTC(RX8025) (Fixed address)
kenjiArai 0:cdf2921959b4 70 *
kenjiArai 0:cdf2921959b4 71 * int main() {
kenjiArai 0:cdf2921959b4 72 * tm t;
kenjiArai 0:cdf2921959b4 73 * time_t seconds;
kenjiArai 0:cdf2921959b4 74 * char buf[40];
kenjiArai 0:cdf2921959b4 75 *
kenjiArai 2:ce49c4ba4c02 76 * while(1){
kenjiArai 2:ce49c4ba4c02 77 * RX8025.get_time_rtc(&t); // read RTC data
kenjiArai 2:ce49c4ba4c02 78 * seconds = mktime(&t);
kenjiArai 2:ce49c4ba4c02 79 * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 2:ce49c4ba4c02 80 * printf("Date: %s\r\n", buf);
kenjiArai 2:ce49c4ba4c02 81 * }
kenjiArai 0:cdf2921959b4 82 * }
kenjiArai 0:cdf2921959b4 83 * @endcode
kenjiArai 0:cdf2921959b4 84 */
kenjiArai 0:cdf2921959b4 85
kenjiArai 0:cdf2921959b4 86 class RX8025
kenjiArai 0:cdf2921959b4 87 {
kenjiArai 0:cdf2921959b4 88 public:
kenjiArai 0:cdf2921959b4 89
kenjiArai 0:cdf2921959b4 90 typedef struct { // BCD format
kenjiArai 0:cdf2921959b4 91 uint8_t rtc_seconds;
kenjiArai 0:cdf2921959b4 92 uint8_t rtc_minutes;
kenjiArai 0:cdf2921959b4 93 uint8_t rtc_hours;
kenjiArai 0:cdf2921959b4 94 uint8_t rtc_weekday;
kenjiArai 0:cdf2921959b4 95 uint8_t rtc_date;
kenjiArai 0:cdf2921959b4 96 uint8_t rtc_month;
kenjiArai 0:cdf2921959b4 97 uint8_t rtc_year_raw;
kenjiArai 0:cdf2921959b4 98 uint16_t rtc_year;
kenjiArai 0:cdf2921959b4 99 } rtc_time;
kenjiArai 0:cdf2921959b4 100
kenjiArai 5:e8e8b1b6c103 101 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:cdf2921959b4 102 * @param data SDA and SCL pins
kenjiArai 0:cdf2921959b4 103 */
kenjiArai 0:cdf2921959b4 104 RX8025(PinName p_sda, PinName p_scl);
kenjiArai 0:cdf2921959b4 105
kenjiArai 0:cdf2921959b4 106 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:cdf2921959b4 107 * @param I2C previous definition
kenjiArai 0:cdf2921959b4 108 */
kenjiArai 0:cdf2921959b4 109 RX8025(I2C& p_i2c);
kenjiArai 0:cdf2921959b4 110
kenjiArai 0:cdf2921959b4 111 /** Read RTC data with Standard C "struct tm" format
kenjiArai 0:cdf2921959b4 112 * @param tm (data save area)
kenjiArai 0:cdf2921959b4 113 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 114 */
kenjiArai 0:cdf2921959b4 115 void read_rtc_std(tm *);
kenjiArai 0:cdf2921959b4 116 void get_time_rtc(tm *);
kenjiArai 0:cdf2921959b4 117
kenjiArai 0:cdf2921959b4 118 /** Write data to RTC data with Standard C "struct tm" format
kenjiArai 0:cdf2921959b4 119 * @param tm (save writing data)
kenjiArai 0:cdf2921959b4 120 * @return none but all data in tm
kenjiArai 0:cdf2921959b4 121 */
kenjiArai 0:cdf2921959b4 122 void write_rtc_std(tm *);
kenjiArai 0:cdf2921959b4 123 void set_time_rtc(tm *);
kenjiArai 0:cdf2921959b4 124
kenjiArai 2:ce49c4ba4c02 125 /** Set Alarm-D / INTA time
kenjiArai 4:d8ce59684dfa 126 * @param next time (unit: minutes) from now on minimum = 2 minutes!!
kenjiArai 2:ce49c4ba4c02 127 * @return none
kenjiArai 2:ce49c4ba4c02 128 */
kenjiArai 7:4793c4817590 129 void set_next_alarmD_INTA(uint16_t);
kenjiArai 7:4793c4817590 130 void set_next_IRQ(uint16_t);
kenjiArai 2:ce49c4ba4c02 131
kenjiArai 2:ce49c4ba4c02 132 /** Clear Alarm-D / INTA interrupt
kenjiArai 2:ce49c4ba4c02 133 * @param none
kenjiArai 2:ce49c4ba4c02 134 * @return none
kenjiArai 2:ce49c4ba4c02 135 */
kenjiArai 2:ce49c4ba4c02 136 void clear_alarmD_INTA(void);
kenjiArai 7:4793c4817590 137 void clear_IRQ(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 7:4793c4817590 143 uint8_t read_reg_byte(uint8_t);
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 7:4793c4817590 149 uint8_t write_reg_byte(uint8_t, uint8_t);
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 7:4793c4817590 167 void frequency(int);
kenjiArai 7:4793c4817590 168
kenjiArai 7:4793c4817590 169 /** Control FOUT output port (FOE pin must high when 32.768kHz output)
kenjiArai 7:4793c4817590 170 * @param output_mode
kenjiArai 7:4793c4817590 171 * @return none
kenjiArai 7:4793c4817590 172 */
kenjiArai 7:4793c4817590 173 void set_sq_wave(sq_wave_t);
kenjiArai 0:cdf2921959b4 174
kenjiArai 0:cdf2921959b4 175 protected:
kenjiArai 5:e8e8b1b6c103 176 I2C *_i2c_p;
kenjiArai 5:e8e8b1b6c103 177 I2C &_i2c;
kenjiArai 2:ce49c4ba4c02 178
kenjiArai 0:cdf2921959b4 179 uint8_t bin2bcd(uint8_t);
kenjiArai 0:cdf2921959b4 180 uint8_t bcd2bin(uint8_t);
kenjiArai 7:4793c4817590 181 void set_alarmD_reg (uint16_t);
kenjiArai 1:817e81048235 182 void init(void);
kenjiArai 0:cdf2921959b4 183
kenjiArai 0:cdf2921959b4 184 private:
kenjiArai 0:cdf2921959b4 185 uint8_t RX8025_addr;
kenjiArai 7:4793c4817590 186 uint8_t rtc_buf[RTC_BUF_SIZ]; // buffer for RTC
kenjiArai 7:4793c4817590 187
kenjiArai 0:cdf2921959b4 188 };
kenjiArai 0:cdf2921959b4 189
kenjiArai 0:cdf2921959b4 190 #endif // RX8025_H