RealTimeClock RTC-8564 library.

Dependents:   LcdClock

Committer:
togayan
Date:
Sat Feb 22 23:58:05 2014 +0000
Revision:
0:ebc5f6d47cf5
1st Release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
togayan 0:ebc5f6d47cf5 1 #include "Rtc8564.h"
togayan 0:ebc5f6d47cf5 2
togayan 0:ebc5f6d47cf5 3 #define RTC_ADDR 0xA2
togayan 0:ebc5f6d47cf5 4
togayan 0:ebc5f6d47cf5 5 static uint8_t bcdToUint8(char bcd)
togayan 0:ebc5f6d47cf5 6 {
togayan 0:ebc5f6d47cf5 7 uint8_t ret = bcd & 0x0F;
togayan 0:ebc5f6d47cf5 8 ret += ((bcd >> 4) & 0x0F) * 10;
togayan 0:ebc5f6d47cf5 9 return ret;
togayan 0:ebc5f6d47cf5 10 }
togayan 0:ebc5f6d47cf5 11
togayan 0:ebc5f6d47cf5 12 static char uint8ToBcd(uint8_t uchar)
togayan 0:ebc5f6d47cf5 13 {
togayan 0:ebc5f6d47cf5 14 char ret = ((uchar / 10) << 4);
togayan 0:ebc5f6d47cf5 15 ret += (uchar % 10);
togayan 0:ebc5f6d47cf5 16 return ret;
togayan 0:ebc5f6d47cf5 17 }
togayan 0:ebc5f6d47cf5 18
togayan 0:ebc5f6d47cf5 19 Rtc8564::Rtc8564(I2C& i2c, PinName clockIn, PinMode pull)
togayan 0:ebc5f6d47cf5 20 :m_i2c(i2c),
togayan 0:ebc5f6d47cf5 21 m_clockIn(clockIn),
togayan 0:ebc5f6d47cf5 22 m_clockFp()
togayan 0:ebc5f6d47cf5 23 {
togayan 0:ebc5f6d47cf5 24 m_clockIn.mode(pull);
togayan 0:ebc5f6d47cf5 25 }
togayan 0:ebc5f6d47cf5 26
togayan 0:ebc5f6d47cf5 27 void Rtc8564::initialize()
togayan 0:ebc5f6d47cf5 28 {
togayan 0:ebc5f6d47cf5 29 if(checkVoltageLow()) {
togayan 0:ebc5f6d47cf5 30 struct tm dateTime;
togayan 0:ebc5f6d47cf5 31 dateTime.tm_year = 100; // 2000-01-01
togayan 0:ebc5f6d47cf5 32 dateTime.tm_mon = 0;
togayan 0:ebc5f6d47cf5 33 dateTime.tm_mday = 1;
togayan 0:ebc5f6d47cf5 34 dateTime.tm_wday = 6; // Saturday
togayan 0:ebc5f6d47cf5 35 dateTime.tm_hour = 0; // 00:00:00
togayan 0:ebc5f6d47cf5 36 dateTime.tm_min = 0;
togayan 0:ebc5f6d47cf5 37 dateTime.tm_sec = 0;
togayan 0:ebc5f6d47cf5 38 dateTime.tm_isdst = -1;
togayan 0:ebc5f6d47cf5 39 setTime(&dateTime);
togayan 0:ebc5f6d47cf5 40 }
togayan 0:ebc5f6d47cf5 41
togayan 0:ebc5f6d47cf5 42 char cmds[2] = {0};
togayan 0:ebc5f6d47cf5 43 cmds[0] = 0x0D;
togayan 0:ebc5f6d47cf5 44 cmds[1] = 0x03;
togayan 0:ebc5f6d47cf5 45 m_i2c.write(RTC_ADDR, cmds, 2);
togayan 0:ebc5f6d47cf5 46
togayan 0:ebc5f6d47cf5 47 m_clockIn.rise(this, &Rtc8564::clockRise);
togayan 0:ebc5f6d47cf5 48
togayan 0:ebc5f6d47cf5 49 cmds[0] = 0x0D;
togayan 0:ebc5f6d47cf5 50 cmds[1] = 0x83;
togayan 0:ebc5f6d47cf5 51 m_i2c.write(RTC_ADDR, cmds, 2);
togayan 0:ebc5f6d47cf5 52 }
togayan 0:ebc5f6d47cf5 53
togayan 0:ebc5f6d47cf5 54 void Rtc8564::setTime(struct tm* dateTime)
togayan 0:ebc5f6d47cf5 55 {
togayan 0:ebc5f6d47cf5 56 char cmds[10] = {0};
togayan 0:ebc5f6d47cf5 57 cmds[0] = 0x00;
togayan 0:ebc5f6d47cf5 58 cmds[1] = 0x20;
togayan 0:ebc5f6d47cf5 59 cmds[2] = 0;
togayan 0:ebc5f6d47cf5 60 cmds[3] = uint8ToBcd(dateTime->tm_sec); //second
togayan 0:ebc5f6d47cf5 61 cmds[4] = uint8ToBcd(dateTime->tm_min); //minute
togayan 0:ebc5f6d47cf5 62 cmds[5] = uint8ToBcd(dateTime->tm_hour); //hour
togayan 0:ebc5f6d47cf5 63 cmds[6] = uint8ToBcd(dateTime->tm_mday); //day
togayan 0:ebc5f6d47cf5 64 cmds[7] = dateTime->tm_wday; //weekday
togayan 0:ebc5f6d47cf5 65 cmds[8] = uint8ToBcd(dateTime->tm_mon + 1); //month
togayan 0:ebc5f6d47cf5 66 cmds[9] = uint8ToBcd(dateTime->tm_year % 100); //year
togayan 0:ebc5f6d47cf5 67 m_i2c.write(RTC_ADDR, cmds, 10);
togayan 0:ebc5f6d47cf5 68
togayan 0:ebc5f6d47cf5 69 cmds[0] = 0x00;
togayan 0:ebc5f6d47cf5 70 cmds[1] = 0x0;
togayan 0:ebc5f6d47cf5 71 m_i2c.write(RTC_ADDR, cmds, 2);
togayan 0:ebc5f6d47cf5 72 }
togayan 0:ebc5f6d47cf5 73
togayan 0:ebc5f6d47cf5 74 void Rtc8564::getTime(struct tm* dateTime)
togayan 0:ebc5f6d47cf5 75 {
togayan 0:ebc5f6d47cf5 76 char cmds[7] = {0x02};
togayan 0:ebc5f6d47cf5 77
togayan 0:ebc5f6d47cf5 78 m_i2c.write(RTC_ADDR, cmds, 1);
togayan 0:ebc5f6d47cf5 79 m_i2c.read(RTC_ADDR, cmds, 7);
togayan 0:ebc5f6d47cf5 80
togayan 0:ebc5f6d47cf5 81 dateTime->tm_sec = bcdToUint8(cmds[0] & 0x7F);
togayan 0:ebc5f6d47cf5 82 dateTime->tm_min = bcdToUint8(cmds[1] & 0x7F);
togayan 0:ebc5f6d47cf5 83 dateTime->tm_hour = bcdToUint8(cmds[2] & 0x3F);
togayan 0:ebc5f6d47cf5 84 dateTime->tm_mday = bcdToUint8(cmds[3] & 0x3F);
togayan 0:ebc5f6d47cf5 85 dateTime->tm_wday = bcdToUint8(cmds[4] & 0x07);
togayan 0:ebc5f6d47cf5 86 dateTime->tm_mon = bcdToUint8(cmds[5] & 0x1F) - 1;
togayan 0:ebc5f6d47cf5 87 dateTime->tm_year = bcdToUint8(cmds[6]) + 100;
togayan 0:ebc5f6d47cf5 88 }
togayan 0:ebc5f6d47cf5 89
togayan 0:ebc5f6d47cf5 90 void Rtc8564::clock(void (*fptr)(void))
togayan 0:ebc5f6d47cf5 91 {
togayan 0:ebc5f6d47cf5 92 m_clockFp.attach(fptr);
togayan 0:ebc5f6d47cf5 93 }
togayan 0:ebc5f6d47cf5 94
togayan 0:ebc5f6d47cf5 95 bool Rtc8564::checkVoltageLow()
togayan 0:ebc5f6d47cf5 96 {
togayan 0:ebc5f6d47cf5 97 char cmds[1] = {0x02};
togayan 0:ebc5f6d47cf5 98
togayan 0:ebc5f6d47cf5 99 m_i2c.write(RTC_ADDR, cmds, 1);
togayan 0:ebc5f6d47cf5 100 m_i2c.read(RTC_ADDR, cmds, 1);
togayan 0:ebc5f6d47cf5 101
togayan 0:ebc5f6d47cf5 102 return ((cmds[0] & 0x80) != 0);
togayan 0:ebc5f6d47cf5 103 }
togayan 0:ebc5f6d47cf5 104
togayan 0:ebc5f6d47cf5 105 void Rtc8564::clockRise()
togayan 0:ebc5f6d47cf5 106 {
togayan 0:ebc5f6d47cf5 107 m_clockFp.call();
togayan 0:ebc5f6d47cf5 108 }