Revision 0:47c63ed3af91, committed 2016-01-22
- Comitter:
- irsanjul
- Date:
- Fri Jan 22 08:50:40 2016 +0000
- Commit message:
- my prototype PCF8563's library
Changed in this revision
diff -r 000000000000 -r 47c63ed3af91 PCF8563.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF8563.cpp Fri Jan 22 08:50:40 2016 +0000
@@ -0,0 +1,118 @@
+#include "mbed.h"
+#include "PCF8563.h"
+
+extern Serial dbg;
+
+PCF8563::PCF8563(PinName sda, PinName scl) : pcf8563_i2c (sda, scl)
+{
+ pcf8563_i2c.frequency(PCF8563_FREQ);
+}
+
+time_t PCF8563::now()
+{
+ struct tm now;
+ char start = 0x02;
+ char buffer[7];
+
+ if(pcf8563_i2c.write(W8563_ADDR, &start, 1) != 0) return 0;
+ if(pcf8563_i2c.read(R8563_ADDR, buffer, 7) != 0) return 0;
+
+ 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[5] & 0x1F) - 1;
+ now.tm_year = bcdToDecimal(buffer[6]) + 2000 - 1900;
+
+ return mktime(&now);
+}
+
+bool PCF8563::set_time(time_t time)
+{
+ struct tm *now;
+ char buffer[8];
+
+ now = localtime(&time);
+
+ buffer[0] = 0x02; // memory address
+ buffer[1] = decimalToBcd(now->tm_sec) & 0x7F; // VL = 0
+ buffer[2] = decimalToBcd(now->tm_min) & 0x7F;
+ buffer[3] = decimalToBcd(now->tm_hour) & 0x3F;
+ buffer[4] = now->tm_wday + 1;
+ buffer[5] = decimalToBcd(now->tm_mday) & 0x3F;
+ buffer[6] = decimalToBcd(now->tm_mon+1) & 0x1F;
+ buffer[7] = decimalToBcd(now->tm_year + 1900 - 2000);
+
+ if(pcf8563_i2c.write(W8563_ADDR, buffer, 9) != 0) return 0;
+
+ return true;
+}
+
+bool PCF8563::set_alarm(time_t time)
+{
+ struct tm *now;
+ char buffer[5];
+
+ now = localtime(&time);
+
+ buffer[0] = 0x09; // memory address
+ buffer[1] = decimalToBcd(now->tm_min) & 0x80;
+ buffer[2] = decimalToBcd(now->tm_hour) & 0x80;
+ buffer[3] = decimalToBcd(now->tm_mday) & 0x80;
+ buffer[4] = (now->tm_wday + 1) & 0x80;
+ if(pcf8563_i2c.write(W8563_ADDR, buffer, 4) != 0) return 0;
+
+ char Int[2];
+ Int[0] = 0x01; // control address
+ Int[1] = 0x02; // set AIE to 1 for INT pin
+ if(pcf8563_i2c.write(W8563_ADDR, Int, 2) != 0) return 0;
+
+ return true;
+}
+
+bool PCF8563::alarmOff()
+{
+ char start = 0x01;
+ char buffer;
+
+ if(pcf8563_i2c.write(W8563_ADDR, &start, 1) != 0) return 0;
+ //if(pcf8563_i2c.read(R8563_ADDR, buffer, 1) != 0) return 0;
+
+ pcf8563_i2c.start();
+ pcf8563_i2c.write(R8563_ADDR);
+ buffer = pcf8563_i2c.read(0);
+ pcf8563_i2c.stop();
+
+ buffer = buffer - 0x08; // clear AF to turn off alarm
+
+ char send[2];
+ send[0] = 0x01; //control 1 address
+ send[1] = buffer;
+ if(pcf8563_i2c.write(W8563_ADDR, send, 2) != 0) return 0;
+
+ return true;
+}
+
+bool PCF8563::check_alarm()
+{
+ char start = 0x01;
+ char buffer;
+
+ if(pcf8563_i2c.write(W8563_ADDR, &start, 1) != 0) return 0;
+ //if(pcf8563_i2c.read(R8563_ADDR, buffer, 1) != 0) return 0;
+
+ pcf8563_i2c.start();
+ pcf8563_i2c.write(R8563_ADDR);
+ buffer = pcf8563_i2c.read(0);
+ pcf8563_i2c.stop();
+
+ buffer = buffer & 0x08;
+ if(buffer == 0x08)
+ {
+ dbg.printf("== ALARM ON ==\r\n");
+ wait_ms(200);
+
+ alarmOff();
+ }
+ return true;
+}
diff -r 000000000000 -r 47c63ed3af91 PCF8563.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF8563.h Fri Jan 22 08:50:40 2016 +0000
@@ -0,0 +1,61 @@
+#ifndef PCF8563_H
+#define PCF8563_H
+
+#define W8563_ADDR 0xA2 // I2C address for write
+#define R8563_ADDR 0xA3 // I2C address for read
+#define PCF8563_FREQ 400000 // bus speed 400 kHz
+
+class PCF8563
+{
+public:
+ PCF8563(PinName sda, PinName scl);
+
+ /** Read current real time from PCF8563
+ *
+ * @returns
+ * current time on success,
+ * 0 on error (I2C fail, clock not set)
+ */
+ time_t now();
+
+ /** Write current real time to PCF8563
+ *
+ * @param time Real time to set up
+ * @returns
+ * true on success,
+ * false on error (I2C fail)
+ */
+ bool set_time(time_t time);
+
+ /** Write alarm time to PCF8563
+ * @param time is set time for alarm
+ * @returns
+ * true on success,
+ * false on error
+ */
+ bool set_alarm(time_t time);
+
+ /**
+ */
+ bool alarmOff();
+
+ /**
+ */
+ bool check_alarm();
+
+ /**
+ */
+
+private:
+ I2C pcf8563_i2c;
+
+ static int bcdToDecimal(int bcd) {
+ return ((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F);
+ }
+
+ static int decimalToBcd(int dec) {
+ return (dec % 10) + ((dec / 10) << 4);
+ }
+};
+
+#endif