0

我想将 Elechouse PN532 NFC 模块 V3 模拟为 ISO/IEC 1443-4A 卡。我使用 Arduino Uno 作为开发板。我还从Github下载了他们的库并运行了一些示例来检查 NFC 模块是否工作正常(ISO 卡读取)。检查模块后,我熟悉了 PN532 应用笔记,如何模拟 ISO/IEC 1443-4A 卡。所以,我使用tgInitAsTarget()函数来设置参数和 UID。但是这个函数返回超时错误。启用调试后,我得到以下输出:

write:  02
read:   03 32 01 06 07
Found chip PN532
Firmware ver. 1.6
write:  8C 00 00 00 00 00 00 40 01 FE 0F BB BA A6 C9 89 00 00 00 00 00 00 00 00 FF FF 01 FE 0F BB BA A6 C9 89 00 00 06 46 66 6D 01 01 10 00
0

我的 Arduino 划痕:

#include <PN532_SPI.h>
#include "PN532.h"

PN532_SPI pn532spi(SPI, 10);
PN532 nfc(pn532spi);

void setup(){    
  Serial.begin(115200);

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }

  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

  Serial.println(nfc.tgInitAsTarget(1000));
}

void loop()
{}

如果我没有向tgInitAsTarget()传递任何参数,它就会卡在readResponse()函数中。

有什么想法吗?


1)PN532 模块正在工作 - 因为我能够获得固件版本(在这个例子中也是如此)或做其他事情。
2) 在终端输出的最后一行是tgInitAsTarget()函数的写入帧。但在第 57 页的应用说明中给出了所有参数。它们那些在库函数中的不同。我尝试粘贴此应用笔记中的参数,但并没有解决问题
3)在我看来,问题是 MCU 向 PN532 芯片发送数据(写入帧)后,无法读取 RDY 寄存器- 或 PN532 收到此命令时未将其设置为 1。这就是为什么它停留在readResponse()函数上的原因

PC - 根据参考手册,RDY 寄存器是特定寄存器“它允许主机控制器知道 PN532 是否准备好接收或发送回数据”。

4

1 回答 1

0

检查您用于与 PN532 通信的 Arduino 库支持的最大消息大小。我最近遇到了类似的情况——使用 I2C 在 Arduino Uno 和 PN532 之间进行通信。当我尝试发送tgInitAsTarget命令时出现超时,因为 Arduino“Wire”库具有 32 字节的 I2C 通信缓冲区大小,因此它无法将完整命令发送到 PN532(即使 Adafruit 的调试输出/Seeed PN532 库在调试串口上打印出整个命令,令人困惑)。

您可能需要破解 Wire/SPI Arduino 库来增加缓冲区大小,或者编写自己的 I2C/SPI 驱动程序。

于 2021-01-07T21:39:36.520 回答