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

Revision:
2:08ccf5062b69
Parent:
1:98c4a45b646a
--- 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){