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:
Sat Jun 21 04:37:56 2014 +0000
Revision:
0:2919f8bd90f3
Child:
1:9d7702a887d3
1st fixed version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:2919f8bd90f3 1 /*
kenjiArai 0:2919f8bd90f3 2 * mbed library program
kenjiArai 0:2919f8bd90f3 3 * Control M41T62 RTC Module
kenjiArai 0:2919f8bd90f3 4 *
kenjiArai 0:2919f8bd90f3 5 * Copyright (c) 2014 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 0:2919f8bd90f3 8 * Created: June 21st, 2014
kenjiArai 0:2919f8bd90f3 9 * Revised: June 21st, 2014
kenjiArai 0:2919f8bd90f3 10 *
kenjiArai 0:2919f8bd90f3 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:2919f8bd90f3 12 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:2919f8bd90f3 13 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:2919f8bd90f3 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:2919f8bd90f3 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:2919f8bd90f3 16 */
kenjiArai 0:2919f8bd90f3 17 /*
kenjiArai 0:2919f8bd90f3 18 *---------------- REFERENCE ----------------------------------------------------------------------
kenjiArai 0:2919f8bd90f3 19 * http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM151/CL1410/SC403/PF82507
kenjiArai 0:2919f8bd90f3 20 */
kenjiArai 0:2919f8bd90f3 21
kenjiArai 0:2919f8bd90f3 22 #include "mbed.h"
kenjiArai 0:2919f8bd90f3 23 #include "m41t62_rtc.h"
kenjiArai 0:2919f8bd90f3 24
kenjiArai 0:2919f8bd90f3 25
kenjiArai 0:2919f8bd90f3 26 // Register definition
kenjiArai 0:2919f8bd90f3 27 #define M41T62_REG_SSEC 0
kenjiArai 0:2919f8bd90f3 28 #define M41T62_REG_SEC 1
kenjiArai 0:2919f8bd90f3 29 #define M41T62_REG_MIN 2
kenjiArai 0:2919f8bd90f3 30 #define M41T62_REG_HOUR 3
kenjiArai 0:2919f8bd90f3 31 #define M41T62_REG_WDAY 4
kenjiArai 0:2919f8bd90f3 32 #define M41T62_REG_DAY 5
kenjiArai 0:2919f8bd90f3 33 #define M41T62_REG_MON 6
kenjiArai 0:2919f8bd90f3 34 #define M41T62_REG_YEAR 7
kenjiArai 0:2919f8bd90f3 35 #define M41T62_REG_ALARM_MON 0xa
kenjiArai 0:2919f8bd90f3 36 #define M41T62_REG_ALARM_DAY 0xb
kenjiArai 0:2919f8bd90f3 37 #define M41T62_REG_ALARM_HOUR 0xc
kenjiArai 0:2919f8bd90f3 38 #define M41T62_REG_ALARM_MIN 0xd
kenjiArai 0:2919f8bd90f3 39 #define M41T62_REG_ALARM_SEC 0xe
kenjiArai 0:2919f8bd90f3 40 #define M41T62_REG_FLAGS 0xf
kenjiArai 0:2919f8bd90f3 41
kenjiArai 0:2919f8bd90f3 42 M41T62::M41T62 (PinName p_sda, PinName p_scl) : i2c(p_sda, p_scl) {
kenjiArai 0:2919f8bd90f3 43 M41T62_addr = M41T62ADDR;
kenjiArai 0:2919f8bd90f3 44 }
kenjiArai 0:2919f8bd90f3 45
kenjiArai 0:2919f8bd90f3 46 M41T62::M41T62 (I2C& p_i2c) : i2c(p_i2c) {
kenjiArai 0:2919f8bd90f3 47 M41T62_addr = M41T62ADDR;
kenjiArai 0:2919f8bd90f3 48 }
kenjiArai 0:2919f8bd90f3 49
kenjiArai 0:2919f8bd90f3 50 void M41T62::read_rtc (rtc_time *tm) {
kenjiArai 0:2919f8bd90f3 51 uint8_t eep_dt;
kenjiArai 0:2919f8bd90f3 52
kenjiArai 0:2919f8bd90f3 53 eep_dt = M41T62_REG_SSEC;
kenjiArai 0:2919f8bd90f3 54 i2c_write_n_bytes((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 0:2919f8bd90f3 55 i2c_read_n_bytes((int)M41T62_addr, (char *)rtc_buf, 8);
kenjiArai 0:2919f8bd90f3 56 tm->rtc_seconds = bcd2bin(rtc_buf[M41T62_REG_SEC] & 0x7f);
kenjiArai 0:2919f8bd90f3 57 tm->rtc_minutes = bcd2bin(rtc_buf[M41T62_REG_MIN] & 0x7f);
kenjiArai 0:2919f8bd90f3 58 tm->rtc_hours = bcd2bin(rtc_buf[M41T62_REG_HOUR] & 0x3f);
kenjiArai 0:2919f8bd90f3 59 tm->rtc_date = bcd2bin(rtc_buf[M41T62_REG_DAY] & 0x3f);
kenjiArai 0:2919f8bd90f3 60 tm->rtc_weekday = rtc_buf[M41T62_REG_WDAY] & 0x07;
kenjiArai 0:2919f8bd90f3 61 tm->rtc_month = bcd2bin(rtc_buf[M41T62_REG_MON] & 0x1f);
kenjiArai 0:2919f8bd90f3 62 tm->rtc_year = bcd2bin(rtc_buf[M41T62_REG_YEAR]) + 100 + 1900;
kenjiArai 0:2919f8bd90f3 63 }
kenjiArai 0:2919f8bd90f3 64
kenjiArai 0:2919f8bd90f3 65 void M41T62::write_rtc (rtc_time *tm) {
kenjiArai 0:2919f8bd90f3 66 uint8_t eep_dt;
kenjiArai 0:2919f8bd90f3 67
kenjiArai 0:2919f8bd90f3 68 eep_dt = M41T62_REG_SSEC;
kenjiArai 0:2919f8bd90f3 69 i2c_write_n_bytes((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 0:2919f8bd90f3 70 i2c_read_n_bytes((int)M41T62_addr, (char *)rtc_buf, 8);
kenjiArai 0:2919f8bd90f3 71 rtc_buf[0] = M41T62_REG_SSEC;
kenjiArai 0:2919f8bd90f3 72 rtc_buf[M41T62_REG_SSEC + 1] = 0;
kenjiArai 0:2919f8bd90f3 73 rtc_buf[M41T62_REG_YEAR + 1] = bin2bcd((uint8_t)(tm->rtc_year % 100));
kenjiArai 0:2919f8bd90f3 74 rtc_buf[M41T62_REG_MON + 1] = bin2bcd(tm->rtc_month) | (rtc_buf[M41T62_REG_MON] & ~0x1f);
kenjiArai 0:2919f8bd90f3 75 rtc_buf[M41T62_REG_DAY + 1] = bin2bcd(tm->rtc_date) | (rtc_buf[M41T62_REG_DAY] & ~0x3f);
kenjiArai 0:2919f8bd90f3 76 rtc_buf[M41T62_REG_WDAY + 1] = (tm->rtc_weekday & 0x07) | (rtc_buf[M41T62_REG_WDAY] & ~0x07);
kenjiArai 0:2919f8bd90f3 77 rtc_buf[M41T62_REG_HOUR + 1] = bin2bcd(tm->rtc_hours) | (rtc_buf[M41T62_REG_HOUR] & ~0x3f);
kenjiArai 0:2919f8bd90f3 78 rtc_buf[M41T62_REG_MIN + 1] = bin2bcd(tm->rtc_minutes) | (rtc_buf[M41T62_REG_MIN] & ~0x7f);
kenjiArai 0:2919f8bd90f3 79 rtc_buf[M41T62_REG_SEC + 1] = bin2bcd(tm->rtc_seconds) | (rtc_buf[M41T62_REG_SEC] & ~0x7f);
kenjiArai 0:2919f8bd90f3 80 i2c_write_n_bytes((int)M41T62_addr, (char *)rtc_buf, 9);
kenjiArai 0:2919f8bd90f3 81 }
kenjiArai 0:2919f8bd90f3 82
kenjiArai 0:2919f8bd90f3 83 void M41T62::set_sq_wave (uint8_t sqw_dt) {
kenjiArai 0:2919f8bd90f3 84 uint8_t eep_dt[2];
kenjiArai 0:2919f8bd90f3 85
kenjiArai 0:2919f8bd90f3 86 eep_dt[0] = M41T62_REG_WDAY;
kenjiArai 0:2919f8bd90f3 87 i2c_write_n_bytes((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 0:2919f8bd90f3 88 i2c_read_n_bytes((int)M41T62_addr, (char *)eep_dt, 1);
kenjiArai 0:2919f8bd90f3 89 eep_dt[1] = (eep_dt[0] & 0x07) | (sqw_dt << 4);
kenjiArai 0:2919f8bd90f3 90 eep_dt[0] = M41T62_REG_WDAY;
kenjiArai 0:2919f8bd90f3 91 i2c_write_n_bytes((int)M41T62_addr, (char *)rtc_buf, 2);
kenjiArai 0:2919f8bd90f3 92 }
kenjiArai 0:2919f8bd90f3 93
kenjiArai 0:2919f8bd90f3 94 void M41T62::i2c_read_n_bytes (int addr, char *dt, int n) {
kenjiArai 0:2919f8bd90f3 95 i2c.read(addr, dt, n);
kenjiArai 0:2919f8bd90f3 96 }
kenjiArai 0:2919f8bd90f3 97
kenjiArai 0:2919f8bd90f3 98 void M41T62::i2c_write_n_bytes (int addr, char *dt, int n) {
kenjiArai 0:2919f8bd90f3 99 i2c.write(addr, dt, n);
kenjiArai 0:2919f8bd90f3 100 }
kenjiArai 0:2919f8bd90f3 101
kenjiArai 0:2919f8bd90f3 102 uint8_t M41T62::bin2bcd (uint8_t dt){
kenjiArai 0:2919f8bd90f3 103 uint8_t bcdhigh = 0;
kenjiArai 0:2919f8bd90f3 104
kenjiArai 0:2919f8bd90f3 105 while (dt >= 10) {
kenjiArai 0:2919f8bd90f3 106 bcdhigh++;
kenjiArai 0:2919f8bd90f3 107 dt -= 10;
kenjiArai 0:2919f8bd90f3 108 }
kenjiArai 0:2919f8bd90f3 109 return ((uint8_t)(bcdhigh << 4) | dt);
kenjiArai 0:2919f8bd90f3 110 }
kenjiArai 0:2919f8bd90f3 111
kenjiArai 0:2919f8bd90f3 112 uint8_t M41T62::bcd2bin (uint8_t dt){
kenjiArai 0:2919f8bd90f3 113 uint8_t tmp = 0;
kenjiArai 0:2919f8bd90f3 114
kenjiArai 0:2919f8bd90f3 115 tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
kenjiArai 0:2919f8bd90f3 116 return (tmp + (dt & (uint8_t)0x0f));
kenjiArai 0:2919f8bd90f3 117 }
kenjiArai 0:2919f8bd90f3 118