2

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

对另一个问题ACR122 - Card Emulation的响应指向http://code.google.com/p/nfcip-java/source/browse/trunk/nfcip-java/doc/ACR122_PN53x.txt的文档,但是当我们关注从字面上看,它的行为并不像预期的那样。

我们正在使用三星 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 命令,尝试以下所有仍为以下 GetData 命令返回 0x29 的命令:

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

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

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

任何熟悉 NFC 的人的帮助将不胜感激。

戴夫

4

1 回答 1

2

为了让 ACR122(或者更确切地说是其中的 PN532 NFC 控制器芯片)进入卡模拟模式,您需要执行以下操作:

  1. 读注册:

    > 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. 写寄存器:

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

    > 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
    

    其中yy2 + R-APDU(响应)的长度,xx是状态码(应该是0x00成功)。

于 2014-01-14T06:39:28.467 回答