test rtc
PCF85263AT.cpp@0:fa906a89a756, 2020-06-17 (annotated)
- Committer:
- irsanjul
- Date:
- Wed Jun 17 08:46:25 2020 +0000
- Revision:
- 0:fa906a89a756
test rtc
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
irsanjul | 0:fa906a89a756 | 1 | #include "mbed.h" |
irsanjul | 0:fa906a89a756 | 2 | #include "PCF85263AT.h" |
irsanjul | 0:fa906a89a756 | 3 | |
irsanjul | 0:fa906a89a756 | 4 | extern Serial dbg; |
irsanjul | 0:fa906a89a756 | 5 | |
irsanjul | 0:fa906a89a756 | 6 | PCF85263AT::PCF85263AT(PinName sda, PinName scl) : i2c (sda, scl) |
irsanjul | 0:fa906a89a756 | 7 | { |
irsanjul | 0:fa906a89a756 | 8 | i2c.frequency(100000); |
irsanjul | 0:fa906a89a756 | 9 | } |
irsanjul | 0:fa906a89a756 | 10 | |
irsanjul | 0:fa906a89a756 | 11 | PCF85263AT::~PCF85263AT() |
irsanjul | 0:fa906a89a756 | 12 | { |
irsanjul | 0:fa906a89a756 | 13 | |
irsanjul | 0:fa906a89a756 | 14 | } |
irsanjul | 0:fa906a89a756 | 15 | |
irsanjul | 0:fa906a89a756 | 16 | bool PCF85263AT::write(char adr, char data) |
irsanjul | 0:fa906a89a756 | 17 | { |
irsanjul | 0:fa906a89a756 | 18 | w[0] = adr; |
irsanjul | 0:fa906a89a756 | 19 | w[1] = data; |
irsanjul | 0:fa906a89a756 | 20 | if (i2c.write(address, w, 2) != 0) return 0; |
irsanjul | 0:fa906a89a756 | 21 | |
irsanjul | 0:fa906a89a756 | 22 | return true; |
irsanjul | 0:fa906a89a756 | 23 | } |
irsanjul | 0:fa906a89a756 | 24 | |
irsanjul | 0:fa906a89a756 | 25 | char PCF85263AT::read(char adr) |
irsanjul | 0:fa906a89a756 | 26 | { |
irsanjul | 0:fa906a89a756 | 27 | char start = adr; |
irsanjul | 0:fa906a89a756 | 28 | if (i2c.write(address, &start, 1, true) != 0) return 0; |
irsanjul | 0:fa906a89a756 | 29 | if (i2c.read(address, r, 1) != 0) return 0; |
irsanjul | 0:fa906a89a756 | 30 | |
irsanjul | 0:fa906a89a756 | 31 | return r[0]; |
irsanjul | 0:fa906a89a756 | 32 | } |
irsanjul | 0:fa906a89a756 | 33 | |
irsanjul | 0:fa906a89a756 | 34 | time_t PCF85263AT::now() |
irsanjul | 0:fa906a89a756 | 35 | { |
irsanjul | 0:fa906a89a756 | 36 | struct tm now; |
irsanjul | 0:fa906a89a756 | 37 | |
irsanjul | 0:fa906a89a756 | 38 | char buffer[6]; |
irsanjul | 0:fa906a89a756 | 39 | |
irsanjul | 0:fa906a89a756 | 40 | buffer [0] = read(SEC); |
irsanjul | 0:fa906a89a756 | 41 | buffer [1] = read(MIN); |
irsanjul | 0:fa906a89a756 | 42 | buffer [2] = read(HOUR); |
irsanjul | 0:fa906a89a756 | 43 | buffer [3] = read(DAY); |
irsanjul | 0:fa906a89a756 | 44 | buffer [4] = read(MONTH); |
irsanjul | 0:fa906a89a756 | 45 | buffer [5] = read(YEAR); |
irsanjul | 0:fa906a89a756 | 46 | |
irsanjul | 0:fa906a89a756 | 47 | now.tm_sec = bcdToDecimal(buffer[0] & 0x7F); |
irsanjul | 0:fa906a89a756 | 48 | now.tm_min = bcdToDecimal(buffer[1] & 0x7F); |
irsanjul | 0:fa906a89a756 | 49 | now.tm_hour = bcdToDecimal(buffer[2] & 0x3F); |
irsanjul | 0:fa906a89a756 | 50 | now.tm_mday = bcdToDecimal(buffer[3] & 0x3F); |
irsanjul | 0:fa906a89a756 | 51 | now.tm_mon = bcdToDecimal(buffer[4] & 0x1F) - 1; |
irsanjul | 0:fa906a89a756 | 52 | now.tm_year = bcdToDecimal(buffer[5] & 0xFF) + 2000 - 1900; |
irsanjul | 0:fa906a89a756 | 53 | |
irsanjul | 0:fa906a89a756 | 54 | return mktime(&now); |
irsanjul | 0:fa906a89a756 | 55 | } |
irsanjul | 0:fa906a89a756 | 56 | |
irsanjul | 0:fa906a89a756 | 57 | bool PCF85263AT::set_time(time_t time) |
irsanjul | 0:fa906a89a756 | 58 | { |
irsanjul | 0:fa906a89a756 | 59 | struct tm *now; |
irsanjul | 0:fa906a89a756 | 60 | char buffer[9]; |
irsanjul | 0:fa906a89a756 | 61 | |
irsanjul | 0:fa906a89a756 | 62 | now = localtime(&time); |
irsanjul | 0:fa906a89a756 | 63 | |
irsanjul | 0:fa906a89a756 | 64 | // send stop signal |
irsanjul | 0:fa906a89a756 | 65 | buffer[0] = 0x01; |
irsanjul | 0:fa906a89a756 | 66 | if(!write(STOPEN, buffer[0]))return 0; |
irsanjul | 0:fa906a89a756 | 67 | |
irsanjul | 0:fa906a89a756 | 68 | // clear prescaler |
irsanjul | 0:fa906a89a756 | 69 | buffer[0] = 0xA4; |
irsanjul | 0:fa906a89a756 | 70 | if(!write(RESET, buffer[0]))return 0; |
irsanjul | 0:fa906a89a756 | 71 | |
irsanjul | 0:fa906a89a756 | 72 | // set time |
irsanjul | 0:fa906a89a756 | 73 | buffer[0] = decimalToBcd(now->tm_sec) & 0x7F; // VL = 0 |
irsanjul | 0:fa906a89a756 | 74 | buffer[1] = decimalToBcd(now->tm_min) & 0x7F; |
irsanjul | 0:fa906a89a756 | 75 | buffer[2] = decimalToBcd(now->tm_hour) & 0x3F; |
irsanjul | 0:fa906a89a756 | 76 | buffer[3] = decimalToBcd(now->tm_mday) & 0x3F; |
irsanjul | 0:fa906a89a756 | 77 | buffer[4] = now->tm_wday + 1; |
irsanjul | 0:fa906a89a756 | 78 | buffer[5] = decimalToBcd(now->tm_mon+1) & 0x1F; |
irsanjul | 0:fa906a89a756 | 79 | buffer[6] = decimalToBcd(now->tm_year + 1900 - 2000); |
irsanjul | 0:fa906a89a756 | 80 | |
irsanjul | 0:fa906a89a756 | 81 | if(!write(SEC, buffer[0]))return 0; |
irsanjul | 0:fa906a89a756 | 82 | if(!write(MIN, buffer[1]))return 0; |
irsanjul | 0:fa906a89a756 | 83 | if(!write(HOUR, buffer[2]))return 0; |
irsanjul | 0:fa906a89a756 | 84 | if(!write(DAY, buffer[3]))return 0; |
irsanjul | 0:fa906a89a756 | 85 | if(!write(WDAY, buffer[4]))return 0; |
irsanjul | 0:fa906a89a756 | 86 | if(!write(MONTH, buffer[5]))return 0; |
irsanjul | 0:fa906a89a756 | 87 | if(!write(YEAR, buffer[6]))return 0; |
irsanjul | 0:fa906a89a756 | 88 | |
irsanjul | 0:fa906a89a756 | 89 | // clear stop signal |
irsanjul | 0:fa906a89a756 | 90 | buffer[0] = 0x00; |
irsanjul | 0:fa906a89a756 | 91 | if(!write(STOPEN, buffer[0]))return 0; |
irsanjul | 0:fa906a89a756 | 92 | |
irsanjul | 0:fa906a89a756 | 93 | return true; |
irsanjul | 0:fa906a89a756 | 94 | } |
irsanjul | 0:fa906a89a756 | 95 | |
irsanjul | 0:fa906a89a756 | 96 | bool PCF85263AT::IsConnected() |
irsanjul | 0:fa906a89a756 | 97 | { |
irsanjul | 0:fa906a89a756 | 98 | bool ok = false; |
irsanjul | 0:fa906a89a756 | 99 | |
irsanjul | 0:fa906a89a756 | 100 | i2c.start(); |
irsanjul | 0:fa906a89a756 | 101 | i2c.stop(); |
irsanjul | 0:fa906a89a756 | 102 | |
irsanjul | 0:fa906a89a756 | 103 | if (i2c.read(address, &data[0], 1) != 0) |
irsanjul | 0:fa906a89a756 | 104 | { |
irsanjul | 0:fa906a89a756 | 105 | // dbg.printf("PCF85263AT is not detected\r\n"); |
irsanjul | 0:fa906a89a756 | 106 | ok = false; |
irsanjul | 0:fa906a89a756 | 107 | } |
irsanjul | 0:fa906a89a756 | 108 | else |
irsanjul | 0:fa906a89a756 | 109 | { |
irsanjul | 0:fa906a89a756 | 110 | // dbg.printf("PCF85263AT is detected\r\n"); |
irsanjul | 0:fa906a89a756 | 111 | ok = true; |
irsanjul | 0:fa906a89a756 | 112 | } |
irsanjul | 0:fa906a89a756 | 113 | |
irsanjul | 0:fa906a89a756 | 114 | data[0] = 0; |
irsanjul | 0:fa906a89a756 | 115 | i2c.start(); |
irsanjul | 0:fa906a89a756 | 116 | i2c.stop(); |
irsanjul | 0:fa906a89a756 | 117 | |
irsanjul | 0:fa906a89a756 | 118 | return ok; |
irsanjul | 0:fa906a89a756 | 119 | } |
irsanjul | 0:fa906a89a756 | 120 | |
irsanjul | 0:fa906a89a756 | 121 | bool PCF85263AT::software_reset() |
irsanjul | 0:fa906a89a756 | 122 | { |
irsanjul | 0:fa906a89a756 | 123 | char buffer = 0x2C; |
irsanjul | 0:fa906a89a756 | 124 | |
irsanjul | 0:fa906a89a756 | 125 | if(!write(RESET, buffer)) return 0; |
irsanjul | 0:fa906a89a756 | 126 | |
irsanjul | 0:fa906a89a756 | 127 | return 1; |
irsanjul | 0:fa906a89a756 | 128 | } |