ACR122U发送直接命令返回-2和分段故障

时间:2014-06-30 09:40:25

标签: c centos apdu acr122 lib-nfc

我正在尝试向ACR122U阅读器发送直接命令。 我最简单的是:FF 00 48 00 00

此命令用于返回固件版本。使用ACR122U工具,我可以看到它工作正常。 我正在尝试使用nfc_initiator_transceive_bytes发送它并获取固件版本。 这就是我在做的事情:

uint8_t abtCmd[] = {0xFF,0x00,0x48,0x00,0x00};
int res = nfc_initiator_transceive_bytes(
            pnd,           
            abtCmd,
            5,
            pbtRx,
            400,           
            2000
            );

这总是返回-2。 nfc_initiator_transceive_bytes不正确吗?我究竟做错了什么? 谢谢!

PS:我在那里有\ xFF \ x00 \ x00 \ x00 \ x05,因为这是手册所说的(API_ACR122U_v1.4.pdf第6.1节直接命令)

我已经开始对libnfc进行调试了,我看到了这个:

  

debug libnfc.driver.acr122_usb TX:6f 0d 00 00 00 00 00 00 00   00 ff 00 00 00 08 d4 40 01 ff 00 48 00 00调试
  libnfc.driver.acr122_usb RX:80 05 00 00 00 00 00 00 81 00 d5   41 27 90 00

我可以看到ff 00 00 00 所以我想我不必在发送直接命令时指定,但这仍然是返回此:

  

debug libnfc.chip.pn53x芯片错误:“命令不可接受”   (27),返回错误:“无效的参数”(-2))

libnfc正在添加的十六进制是否正在弄乱这个?请任何人???

我也更改了初始代码。

我还尝试过使用nfc_target_send_bytes:

  

nfc_target_send_bytes(pnd,abtCmd,5,0);

这给了我一个分段错误。

1 个答案:

答案 0 :(得分:2)

libnfc是NFC接口设备(如ACR122U)的NFC功能的抽象层。因此方法nfc_initiator_transceive_bytes()已经处理了ACR122U设备特定的协议。

在您的情况下(您正在使用acr122_usb接口驱动程序),libnfc将直接与NFC CCID设备交互(由ACR122U公开),并将直接发送包含特定于读取器的命令的CCID帧(APDU包装的本机命令用于ACR122U内部的PN532 NFC控制器。

因此,对于nfc_initiator_transceive_bytes(),这意味着libnfc将执行以下操作:

  • 发送PN532命令InDataExchange(以d4 40开头),用于通过NFC向其他NFC设备发送数据。
  • 将PN532本机命令包装到APDU中以通过CCID传输(从ff 00 00 00 08开始)。
  • 将整个命令包装到USB CCID类框架中(从6f 0d开始)。

答案是:

  • 打开答案CCID框架(以80 05开头)。
  • 打开响应APDU(d5 41 27 90 00)。
  • 解码本机PN532 InDataExchange响应(d5 41 27)。

对于您而言,这实际上意味着您无法使用该方法发送ACR122U特定的APDU命令(ff 00 48 00 00)以使用此方法获取读取器的固件版本。相反,你应该使用例如如果要使用此类命令,PC / SC可直接向阅读器发送APDU命令。