瀏覽代碼

update: change time diff retry with count not timeout, scan slave state only when slaves scan base done

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu 3 月之前
父節點
當前提交
fa90b5980b
共有 1 個文件被更改,包括 19 次插入14 次删除
  1. 19 14
      src/ec_slave.c

+ 19 - 14
src/ec_slave.c

@@ -10,11 +10,11 @@
  * Wait for DC time difference to drop under this absolute value before
  * requesting SAFEOP.
  */
-#define EC_DC_MAX_SYNC_DIFF_NS 1000
+#define EC_DC_MAX_SYNC_DIFF_NS 100
 
-/** Maximum time (in ms) to wait for clock discipline.
+/** Maximum count to wait for clock discipline.
  */
-#define EC_DC_SYNC_WAIT_MS     (5000 * 1000)
+#define EC_DC_SYNC_WATI_COUNT  (15000)
 
 /** Time offset (in ns), that is added to cyclic start time.
  */
@@ -313,13 +313,17 @@ repeat_check:
     slave->current_state = EC_READ_U8(datagram->data);
 
     if (!(slave->current_state & EC_SLAVE_STATE_ACK_ERR)) {
-        EC_SLAVE_LOG_ERR("Slave %u acked state %s, alstatus code: 0x%04x (%s)\n",
-                         slave->index,
-                         ec_state_string(slave->current_state, 0),
-                         status_code,
-                         ec_alstatus_string(status_code));
+        if (slave->current_state == slave->requested_state) {
+            return 0;
+        } else {
+            EC_SLAVE_LOG_ERR("Slave %u acked state %s, alstatus code: 0x%04x (%s)\n",
+                             slave->index,
+                             ec_state_string(slave->current_state, 0),
+                             status_code,
+                             ec_alstatus_string(status_code));
 
-        return -EC_ERR_ALERR;
+            return -EC_ERR_ALERR;
+        }
     } else {
         if ((jiffies - start_time) > ec_slave_state_change_timeout_us(slave->current_state, requested_state)) {
             return -EC_ERR_TIMEOUT;
@@ -671,7 +675,7 @@ static int ec_slave_config(ec_master_t *master, ec_slave_t *slave)
             return ret;
         }
 
-        start_time = jiffies;
+        start_time = 0;
     read_check:
         ec_datagram_fprd(datagram, slave->station_address, ESCREG_OF(ESCREG->SYS_TIME_DIFF), 4);
         ec_datagram_zero(datagram);
@@ -683,9 +687,10 @@ static int ec_slave_config(ec_master_t *master, ec_slave_t *slave)
 
         uint32_t time_diff = EC_READ_U32(datagram->data) & 0x7fffffff;
         if (time_diff > EC_DC_MAX_SYNC_DIFF_NS) {
-            if ((jiffies - start_time) > EC_DC_SYNC_WAIT_MS) {
-                EC_SLAVE_LOG_WRN("Slave %u DC time diff %u ns is too high, please increase your waitting time\n",
-                                 slave->index, time_diff);
+            start_time++;
+            if (start_time > EC_DC_SYNC_WATI_COUNT) {
+                EC_SLAVE_LOG_ERR("Slave %u DC time diff sync failed\n",
+                                 slave->index);
                 return -EC_ERR_TIMEOUT;
             }
             goto read_check;
@@ -1289,7 +1294,7 @@ void ec_slaves_scanning(ec_master_t *master)
         ec_master_calc_dc(master);
     }
 
-    if (master->slave_count) {
+    if (master->slave_count && master->scan_done) {
         ec_master_scan_slaves_state(master);
     }
 }