我想提前为这篇文章的篇幅道歉。我想提供尽可能多的信息,以便我可以帮助您(读者)更好地了解可能发生的事情。对不起。
我目前正在从事一个项目,该项目使用 st25r3914
NFC 芯片来检测 NFCa 标签并与之交互。此外,我正在
为 ST25R3911B库使用预制的 RFAL,这样我就可以快速启动和运行芯片。不幸的是,这个过程并不顺利。我遇到了与标签交互的问题。
背景资料
- NFC 芯片 - ST25R3914
- NFC 库 - ST25R3911B 的 RFAL
- 单片机-恩智浦S32K144
- 操作系统:NXP freeRTOS
我已经成功地将预制库与我的其余代码合并,并在
platform.h头文件中填充了所有必要的内容。为了测试库是否设置正确,我使用了文档附带的
exampleRfalNfca.c示例程序。
鉴于函数rfalInitialize()的返回值为
0 (
ERR_NONE ) ,我已验证系统正在正确初始化 RFAL 库。为了增加信心,我还启用了
ST25R_SELFTEST和
ST25R_SELFTEST_TIMER以完全确保一切都已正确初始化和设置。在启用两个宏的情况下,该函数仍返回 0。
我遇到的问题出现在示例程序的下一部分。当我最初为系统供电并将标签靠近天线时,程序成功检测到它。然后它继续运行冲突解决例程。此时函数返回值
4 (
ERR_TIMEOUT ) 并且不会继续算法的其余部分。然后它返回并重新启动该过程。这一次,当我将标签靠近天线时,函数
rfalNfcaPollerTechnologyDetection()始终返回值 4 并且不再检测到标签。调试库后,我发现在第一次检测到标签后,该字段不再打开,即使程序运行代码将其打开。这可以解释为什么不再检测到标签。
调试
然后我开始逐句检查代码以找出发生这种情况的确切原因。我唯一能弄清楚的是,当系统最初通电并且未检测到标签时,在
ST25R3911_REG_OP_CONTROL_tx_en位已在
ST25R3911_REG_OP_CONTROL寄存器中设置后( rfalFieldOnAndStartGT例程中的此步骤),该字段立即打开。一旦检测到标签并且程序设置了
tx_en位,该字段就不会打开。我已经使用示波器验证了这个理论。图像
nfc_field显示检测到标签之前的信号,图像
no_nfc_field显示之后。
我的下一个想法是,这可能与中断有关。我开始确定中断线和 SPI 外设的范围。我观察到当库试图检测标签时,会发生 2 次中断。第一个是由 I_txe(传输结束引起的 IRQ)引起的。第二个是由 I_tim(由于定时器或 NFC 事件引起的 IRQ)和 I_nre(由于无响应定时器超时引起的 IRQ)引起的。这是有道理的。然后,当我将标签靠近天线时,会发生 3 次中断。第一个总是一样的,I_txe。第二个是由 I_rxs(由于接收开始导致的 IRQ)引起的。第三个是因为 I_rxe(由于接收结束导致的 IRQ)。这也是有道理的。之后只有 2 个中断发生,原因与第一个解释相同( I_txe 和 (I_tim & I_nre) )。这是我观察到一些有趣的地方。第一组 2 个中断(标记之前)之间的时间约为 162us。找到标签后,他们之间的时间是 81 us。这对我来说有点奇怪,不知道为什么芯片产生中断的速度是原来的两倍。我附上了 3 张图片以显示所有三个实例中的 IRQ 行 -
irq_beforeTag、
irq_tagDetected和
irq_afterTag。
有谁知道会发生什么?我已经花了 2 天时间尝试对此进行调试,但无济于事。