ST意法半导体
直播中

王静

8年用户 1630经验值
私信 关注
[问答]

ST25R3911B库使用预制的RFAL遇到与标签交互的问题如何解决

我想提前为这篇文章的篇幅道歉。我想提供尽可能多的信息,以便我可以帮助您(读者)更好地了解可能发生的事情。对不起。
我目前正在从事一个项目,该项目使用 st25r3914 NFC 芯片来检测 NFCa 标签并与之交互。此外,我正在为 ST25R3911B库使用预制的 RFAL,这样我就可以快速启动和运行芯片。不幸的是,这个过程并不顺利。我遇到了与标签交互的问题。
背景资料
  • NFC 芯片 - ST25R3914
  • NFC 库 - ST25R3911B 的 RFAL
  • 单片机-恩智浦S32K144
  • 操作系统:NXP freeRTOS
我已经成功地将预制库与我的其余代码合并,并在platform.h头文件中填充了所有必要的内容。为了测试库是否设置正确,我使用了文档附带的exampleRfalNfca.c示例程序。鉴于函数rfalInitialize()的返回值为0 ( ERR_NONE ) ,我已验证系统正在正确初始化 RFAL 库。为了增加信心,我还启用了ST25R_SELFTESTST25R_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_beforeTagirq_tagDetectedirq_afterTag
有谁知道会发生什么?我已经花了 2 天时间尝试对此进行调试,但无济于事。


回帖(1)

李秀兰

2022-12-5 15:17:34
我终于让图书馆开始工作了。该问题是由 NXP 实施 SPI 协议的方式引起的。事实证明,在库中,有几个实例,其中 Tx 和 Rx 在两个单独的事务中完成。当您控制 CS 线路时,这非常有效,但由于 NXP SDK 在每次调用其传输功能时控制这条线路,因此两个实例都被视为两个不同的 SPI 调用。

鉴于此信息,当程序调用st25r3911ReadFifo时,第二次 SPI 调用覆盖了osc 位,这不可避免地导致芯片输出 27.2Mhz 信号。
解决方案
查看文档后,我偶然发现了ST25R_COM_SINGLETXRX预处理器指令,正如您在帖子中提到的那样。我启用了它并且图书馆工作了。我现在可以检测标签了。
谢谢布赖恩的帮助!我真的很感激。
对于使用带有 freeRTOS 的 NXP SDK 的任何其他人


  • 设置类似于ST25 嵌入式 NFC 库的项目(freeRTOS 示例)
  • 为 platformProtect 创建一个 Mutex 而不是 taskENTERCRITICAL/EXIT。
  • 创建二进制信号量用于在 IRQ 和主 NFC 任务之间触发。
  • 在编译时启用 ST25R_COM_SINGLETXRX 预处理器指令。

我相信这就是所有步骤。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分