RTC-8564NB Real Time Clock Module by EPSON TOYOCOM
Diff: RTC8564.h
- Revision:
- 0:863510ffa8ff
- Child:
- 1:d1b58c478a7a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RTC8564.h Sat Mar 14 05:00:12 2015 +0000 @@ -0,0 +1,172 @@ +/* + * mbed library program + * Control RTC-8564NB Real Time Clock Module + * EPSON TOYOCOM + * + * Copyright (c) 2015 Kenji Arai / JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * Created: Feburary 1st, 2015 + * Revised: March 14th, 2015 + * + * 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 + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* + *---------------- REFERENCE ---------------------------------------------------------------------- + * Original Information + * http://www.epsondevice.com/docs/qd/ja/DownloadServlet?id=ID000514 + * http://www5.epsondevice.com/ja/quartz/product/rtc/i2c_bus/rtc8564je_nb.html + * Sensor board + * http://akizukidenshi.com/catalog/g/gI-00233/ + */ + +#ifndef RTC8564_H +#define RTC8564_H + +#include "mbed.h" + +// RTC EPSON TOYOCOM RTC8564 +// 7bit address = 0b1010001(No other choice) +#define RTC8564ADDR (0x51 << 1) + +#define RTC_Wk_Monday ((uint8_t)0x01) +#define RTC_Wk_Tuesday ((uint8_t)0x02) +#define RTC_Wk_Wednesday ((uint8_t)0x03) +#define RTC_Wk_Thursday ((uint8_t)0x04) +#define RTC_Wk_Friday ((uint8_t)0x05) +#define RTC_Wk_Saturday ((uint8_t)0x06) +#define RTC_Wk_Sunday ((uint8_t)0x07) + +// Register definition +#define RTC8564_REG_CONTL1 0 +#define RTC8564_REG_CONTL2 1 +#define RTC8564_REG_SEC 2 +#define RTC8564_REG_MIN 3 +#define RTC8564_REG_HOUR 4 +#define RTC8564_REG_DAY 5 +#define RTC8564_REG_WDAY 6 +#define RTC8564_REG_MON 7 +#define RTC8564_REG_YEAR 8 +#define RTC8564_REG_ALARM_MIN 9 +#define RTC8564_REG_ALARM_HOUR 0xa +#define RTC8564_REG_ALARM_DAY 0xb +#define RTC8564_REG_ALARM_WDAY 0xc +#define RTC8564_REG_CLK_OUT 0xd +#define RTC8564_REG_TMR_CTRL 0xe +#define RTC8564_REG_TIMER 0xf + +// Buffer size +#define RTC_BUF_SIZ (RTC8564_REG_TIMER + 5) + +/** Interface for RTC (I2C Interface) EPSON TOYOCOM RTC8564 + * + * Standalone type RTC via I2C interface + * + * @code + * #include "mbed.h" + * + * // I2C Communication + * RTC8564 rtc8564(dp5,dp27); // RTC(RTC8564) SDA, SCL (Fixed address) + * // If you connected I2C line not only this device but also other devices, + * // you need to declare following method. + * I2C i2c(dp5,dp27); // SDA, SCL + * RTC8564 rtc8564(i2c); // RTC(RTC8564) (Fixed address) + * + * int main() { + * tm t; + * time_t seconds; + * char buf[40]; + * + * rtc8564.get_time_rtc(&t); // read RTC data + * seconds = mktime(&t); + * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds)); + * printf("Date: %s\r\n", buf); + * } + * @endcode + */ + +class RTC8564 +{ +public: + + typedef struct { // BCD format + uint8_t rtc_seconds; + uint8_t rtc_minutes; + uint8_t rtc_hours; + uint8_t rtc_weekday; + uint8_t rtc_date; + uint8_t rtc_month; + uint8_t rtc_year_raw; + uint16_t rtc_year; + } rtc_time; + + /** Configure data pin + * @param data SDA and SCL pins + */ + RTC8564(PinName p_sda, PinName p_scl); + + /** Configure data pin (with other devices on I2C line) + * @param I2C previous definition + */ + RTC8564(I2C& p_i2c); + + /** Read RTC data with Standard C "struct tm" format + * @param tm (data save area) + * @return none but all data in tm + */ + void read_rtc_std(tm *); + void get_time_rtc(tm *); + + /** Write data to RTC data with Standard C "struct tm" format + * @param tm (save writing data) + * @return none but all data in tm + */ + void write_rtc_std(tm *); + void set_time_rtc(tm *); + + /** Read one byte from specific register + * @param register address + * @return register data + */ + uint8_t read_reg_byte(uint8_t reg); + + /** Write one byte into specific register + * @param register address, data + * @return register saved data + */ + uint8_t write_reg_byte(uint8_t reg, uint8_t data); + + /** Read RTC data with own format + * @param tm (data save area) + * @return none but all data in tm + */ + void read_rtc_direct(rtc_time *); + + /** Read RTC data with own format + * @param tm (save writing data) + * @return none but all data in tm + */ + void write_rtc_direct(rtc_time *); + + /** Set I2C clock frequency + * @param freq. + * @return none + */ + void frequency(int hz); + +protected: + uint8_t bin2bcd(uint8_t); + uint8_t bcd2bin(uint8_t); + + I2C _i2c; + +private: + uint8_t RTC8564_addr; + uint8_t rtc_buf[RTC_BUF_SIZ]; // buffer for RTC +}; + +#endif // RTC8564_H