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