Kenji Arai / RX8025NB

Dependents:   TYBLE16_simple_data_logger Check_external_RTC

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Tue Dec 17 23:19:54 2019 +0000
Parent:
5:e8e8b1b6c103
Child:
7:4793c4817590
Commit message:
modified init() routine

Changed in this revision

RX8025NB.cpp Show annotated file Show diff for this revision Revisions of this file
RX8025NB.h Show annotated file Show diff for this revision Revisions of this file
--- a/RX8025NB.cpp	Tue Aug 22 10:16:48 2017 +0000
+++ b/RX8025NB.cpp	Tue Dec 17 23:19:54 2019 +0000
@@ -3,64 +3,54 @@
  *  Control RX-8025NB Real Time Clock Module
  *  EPSON
  *
- * Copyright (c) 2015,'16,'17 Kenji Arai / JH1PJL
+ * Copyright (c) 2015,'16,'17,'19 Kenji Arai / JH1PJL
  *  http://www.page.sannet.ne.jp/kenjia/index.html
  *  http://mbed.org/users/kenjiArai/
  *      Created: June       3rd, 2015
- *      Revised: August    21st, 2017
+ *      Revised: December  17th, 2019
  */
 
 #include "mbed.h"
 #include "RX8025NB.h"
 
 RX8025::RX8025 (PinName p_sda, PinName p_scl) :
-_i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
+    _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
 {
     RX8025_addr = RX8025ADDR;
     init();
 }
 
