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

Dependents:   LPC1114_data_logger Check_external_RTC LPC1114_barometer_with_data_logging

m41t62_rtc.h

Committer:
kenjiArai
Date:
2017-08-23
Revision:
4:0c07690cb24f
Parent:
3:41c351da2fdf
Child:
5:959683e91979

File content as of revision 4:0c07690cb24f:

/*
 * mbed library program
 *  Control M41T62 RTC Module
 *
 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Created: June       21st, 2014
 *      Revised: August     23rd, 2017
 */
/*
 *---------------- REFERENCE ----------------------------------------------------------------------
 *  http://www.st-japan.co.jp/web/jp/catalog/sense_power/FM151/CL1410/SC403/PF82507
 *  http://strawberry-linux.com/catalog/items?code=12062
 */

#ifndef M41T62_H
#define M41T62_H

#include "mbed.h"

// RTC STmicro M41T62
// Address b7=1,b6=1,b5=0,b4=1,b3=0,b2=0,b1=0, b0=R/W
#define M41T62ADDR  (0x68 << 1) // No other choice

#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)

#define RTC_SQW_NONE        ((uint8_t)0x0)
#define RTC_SQW_32KHZ       ((uint8_t)0x1)
#define RTC_SQW_8KHZ        ((uint8_t)0x2)
#define RTC_SQW_4KHZ        ((uint8_t)0x3)
#define RTC_SQW_2KHZ        ((uint8_t)0x4)
#define RTC_SQW_1KHZ        ((uint8_t)0x5)
#define RTC_SQW_512HZ       ((uint8_t)0x6)
#define RTC_SQW_256HZ       ((uint8_t)0x7)
#define RTC_SQW_128HZ       ((uint8_t)0x8)
#define RTC_SQW_64HZ        ((uint8_t)0x9)
#define RTC_SQW_32HZ        ((uint8_t)0xa)
#define RTC_SQW_16HZ        ((uint8_t)0xb)
#define RTC_SQW_8HZ         ((uint8_t)0xc)
#define RTC_SQW_4HZ         ((uint8_t)0xd)
#define RTC_SQW_2HZ         ((uint8_t)0xe)
#define RTC_SQW_1HZ         ((uint8_t)0xf)

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;

// Register definition
#define M41T62_REG_SSEC         0x0
#define M41T62_REG_SEC          0x1
#define M41T62_REG_MIN          0x2
#define M41T62_REG_HOUR         0x3
#define M41T62_REG_WDAY         0x4
#define M41T62_REG_DAY          0x5
#define M41T62_REG_MON          0x6
#define M41T62_REG_YEAR         0x7

#define M41T62_REG_ALARM_MON    0xa
#define M41T62_REG_ALARM_DAY    0xb
#define M41T62_REG_ALARM_HOUR   0xc
#define M41T62_REG_ALARM_MIN    0xd
#define M41T62_REG_ALARM_SEC    0xe
#define M41T62_REG_FLAGS        0xf

/** Interface for RTC (I2C Interface)  STMicroelectronics M41T62
 *
 *  Standalone type RTC via I2C interface
 *
 * @code
 * #include "mbed.h"
 * #include "m41t62_rtc.h"
 *
 * // I2C Communication
 *  M41T62      m41t62(dp5,dp27);   // STmicro RTC(M41T62) SDA, SCL
 * // 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
 *  M41T62      m41t62(i2c);        // STmicro RTC(M41T62)
 *
 * int main() {
 * tm t;
 * time_t seconds;
 * char buf[40];
 *
 *   m41t62.set_sq_wave(RTC_SQW_NONE);      // Stop output for more low current
 *
 *   m41t62.read_rtc_std(&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 M41T62
{
public:
    /** Configure data pin
      * @param data SDA and SCL pins
      */
    M41T62(PinName p_sda, PinName p_scl);

    /** Configure data pin (with other devices on I2C line)
      * @param I2C previous definition
      */
    M41T62(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 *);

    /** 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 *);

    /** 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);

    /** Control Square wave output port
      * @param output_mode
      * @return none
      */
    void set_sq_wave(uint8_t );

protected:
    uint8_t bin2bcd(uint8_t);
    uint8_t bcd2bin(uint8_t);

    I2C *_i2c_p;
    I2C &_i2c;

private:
    uint8_t M41T62_addr;
    uint8_t rtc_buf[8 + 2];   // buffer for RTC
};

#endif      // M41T62_H