Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: PCF85263AT.cpp
- Revision:
- 0:fa906a89a756
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF85263AT.cpp Wed Jun 17 08:46:25 2020 +0000
@@ -0,0 +1,128 @@
+#include "mbed.h"
+#include "PCF85263AT.h"
+
+extern Serial dbg;
+
+PCF85263AT::PCF85263AT(PinName sda, PinName scl) : i2c (sda, scl)
+{
+ i2c.frequency(100000);
+}
+
+PCF85263AT::~PCF85263AT()
+{
+
+}
+
+bool PCF85263AT::write(char adr, char data)
+{
+ w[0] = adr;
+ w[1] = data;
+ if (i2c.write(address, w, 2) != 0) return 0;
+
+ return true;
+}
+
+char PCF85263AT::read(char adr)
+{
+ char start = adr;
+ if (i2c.write(address, &start, 1, true) != 0) return 0;
+ if (i2c.read(address, r, 1) != 0) return 0;
+
+ return r[0];
+}
+
+time_t PCF85263AT::now()
+{
+ struct tm now;
+
+ char buffer[6];
+
+ buffer [0] = read(SEC);
+ buffer [1] = read(MIN);
+ buffer [2] = read(HOUR);
+ buffer [3] = read(DAY);
+ buffer [4] = read(MONTH);
+ buffer [5] = read(YEAR);
+
+ now.tm_sec = bcdToDecimal(buffer[0] & 0x7F);
+ now.tm_min = bcdToDecimal(buffer[1] & 0x7F);
+ now.tm_hour = bcdToDecimal(buffer[2] & 0x3F);
+ now.tm_mday = bcdToDecimal(buffer[3] & 0x3F);
+ now.tm_mon = bcdToDecimal(buffer[4] & 0x1F) - 1;
+ now.tm_year = bcdToDecimal(buffer[5] & 0xFF) + 2000 - 1900;
+
+ return mktime(&now);
+}
+
+bool PCF85263AT::set_time(time_t time)
+{
+ struct tm *now;
+ char buffer[9];
+
+ now = localtime(&time);
+
+ // send stop signal
+ buffer[0] = 0x01;
+ if(!write(STOPEN, buffer[0]))return 0;
+
+ // clear prescaler
+ buffer[0] = 0xA4;
+ if(!write(RESET, buffer[0]))return 0;
+
+ // set time
+ buffer[0] = decimalToBcd(now->tm_sec) & 0x7F; // VL = 0
+ buffer[1] = decimalToBcd(now->tm_min) & 0x7F;
+ buffer[2] = decimalToBcd(now->tm_hour) & 0x3F;
+ buffer[3] = decimalToBcd(now->tm_mday) & 0x3F;
+ buffer[4] = now->tm_wday + 1;
+ buffer[5] = decimalToBcd(now->tm_mon+1) & 0x1F;
+ buffer[6] = decimalToBcd(now->tm_year + 1900 - 2000);
+
+ if(!write(SEC, buffer[0]))return 0;
+ if(!write(MIN, buffer[1]))return 0;
+ if(!write(HOUR, buffer[2]))return 0;
+ if(!write(DAY, buffer[3]))return 0;
+ if(!write(WDAY, buffer[4]))return 0;
+ if(!write(MONTH, buffer[5]))return 0;
+ if(!write(YEAR, buffer[6]))return 0;
+
+ // clear stop signal
+ buffer[0] = 0x00;
+ if(!write(STOPEN, buffer[0]))return 0;
+
+ return true;
+}
+
+bool PCF85263AT::IsConnected()
+{
+ bool ok = false;
+
+ i2c.start();
+ i2c.stop();
+
+ if (i2c.read(address, &data[0], 1) != 0)
+ {
+// dbg.printf("PCF85263AT is not detected\r\n");
+ ok = false;
+ }
+ else
+ {
+// dbg.printf("PCF85263AT is detected\r\n");
+ ok = true;
+ }
+
+ data[0] = 0;
+ i2c.start();
+ i2c.stop();
+
+ return ok;
+}
+
+bool PCF85263AT::software_reset()
+{
+ char buffer = 0x2C;
+
+ if(!write(RESET, buffer)) return 0;
+
+ return 1;
+}