M41T62 is a serial real-time clock (RTC) made by STMicroelectronics.

Dependents:   LPC1114_data_logger Check_external_RTC LPC1114_barometer_with_data_logging

Committer:
kenjiArai
Date:
Wed Aug 23 09:26:41 2017 +0000
Revision:
4:0c07690cb24f
Parent:
3:41c351da2fdf
Child:
5:959683e91979
countermeasure for  NonCopyable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:2919f8bd90f3 1 /*
kenjiArai 3:41c351da2fdf 2 * mbed library program
kenjiArai 0:2919f8bd90f3 3 * Control M41T62 RTC Module
kenjiArai 0:2919f8bd90f3 4 *
kenjiArai 4:0c07690cb24f 5 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
kenjiArai 0:2919f8bd90f3 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:2919f8bd90f3 7 * http://mbed.org/users/kenjiArai/
kenjiArai 4:0c07690cb24f 8 * Created: June 21st, 2014
kenjiArai 4:0c07690cb24f 9 * Revised: August 23rd, 2017
kenjiArai 0:2919f8bd90f3 10 */
kenjiArai 0:2919f8bd90f3 11 /*
kenjiArai 0:2919f8bd90f3 12 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:2919f8bd90f3 13 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM151/CL1410/SC403/PF82507
kenjiArai 1:9d7702a887d3 14 * http://strawberry-linux.com/catalog/items?code=12062
kenjiArai 0:2919f8bd90f3 15 */
kenjiArai 0:2919f8bd90f3 16
kenjiArai 0:2919f8bd90f3 17 #include "mbed.h"
kenjiArai 0:2919f8bd90f3 18 #include "m41t62_rtc.h"
kenjiArai 0:2919f8bd90f3 19
kenjiArai 4:0c07690cb24f 20 M41T62::M41T62 (PinName p_sda, PinName p_scl)
kenjiArai 4:0c07690cb24f 21 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 3:41c351da2fdf 22 {
kenjiArai 1:9d7702a887d3 23 M41T62_addr = M41T62ADDR;
kenjiArai 3:41c351da2fdf 24 _i2c.frequency(100000);
kenjiArai 1:9d7702a887d3 25 }
kenjiArai 1:9d7702a887d3 26
kenjiArai 4:0c07690cb24f 27 M41T62::M41T62 (I2C& p_i2c)
kenjiArai 4:0c07690cb24f 28 : _i2c(p_i2c)
kenjiArai 3:41c351da2fdf 29 {
kenjiArai 0:2919f8bd90f3 30 M41T62_addr = M41T62ADDR;
kenjiArai 3:41c351da2fdf 31 _i2c.frequency(100000);
kenjiArai 0:2919f8bd90f3 32 }
kenjiArai 0:2919f8bd90f3 33
kenjiArai 3:41c351da2fdf 34 void M41T62::read_rtc_std (tm *t)
kenjiArai 3:41c351da2fdf 35 {
kenjiArai 3:41c351da2fdf 36 rtc_time time;
kenjiArai 1:9d7702a887d3 37
kenjiArai 1:9d7702a887d3 38 read_rtc_direct(&time);
kenjiArai 1:9d7702a887d3 39 t->tm_sec = time.rtc_seconds;
kenjiArai 1:9d7702a887d3 40 t->tm_min = time.rtc_minutes;
kenjiArai 1:9d7702a887d3 41 t->tm_hour = time.rtc_hours;
kenjiArai 1:9d7702a887d3 42 t->tm_mday = time.rtc_date;
kenjiArai 3:41c351da2fdf 43 if ( time.rtc_weekday == RTC_Wk_Sunday) {
kenjiArai 1:9d7702a887d3 44 t->tm_wday = 0; // Sun is not 7 but 0
kenjiArai 1:9d7702a887d3 45 } else {
kenjiArai 1:9d7702a887d3 46 t->tm_wday = time.rtc_weekday;
kenjiArai 1:9d7702a887d3 47 }
kenjiArai 1:9d7702a887d3 48 t->tm_mon = time.rtc_month - 1;
kenjiArai 1:9d7702a887d3 49 t->tm_year = time.rtc_year_raw + 100;
kenjiArai 1:9d7702a887d3 50 t->tm_isdst= 0;
kenjiArai 0:2919f8bd90f3 51 }
kenjiArai 0:2919f8bd90f3 52
kenjiArai 3:41c351da2fdf 53 void M41T62::write_rtc_std (tm *t)
kenjiArai 3:41c351da2fdf 54 {
kenjiArai 3:41c351da2fdf 55 rtc_time time;
kenjiArai 3:41c351da2fdf 56
kenjiArai 1:9d7702a887d3 57 time.rtc_seconds = t->tm_sec;
kenjiArai 1:9d7702a887d3 58 time.rtc_minutes = t->tm_min;
kenjiArai 1:9d7702a887d3 59 time.rtc_hours = t->tm_hour;
kenjiArai 1:9d7702a887d3 60 time.rtc_date = t->tm_mday;
kenjiArai 3:41c351da2fdf 61 if ( t->tm_wday == 0) {
kenjiArai 1:9d7702a887d3 62 time.rtc_weekday = RTC_Wk_Sunday;
kenjiArai 1:9d7702a887d3 63 } else {
kenjiArai 1:9d7702a887d3 64 time.rtc_weekday = t->tm_wday;
kenjiArai 1:9d7702a887d3 65 }
kenjiArai 1:9d7702a887d3 66 time.rtc_month = t->tm_mon + 1;
kenjiArai 1:9d7702a887d3 67 time.rtc_year_raw = t->tm_year - 100;
kenjiArai 1:9d7702a887d3 68 write_rtc_direct(&time);
kenjiArai 1:9d7702a887d3 69 }
kenjiArai 1:9d7702a887d3 70
kenjiArai 3:41c351da2fdf 71 void M41T62::read_rtc_direct (rtc_time *tm)
kenjiArai 3:41c351da2fdf 72 {
kenjiArai 3:41c351da2fdf 73 uint8_t eep_dt;
kenjiArai 0:2919f8bd90f3 74
kenjiArai 0:2919f8bd90f3 75 eep_dt = M41T62_REG_SSEC;
kenjiArai 3:41c351da2fdf 76 _i2c.write((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 3:41c351da2fdf 77 _i2c.read((int)M41T62_addr, (char *)rtc_buf, 8);
kenjiArai 0:2919f8bd90f3 78 tm->rtc_seconds = bcd2bin(rtc_buf[M41T62_REG_SEC] & 0x7f);
kenjiArai 0:2919f8bd90f3 79 tm->rtc_minutes = bcd2bin(rtc_buf[M41T62_REG_MIN] & 0x7f);
kenjiArai 0:2919f8bd90f3 80 tm->rtc_hours = bcd2bin(rtc_buf[M41T62_REG_HOUR] & 0x3f);
kenjiArai 0:2919f8bd90f3 81 tm->rtc_date = bcd2bin(rtc_buf[M41T62_REG_DAY] & 0x3f);
kenjiArai 0:2919f8bd90f3 82 tm->rtc_weekday = rtc_buf[M41T62_REG_WDAY] & 0x07;
kenjiArai 0:2919f8bd90f3 83 tm->rtc_month = bcd2bin(rtc_buf[M41T62_REG_MON] & 0x1f);
kenjiArai 1:9d7702a887d3 84 tm->rtc_year_raw= bcd2bin(rtc_buf[M41T62_REG_YEAR]);
kenjiArai 1:9d7702a887d3 85 tm->rtc_year = tm->rtc_year_raw + 100 + 1900;
kenjiArai 0:2919f8bd90f3 86 }
kenjiArai 0:2919f8bd90f3 87
kenjiArai 3:41c351da2fdf 88 void M41T62::write_rtc_direct (rtc_time *tm)
kenjiArai 3:41c351da2fdf 89 {
kenjiArai 3:41c351da2fdf 90 uint8_t eep_dt;
kenjiArai 0:2919f8bd90f3 91
kenjiArai 0:2919f8bd90f3 92 eep_dt = M41T62_REG_SSEC;
kenjiArai 3:41c351da2fdf 93 _i2c.write((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 3:41c351da2fdf 94 _i2c.read((int)M41T62_addr, (char *)rtc_buf, 8);
kenjiArai 0:2919f8bd90f3 95 rtc_buf[0] = M41T62_REG_SSEC;
kenjiArai 0:2919f8bd90f3 96 rtc_buf[M41T62_REG_SSEC + 1] = 0;
kenjiArai 3:41c351da2fdf 97 rtc_buf[M41T62_REG_YEAR + 1] = bin2bcd(tm->rtc_year_raw);
kenjiArai 0:2919f8bd90f3 98 rtc_buf[M41T62_REG_MON + 1] = bin2bcd(tm->rtc_month) | (rtc_buf[M41T62_REG_MON] & ~0x1f);
kenjiArai 0:2919f8bd90f3 99 rtc_buf[M41T62_REG_DAY + 1] = bin2bcd(tm->rtc_date) | (rtc_buf[M41T62_REG_DAY] & ~0x3f);
kenjiArai 0:2919f8bd90f3 100 rtc_buf[M41T62_REG_WDAY + 1] = (tm->rtc_weekday & 0x07) | (rtc_buf[M41T62_REG_WDAY] & ~0x07);
kenjiArai 0:2919f8bd90f3 101 rtc_buf[M41T62_REG_HOUR + 1] = bin2bcd(tm->rtc_hours) | (rtc_buf[M41T62_REG_HOUR] & ~0x3f);
kenjiArai 0:2919f8bd90f3 102 rtc_buf[M41T62_REG_MIN + 1] = bin2bcd(tm->rtc_minutes) | (rtc_buf[M41T62_REG_MIN] & ~0x7f);
kenjiArai 3:41c351da2fdf 103 rtc_buf[M41T62_REG_SEC + 1] = bin2bcd(tm->rtc_seconds) | (rtc_buf[M41T62_REG_SEC] & ~0x7f);
kenjiArai 3:41c351da2fdf 104 _i2c.write((int)M41T62_addr, (char *)rtc_buf, 9);
kenjiArai 0:2919f8bd90f3 105 }
kenjiArai 0:2919f8bd90f3 106
kenjiArai 3:41c351da2fdf 107 void M41T62::frequency(int hz)
kenjiArai 3:41c351da2fdf 108 {
kenjiArai 3:41c351da2fdf 109 _i2c.frequency(hz);
kenjiArai 3:41c351da2fdf 110 }
kenjiArai 3:41c351da2fdf 111
kenjiArai 3:41c351da2fdf 112 void M41T62::set_sq_wave (uint8_t sqw_dt)
kenjiArai 3:41c351da2fdf 113 {
kenjiArai 3:41c351da2fdf 114 uint8_t eep_dt[2];
kenjiArai 0:2919f8bd90f3 115
kenjiArai 1:9d7702a887d3 116 // set SQW frequency
kenjiArai 0:2919f8bd90f3 117 eep_dt[0] = M41T62_REG_WDAY;
kenjiArai 3:41c351da2fdf 118 _i2c.write((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 3:41c351da2fdf 119 _i2c.read((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 0:2919f8bd90f3 120 eep_dt[1] = (eep_dt[0] & 0x07) | (sqw_dt << 4);
kenjiArai 0:2919f8bd90f3 121 eep_dt[0] = M41T62_REG_WDAY;
kenjiArai 3:41c351da2fdf 122 _i2c.write((int)M41T62_addr, (char *)rtc_buf, 2);
kenjiArai 1:9d7702a887d3 123 // set or clear SQWE
kenjiArai 1:9d7702a887d3 124 eep_dt[0] = M41T62_REG_ALARM_MON;
kenjiArai 3:41c351da2fdf 125 _i2c.write((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 3:41c351da2fdf 126 _i2c.read((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 1:9d7702a887d3 127 eep_dt[1] = (eep_dt[0] & 0x07) | (sqw_dt << 4);
kenjiArai 1:9d7702a887d3 128 eep_dt[0] = M41T62_REG_WDAY;
kenjiArai 3:41c351da2fdf 129 _i2c.write((int)M41T62_addr, (char *)rtc_buf, 2);
kenjiArai 3:41c351da2fdf 130 if (sqw_dt == RTC_SQW_NONE) { // Clear SQWE
kenjiArai 1:9d7702a887d3 131 eep_dt[1] = eep_dt[0] & 0xbf;
kenjiArai 1:9d7702a887d3 132 } else { // Set SQWE
kenjiArai 1:9d7702a887d3 133 eep_dt[1] = eep_dt[0] | 0x40;
kenjiArai 1:9d7702a887d3 134 }
kenjiArai 1:9d7702a887d3 135 eep_dt[0] = M41T62_REG_ALARM_MON;
kenjiArai 3:41c351da2fdf 136 _i2c.write((int)M41T62_addr, (char *)rtc_buf, 2);
kenjiArai 0:2919f8bd90f3 137 }
kenjiArai 0:2919f8bd90f3 138
kenjiArai 3:41c351da2fdf 139 uint8_t M41T62::bin2bcd (uint8_t dt)
kenjiArai 3:41c351da2fdf 140 {
kenjiArai 3:41c351da2fdf 141 uint8_t bcdhigh = 0;
kenjiArai 0:2919f8bd90f3 142
kenjiArai 3:41c351da2fdf 143 while (dt >= 10) {
kenjiArai 0:2919f8bd90f3 144 bcdhigh++;
kenjiArai 0:2919f8bd90f3 145 dt -= 10;
kenjiArai 0:2919f8bd90f3 146 }
kenjiArai 0:2919f8bd90f3 147 return ((uint8_t)(bcdhigh << 4) | dt);
kenjiArai 0:2919f8bd90f3 148 }
kenjiArai 0:2919f8bd90f3 149
kenjiArai 3:41c351da2fdf 150 uint8_t M41T62::bcd2bin (uint8_t dt)
kenjiArai 3:41c351da2fdf 151 {
kenjiArai 3:41c351da2fdf 152 uint8_t tmp = 0;
kenjiArai 0:2919f8bd90f3 153
kenjiArai 0:2919f8bd90f3 154 tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
kenjiArai 0:2919f8bd90f3 155 return (tmp + (dt & (uint8_t)0x0f));
kenjiArai 0:2919f8bd90f3 156 }
kenjiArai 4:0c07690cb24f 157
kenjiArai 4:0c07690cb24f 158