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:
Sun Jun 22 06:08:15 2014 +0000
Revision:
2:c58da9ec9ae3
Parent:
1:9d7702a887d3
Child:
3:41c351da2fdf
put additional comments and small modification

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 1:9d7702a887d3 9 * Revised: June 22nd, 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 #ifndef M41T62_H
kenjiArai 0:2919f8bd90f3 19 #define M41T62_H
kenjiArai 0:2919f8bd90f3 20
kenjiArai 0:2919f8bd90f3 21 #include "mbed.h"
kenjiArai 0:2919f8bd90f3 22
kenjiArai 0:2919f8bd90f3 23 // RTC STmicro M41T62
kenjiArai 0:2919f8bd90f3 24 // Address b7=1,b6=1,b5=0,b4=1,b3=0,b2=0,b1=0, b0=R/W
kenjiArai 0:2919f8bd90f3 25 #define M41T62ADDR 0xd0 // No other choice
kenjiArai 0:2919f8bd90f3 26
kenjiArai 0:2919f8bd90f3 27 #define RTC_Wk_Monday ((uint8_t)0x01)
kenjiArai 0:2919f8bd90f3 28 #define RTC_Wk_Tuesday ((uint8_t)0x02)
kenjiArai 0:2919f8bd90f3 29 #define RTC_Wk_Wednesday ((uint8_t)0x03)
kenjiArai 0:2919f8bd90f3 30 #define RTC_Wk_Thursday ((uint8_t)0x04)
kenjiArai 0:2919f8bd90f3 31 #define RTC_Wk_Friday ((uint8_t)0x05)
kenjiArai 0:2919f8bd90f3 32 #define RTC_Wk_Saturday ((uint8_t)0x06)
kenjiArai 0:2919f8bd90f3 33 #define RTC_Wk_Sunday ((uint8_t)0x07)
kenjiArai 0:2919f8bd90f3 34
kenjiArai 0:2919f8bd90f3 35 #define RTC_SQW_NONE ((uint8_t)0x0)
kenjiArai 0:2919f8bd90f3 36 #define RTC_SQW_32KHZ ((uint8_t)0x1)
kenjiArai 0:2919f8bd90f3 37 #define RTC_SQW_8KHZ ((uint8_t)0x2)
kenjiArai 0:2919f8bd90f3 38 #define RTC_SQW_4KHZ ((uint8_t)0x3)
kenjiArai 0:2919f8bd90f3 39 #define RTC_SQW_2KHZ ((uint8_t)0x4)
kenjiArai 0:2919f8bd90f3 40 #define RTC_SQW_1KHZ ((uint8_t)0x5)
kenjiArai 0:2919f8bd90f3 41 #define RTC_SQW_512HZ ((uint8_t)0x6)
kenjiArai 0:2919f8bd90f3 42 #define RTC_SQW_256HZ ((uint8_t)0x7)
kenjiArai 0:2919f8bd90f3 43 #define RTC_SQW_128HZ ((uint8_t)0x8)
kenjiArai 0:2919f8bd90f3 44 #define RTC_SQW_64HZ ((uint8_t)0x9)
kenjiArai 0:2919f8bd90f3 45 #define RTC_SQW_32HZ ((uint8_t)0xa)
kenjiArai 0:2919f8bd90f3 46 #define RTC_SQW_16HZ ((uint8_t)0xb)
kenjiArai 0:2919f8bd90f3 47 #define RTC_SQW_8HZ ((uint8_t)0xc)
kenjiArai 0:2919f8bd90f3 48 #define RTC_SQW_4HZ ((uint8_t)0xd)
kenjiArai 0:2919f8bd90f3 49 #define RTC_SQW_2HZ ((uint8_t)0xe)
kenjiArai 0:2919f8bd90f3 50 #define RTC_SQW_1HZ ((uint8_t)0xf)
kenjiArai 0:2919f8bd90f3 51
kenjiArai 0:2919f8bd90f3 52 typedef struct { // BCD format
kenjiArai 0:2919f8bd90f3 53 uint8_t rtc_seconds;
kenjiArai 0:2919f8bd90f3 54 uint8_t rtc_minutes;
kenjiArai 0:2919f8bd90f3 55 uint8_t rtc_hours;
kenjiArai 0:2919f8bd90f3 56 uint8_t rtc_weekday;
kenjiArai 0:2919f8bd90f3 57 uint8_t rtc_date;
kenjiArai 0:2919f8bd90f3 58 uint8_t rtc_month;
kenjiArai 1:9d7702a887d3 59 uint8_t rtc_year_raw;
kenjiArai 0:2919f8bd90f3 60 uint16_t rtc_year;
kenjiArai 0:2919f8bd90f3 61 }rtc_time;
kenjiArai 0:2919f8bd90f3 62
kenjiArai 2:c58da9ec9ae3 63 /** Interface for RTC (I2C Interface) STMicroelectronics M41T62
kenjiArai 2:c58da9ec9ae3 64 *
kenjiArai 2:c58da9ec9ae3 65 * Standalone type RTC via I2C interface
kenjiArai 2:c58da9ec9ae3 66 *
kenjiArai 2:c58da9ec9ae3 67 * @code
kenjiArai 2:c58da9ec9ae3 68 * #include "mbed.h"
kenjiArai 2:c58da9ec9ae3 69 *
kenjiArai 2:c58da9ec9ae3 70 * // I2C Communication
kenjiArai 2:c58da9ec9ae3 71 * M41T62 m41t62(dp5,dp27); // STmicro RTC(M41T62) SDA, SCL
kenjiArai 2:c58da9ec9ae3 72 * // If you connected I2C line not only this device but also other devices,
kenjiArai 2:c58da9ec9ae3 73 * // you need to declare following method.
kenjiArai 2:c58da9ec9ae3 74 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 2:c58da9ec9ae3 75 * M41T62 m41t62(i2c); // STmicro RTC(M41T62)
kenjiArai 2:c58da9ec9ae3 76 *
kenjiArai 2:c58da9ec9ae3 77 * int main() {
kenjiArai 2:c58da9ec9ae3 78 * tm t;
kenjiArai 2:c58da9ec9ae3 79 * time_t seconds;
kenjiArai 2:c58da9ec9ae3 80 * char buf[40];
kenjiArai 2:c58da9ec9ae3 81 *
kenjiArai 2:c58da9ec9ae3 82 * m41t62.set_sq_wave(RTC_SQW_NONE); // Stop output for more low current
kenjiArai 2:c58da9ec9ae3 83 *
kenjiArai 2:c58da9ec9ae3 84 * m41t62.read_rtc_std(&t); // read RTC data
kenjiArai 2:c58da9ec9ae3 85 * seconds = mktime(&t);
kenjiArai 2:c58da9ec9ae3 86 * strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
kenjiArai 2:c58da9ec9ae3 87 * printf("Date: %s\r\n", buf);
kenjiArai 2:c58da9ec9ae3 88 * }
kenjiArai 2:c58da9ec9ae3 89 * @endcode
kenjiArai 2:c58da9ec9ae3 90 */
kenjiArai 2:c58da9ec9ae3 91
kenjiArai 0:2919f8bd90f3 92 class M41T62 {
kenjiArai 0:2919f8bd90f3 93 public:
kenjiArai 2:c58da9ec9ae3 94 /** Configure data pin
kenjiArai 2:c58da9ec9ae3 95 * @param data SDA and SCL pins
kenjiArai 2:c58da9ec9ae3 96 */
kenjiArai 0:2919f8bd90f3 97 M41T62(PinName p_sda, PinName p_scl);
kenjiArai 2:c58da9ec9ae3 98
kenjiArai 2:c58da9ec9ae3 99 /** Configure data pin (with other devices on I2C line)
kenjiArai 2:c58da9ec9ae3 100 * @param I2C previous definition
kenjiArai 2:c58da9ec9ae3 101 */
kenjiArai 0:2919f8bd90f3 102 M41T62(I2C& p_i2c);
kenjiArai 0:2919f8bd90f3 103
kenjiArai 2:c58da9ec9ae3 104 /** Read RTC data with Standard C "struct tm" format
kenjiArai 2:c58da9ec9ae3 105 * @param tm (data save area)
kenjiArai 2:c58da9ec9ae3 106 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 107 */
kenjiArai 1:9d7702a887d3 108 void read_rtc_std(tm *);
kenjiArai 2:c58da9ec9ae3 109
kenjiArai 2:c58da9ec9ae3 110 /** Write data to RTC data with Standard C "struct tm" format
kenjiArai 2:c58da9ec9ae3 111 * @param tm (save writing data)
kenjiArai 2:c58da9ec9ae3 112 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 113 */
kenjiArai 1:9d7702a887d3 114 void write_rtc_std(tm *);
kenjiArai 2:c58da9ec9ae3 115
kenjiArai 2:c58da9ec9ae3 116 /** Read RTC data with own format
kenjiArai 2:c58da9ec9ae3 117 * @param tm (data save area)
kenjiArai 2:c58da9ec9ae3 118 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 119 */
kenjiArai 1:9d7702a887d3 120 void read_rtc_direct(rtc_time *);
kenjiArai 2:c58da9ec9ae3 121
kenjiArai 2:c58da9ec9ae3 122 /** Read RTC data with own format
kenjiArai 2:c58da9ec9ae3 123 * @param tm (save writing data)
kenjiArai 2:c58da9ec9ae3 124 * @return none but all data in tm
kenjiArai 2:c58da9ec9ae3 125 */
kenjiArai 1:9d7702a887d3 126 void write_rtc_direct(rtc_time *);
kenjiArai 2:c58da9ec9ae3 127
kenjiArai 2:c58da9ec9ae3 128 /** Control Square wave output port
kenjiArai 2:c58da9ec9ae3 129 * @param output_mode
kenjiArai 2:c58da9ec9ae3 130 * @return none
kenjiArai 2:c58da9ec9ae3 131 */
kenjiArai 1:9d7702a887d3 132 void set_sq_wave(uint8_t );
kenjiArai 0:2919f8bd90f3 133
kenjiArai 0:2919f8bd90f3 134 protected:
kenjiArai 0:2919f8bd90f3 135 void i2c_read_n_bytes(int, char*, int);
kenjiArai 0:2919f8bd90f3 136 void i2c_write_n_bytes(int, char*, int);
kenjiArai 0:2919f8bd90f3 137 uint8_t bin2bcd(uint8_t);
kenjiArai 0:2919f8bd90f3 138 uint8_t bcd2bin(uint8_t);
kenjiArai 0:2919f8bd90f3 139
kenjiArai 0:2919f8bd90f3 140 I2C i2c;
kenjiArai 0:2919f8bd90f3 141
kenjiArai 0:2919f8bd90f3 142 private:
kenjiArai 0:2919f8bd90f3 143 uint8_t M41T62_addr;
kenjiArai 0:2919f8bd90f3 144 uint8_t rtc_buf[8 + 2]; // buffer for RTC
kenjiArai 0:2919f8bd90f3 145 };
kenjiArai 0:2919f8bd90f3 146
kenjiArai 2:c58da9ec9ae3 147 #endif // M41T62_H