test rtc

Committer:
irsanjul
Date:
Wed Jun 17 08:46:25 2020 +0000
Revision:
0:fa906a89a756
test rtc

Who changed what in which revision?

UserRevisionLine numberNew 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 }