模拟卡片时,Elechouse PN532返回超时

时间:2020-04-22 13:36:10

标签: c arduino embedded nfc pn532

我想将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() 函数中。< / p>

有什么想法吗?


1)PN532模块正在工作-因为我能够获取固件版本(在本示例中也是如此)或执行其他操作。
2)在终端的输出中,最后一行是 tgInitAsTarget() 函数的写帧。但是在第57页的application note中给出了所有参数。而且它们与库函数中的那些有所不同。我尝试从此应用笔记中粘贴参数,但不能解决问题
3)我认为问题是,在MCU将数据(写帧)发送到PN532芯片后,它无法读取RDY寄存器-或在获得此命令时PN532不会将其设置为1。这就是为什么它卡在 readResponse() 函数

上的原因

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

1 个答案:

答案 0 :(得分:0)

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

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