SONY製のNFCカードリーダ RC-S620/S をイニシエータとして使用し、NFC Type-A/Bと通信するライブラリです。FeliCaとは通信できません。(This library can't communicate with FeliCa! Only for NFC Type-A/B.)

Dependents:   DLC_STARTER

Files at this revision

API Documentation at this revision

Comitter:
hmizuno
Date:
Sat Jun 13 01:57:30 2020 +0000
Parent:
1:98c4a45b646a
Commit message:
Add timeout retry when UART communication fails

Changed in this revision

RCS620S_AB.cpp Show annotated file Show diff for this revision Revisions of this file
RCS620S_AB.h Show annotated file Show diff for this revision Revisions of this file
--- a/RCS620S_AB.cpp	Sat Jun 06 04:58:49 2020 +0000
+++ b/RCS620S_AB.cpp	Sat Jun 13 01:57:30 2020 +0000
@@ -18,6 +18,8 @@
     }
     
     void RCS620S_AB::wakeUp(){
+        //powerdown直後に呼ばれた場合でも10ms以上確保
+        wait_ms(11);
         _serial.putc(0x55);
         wait_ms(50);
     }
@@ -136,9 +138,14 @@
         clearRecieveBuffer();
     
         //コマンドを送信
-        for(i = 0; i <= (5 + LEN + 1); i++){
-            _serial.putc(packet_data_command[i]);
-        }
+        //busy中に送り付けてしまっても自動リトライするよう改良 20/6/11
+        //ACK応答が返ってくるまでコマンドを送り付ける
+        //ただし配線が外れてたら無限ループ
+        do{
+            for(i = 0; i <= (5 + LEN + 1); i++){
+                _serial.putc(packet_data_command[i]);
+            }
+        }while(!isACKrecieved(UART_TRANSMIT_FAIL_TIMEOUT_MS));
     
         //powerdownの時はレスポンスが返ってこないので受信待機が無限ループに入ってしまう
         //powerdown時はACKのみチェックする
@@ -225,6 +232,19 @@
         }
     }
 
+    //ACK受信待ち
+    bool RCS620S_AB::isACKrecieved(int timeout_ms){
+        int elapsedTime = 0;
+        do{
+            wait_ms(1);
+            elapsedTime++;
+            if(elapsedTime > timeout_ms){
+                return false;
+            }
+        }while(recieveLEN < sizeof(wired_complete_ACK));
+        return true;
+    }
+
     //読み取り完了まで待機
     //ACK受信後、一定時間経過しても受信文字数が増えなくなる(=RX割り込みがかからない=受信完了)まで待機
     void RCS620S_AB::waitWhileRead(int cycleTime_ms){
--- a/RCS620S_AB.h	Sat Jun 06 04:58:49 2020 +0000
+++ b/RCS620S_AB.h	Sat Jun 13 01:57:30 2020 +0000
@@ -12,6 +12,12 @@
 */
 #define READ_BUF_SIZE 256
 
+/**
+ @def UART_TRANSMIT_FAIL_TIMEOUT_MS
+ UARTコマンド送信後ACK応答が返ってこない場合にタイムアウトする時間(ミリ秒)
+ (Time-out when ACK response is not returned after sending UART command.)
+*/
+#define UART_TRANSMIT_FAIL_TIMEOUT_MS 1000
 
 /** RCS620S_AB class.
 * RC-S620/Sをイニシエータとして使用しNFC Type-A/Bカードと通信するためのライブラリです。
@@ -190,8 +196,12 @@
      //カードリーダ UART受信割込み
     void serialRxIrq();
     
+    //受信割込みバッファをクリア
     void clearRecieveBuffer();
-
+    
+    //ACK応答待ち
+    bool isACKrecieved(int timeout_ms);
+    
     //読み取り完了まで待機
     void waitWhileRead(int cycleTime_ms);