-RX8025::RX8025 (I2C& p_i2c) : _i2c(p_i2c){
+RX8025::RX8025 (I2C& p_i2c) : _i2c(p_i2c)
+{
     RX8025_addr = RX8025ADDR;
     init();
 }
 
 /////////////// Initialize ////////////////////////////////
-void RX8025::init(){
+void RX8025::init()
+{
     tm t;
     char dt;
 
     _i2c.frequency(400000);
-    dt = read_reg_byte(RX8025_REG_CONTL2);
-    if (dt &  0x10){   // Power on reset
-        dt = write_reg_byte(RX8025_REG_CONTL2, 0);   // all clear
-        // Set 24H
-        dt = read_reg_byte(RX8025_REG_CONTL1);
-        dt |= 0x20;
-        dt = write_reg_byte(RX8025_REG_CONTL1, dt);
-        // set January 1st,2016 1am as a default
-        t.tm_sec  = 0;
-        t.tm_min  = 0;
-        t.tm_hour = 1;
-        t.tm_mday = 1;
-        t.tm_wday = 0;
-        t.tm_mon  = 0;
-        t.tm_year = 116;
-        write_rtc_std(&t);
+    // Set 24H
+    dt = read_reg_byte(RX8025_REG_CONTL1);
+    if (dt & 0x20) { // set already
+        ;
     } else {
-        // Set 24H
-        dt = read_reg_byte(RX8025_REG_CONTL1);
         dt |= 0x20;
         dt = write_reg_byte(RX8025_REG_CONTL1, dt);
     }
 }
 
 /////////////// Read RTC data /////////////////////////////
-void RX8025::get_time_rtc (tm *t){
+void RX8025::get_time_rtc (tm *t)
+{
     read_rtc_std(t);
 }
 
-void RX8025::read_rtc_std (tm *t){
+void RX8025::read_rtc_std (tm *t)
+{
     rtc_time time;
 
     read_rtc_direct(&time);
@@ -79,11 +69,13 @@
 }
 
 /////////////// Write data to RTC /////////////////////////
-void RX8025::set_time_rtc (tm *t){
+void RX8025::set_time_rtc (tm *t)
+{
     write_rtc_std(t);
 }
 
-void RX8025::write_rtc_std (tm *t){
+void RX8025::write_rtc_std (tm *t)
+{
     rtc_time time;
 
     time.rtc_seconds  = t->tm_sec;
@@ -101,7 +93,8 @@
 }
 
 /////////////// Set Alarm-D / INTA ////////////////////////
-uint8_t RX8025::set_alarmD_reg (uint16_t time){
+void RX8025::set_alarmD_reg (uint16_t time)
+{
     tm t;
     char dt;
     uint8_t m, h;
@@ -115,12 +108,12 @@
     set = real + time;
     m = t.tm_min + (uint8_t)(time % 60);
     h = t.tm_hour;
-    if (m >= 60){
+    if (m >= 60) {
         m -= 60;
         h += 1;
     }
     h += (uint8_t)(time / 60);
-    if (h >= 24){
+    if (h >= 24) {
         h -= 24;
     }
     rtc_buf[2] = bin2bcd(h);
@@ -128,61 +121,54 @@
     rtc_buf[0] = RX8025_REG_ALARMD_MIN << 4;
     _i2c.write(RX8025_addr, rtc_buf, 3, false);
     dt = read_reg_byte(RX8025_REG_CONTL1);
-    dt |= 0x40;         // DALE = 1
+    dt |= 0x60;         // DALE = 1
     dt = write_reg_byte(RX8025_REG_CONTL1, dt);
-    real = bcd2bin(read_reg_byte(RX8025_REG_ALARMD_MIN));
-    real += (bcd2bin(read_reg_byte(RX8025_REG_ALARMD_HOUR)) * 60);
-    if (set == real) {
-        read_rtc_std(&t);   // read current time
-        real = t.tm_hour * 60 + t.tm_min;
-        if (set > real){
-            return 1;
-        } else {
-            return 0;
-        }
-    } else {
-        return 0;
-    }
 }
 
-void RX8025::set_next_alarmD_INTA (uint16_t time){
+//bool RX8025::set_next_alarmD_INTA (uint16_t time)
+void RX8025::set_next_alarmD_INTA (uint16_t time)
+{
     uint8_t ret;
     uint16_t t;
 
-    if (time < 2){
+    if (time < 2) {
         // Alarm does not check seconds digit.
         // If 59 to 0 is occured during setting here, 1 minute will have a trouble.
         t = 2;
-    } else if (time > 1440){   // Less than 24 hours
+    } else if (time > 1440) {  // Less than 24 hours
         t = 1440;
     } else {
         t = time;
     }
-    do{
-        ret = set_alarmD_reg(t);
-    } while(ret == 0);
+    set_alarmD_reg(t);
 }
 
 /////////////// Clear Alarm-D / INTA interrupt ////////////
-void RX8025::clear_alarmD_INTA (){
+void RX8025::clear_alarmD_INTA ()
+{
     char dt, reg;
-    reg = read_reg_byte(RX8025_REG_CONTL2);
-    do { // make sure to set Hi-imp state
+    
+    for (uint32_t i = 0; i < 40; i++) {
+        reg = read_reg_byte(RX8025_REG_CONTL2);
+        if ((reg & 0x01) == 0) {
+            break;
+        }
         dt = reg & 0xfe;
         write_reg_byte(RX8025_REG_CONTL1, dt);
-        reg = read_reg_byte(RX8025_REG_CONTL2);
-    } while (reg & 0x01);
+    }
 }
 
 /////////////// Read/Write specific register //////////////
-uint8_t RX8025::read_reg_byte(uint8_t reg){
+uint8_t RX8025::read_reg_byte(uint8_t reg)
+{
     rtc_buf[0] = reg << 4;
     _i2c.write(RX8025_addr, rtc_buf, 1, true);
     _i2c.read(RX8025_addr, rtc_buf, 1, false);
     return rtc_buf[0];
 }
 
-uint8_t RX8025::write_reg_byte(uint8_t reg, uint8_t data){
+uint8_t RX8025::write_reg_byte(uint8_t reg, uint8_t data)
+{
     rtc_buf[0] = reg << 4;
     rtc_buf[1] = data;
     _i2c.write(RX8025_addr, rtc_buf, 2, false);
@@ -190,12 +176,14 @@
 }
 
 /////////////// I2C Freq. /////////////////////////////////
-void RX8025::frequency(int hz){
+void RX8025::frequency(int hz)
+{
     _i2c.frequency(hz);
 }
 
 /////////////// Read/Write RTC another format /////////////
-void RX8025::read_rtc_direct (rtc_time *tm){
+void RX8025::read_rtc_direct (rtc_time *tm)
+{
     rtc_buf[0] = RX8025_REG_SEC << 4;
     _i2c.write(RX8025_addr, rtc_buf, 1, true);
     _i2c.read(RX8025_addr, rtc_buf, 10, false);
@@ -209,7 +197,8 @@
     tm->rtc_year = tm->rtc_year_raw + 100 + 1900;
 }
 
-void RX8025::write_rtc_direct (rtc_time *tm){
+void RX8025::write_rtc_direct (rtc_time *tm)
+{
     rtc_buf[RX8025_REG_YEAR + 1] = bin2bcd(tm->rtc_year_raw);
     rtc_buf[RX8025_REG_MON  + 1] = bin2bcd(tm->rtc_month);
     rtc_buf[RX8025_REG_WDAY + 1] = (tm->rtc_weekday & 0x07);
@@ -221,7 +210,8 @@
     _i2c.write(RX8025_addr, rtc_buf, 8, false);
 }
 
-uint8_t RX8025::bin2bcd (uint8_t dt){
+uint8_t RX8025::bin2bcd (uint8_t dt)
+{
     uint8_t bcdhigh = 0;
 
     while (dt >= 10) {
@@ -231,7 +221,8 @@
     return  ((uint8_t)(bcdhigh << 4) | dt);
 }
 
-uint8_t RX8025::bcd2bin (uint8_t dt){
+uint8_t RX8025::bcd2bin (uint8_t dt)
+{
     uint8_t tmp = 0;
 
     tmp = ((uint8_t)(dt & (uint8_t)0xf0) >> (uint8_t)0x4) * 10;
--- a/RX8025NB.h	Tue Aug 22 10:16:48 2017 +0000
+++ b/RX8025NB.h	Tue Dec 17 23:19:54 2019 +0000
@@ -3,11 +3,11 @@
  *  Control RX-8025NB Real Time Clock Module
  *  EPSON
  *
- * Copyright (c) 2015,'16,'17 Kenji Arai / JH1PJL
+ * Copyright (c) 2015,'16,'17,'19 Kenji Arai / JH1PJL
  *  http://www.page.sannet.ne.jp/kenjia/index.html
  *  http://mbed.org/users/kenjiArai/
  *      Created: June       3rd, 2015
- *      Revised: August    21st, 2017
+ *      Revised: December  17th, 2019
  */
 
 /*
@@ -172,7 +172,7 @@
 
     uint8_t bin2bcd(uint8_t);
     uint8_t bcd2bin(uint8_t);
-    uint8_t set_alarmD_reg (uint16_t time);
+    void set_alarmD_reg (uint16_t time);
     void init(void);
 
 private: