SONY製のNFCカードリーダ RC-S620/S をイニシエータとして使用し、NFC Type-A/Bと通信するライブラリです。FeliCaとは通信できません。(This library can't communicate with FeliCa! Only for NFC Type-A/B.)
Diff: RCS620S_AB.cpp
- Revision:
- 2:08ccf5062b69
- Parent:
- 1:98c4a45b646a
diff -r 98c4a45b646a -r 08ccf5062b69 RCS620S_AB.cpp --- 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){