RealTimeClock RTC-8564 library.
Rtc8564.cpp@0:ebc5f6d47cf5, 2014-02-22 (annotated)
- Committer:
- togayan
- Date:
- Sat Feb 22 23:58:05 2014 +0000
- Revision:
- 0:ebc5f6d47cf5
1st Release.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |