NFC ACR122 TgInitAsTarget,发射剂释放靶标

时间:2014-01-10 18:05:57

标签: nfc hce acr122

我正在尝试让我的ACR122(usb)设备模拟无源NFC标签,但很难让通信正常发生。我希望有人能看到我在这里做错了什么,并帮助我指出正确的方向。

对另一个问题ACR122 - Card Emulation的回复指出了http://code.google.com/p/nfcip-java/source/browse/trunk/nfcip-java/doc/ACR122_PN53x.txt处的文档,但是当我们按照这个问题发表时,它的行为并不像预期的那样。

我们正在使用Samsung Galaxy S3 Android 4.3设备进行测试,并且看到以下行为:

Transmit (TgInitAsTarget)
....'......4V@..  FF 00 00 00 27 D4 8C 00 08 00 12 34 56 40 01 FE 
................  A2 A3 A4 A5 A6 A7 C0 C1 C2 C3 C4 C5 C6 C7 FF FF 
...wfUD3"...      AA 99 88 77 66 55 44 33 22 11 00 00 

Receive
..%....7.5<...w.  D5 8D 25 1E D4 00 08 37 D9 35 3C BF D5 AE 77 9C 
...2Ffm.........  00 00 00 32 46 66 6D 01 01 11 03 02 00 13 04 01 
...               96 90 00 

Transmit (GetData)
.......           FF 00 00 00 02 D4 86 

Receive
..)..             D5 87 29 90 00 

TgInitAsTarget命令似乎正在工作,返回模式0x25,我们理解这意味着“活动模式,DEP,424kbps”。

然后“GetData”命令立即失败,返回状态码0x29“配置为目标的PN532已被其发起者释放”。

我们尝试使用不同的模式(而不是0x00“All”模式)更改TgInitAsTarget命令,尝试以下所有仍然返回0x29以获取以下GetData命令:

  • 模式0x01“被动”,导致响应模式为0x04“DEP”
  • 模式0x02“DEP”,导致响应模式为0x25(与“全部”相同)
  • 模式0x03“DEP被动”导致响应模式为0x04“DEP”

在所有情况下,似乎Android都没有维持连接,尽管我不熟悉NFC DEP协议,足以知道我在这里做错了什么。我已经阅读了PN532芯片参考,它似乎表明我正在做的一切正确。

我也尝试过使用Windows Phone NFC设备,它在GetData上遇到同样的问题和相同的错误代码。

任何熟悉NFC的人都会非常感谢。

戴夫

1 个答案:

答案 0 :(得分:2)

要将ACR122(或其中的PN532 NFC控制器芯片)置于卡仿真模式,您可以执行以下操作:

  1. ReadRegister:

    > FF000000 08 D406 6305 630D 6338
    < D507 xx yy zz 9000
    
  2. 更新寄存器值:

    xx = xx | 0x004;  // CIU_TxAuto |= InitialRFOn
    yy = yy & 0x0EF;  // CIU_ManualRCV &= ~ParityDisable
    zz = zz & 0x0F7;  // CIU_Status2 &= ~MFCrypto1On
    
  3. WriteRegister:

    > FF000000 11 D408 6302 80 6303 80 6305 xx 630D yy 6338 zz
    < D509 9000
    
  4. SetParameters:

    > FF000000 03 D412 30
    < D513 9000
    
  5. TgInitAsTarget

    > FF000000 27 D48C 05 0400 123456 20 000000000000000000000000000000000000 00000000000000000000 00 00
    < D58D xx ... 9000
    

    xx应该等于0x08。

  6. 使用一系列TgGetData和TgSetData命令进行通信:

    > FF000000 02 D486
    < D587 xx <C-APDU> 9000
    

    其中xx是状态代码(成功应为0x00),而C-APDU是读者发送的命令。

    > FF000000 yy D48E <R-APDU>
    < D587 xx 9000
    

    yy为2 + R-APDU(响应)的长度,xx为状态代码(成功应为0x00)。