This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TRF7970A:TRF7970A

Guru**** 2561330 points
Other Parts Discussed in Thread: TRF7970A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/869928/trf7970a-trf7970a

器件型号:TRF7970A

您好!

我正在打开一个相关的问题、因为这是同一个项目、我仍然遇到 RFID 问题。

问题描述:

首先、我将使用一个靠近 RFID 的标签测试 RFID、然后我将尝试读取它、请查看下面的图像。

但与之前一样、Iso14443a_PollingCommand 未正确结束。

如果 Iso14443a_PollingCommand 返回 STATUS_FAIL、则最大调用5次。

以下序列始终会发生:

在 Iso14443A_PollingCommand 的第一次调用中 、TRF7970A 触发 一个带有 pui8_IrqStatus = 0xC0 = Protocol_error 的中断。

因此 、Trf797xIrqWaitTimeout 将 g_sTrf797xStatus 设置为 TX_ERROR 并返回。

在 Iso14443A_PollingCommand 的第二次调用 (因为第一个调用失败) 中 、TRF7970A 触发  一个带有 pui8_IrqStatus = 0x80 = TX_COMPLETE 的中断

在这个阶段、 Trf797xIrqWaitTimeout 函数正常工作、等待 TX_COMPLETE 并继续等待 RX_COMPLETE  

5.在此阶段,IRQStatus =0x40 =RX_COMPLETE 时,我正在等待 IRQ,但 TRF7970A 不会触发任何中断。

6. Trf797xIrqWaitTimeout 设置 g_sTrf797xStatus = NO_RESPONSE_received 原因 无论我等待多长时间,TRF7970A 都没有 IRQ (尝试等待 g_ui8IrqFlag 处于高电平而没有超时)

7.只要我反复调用 Iso14443a_PollingCommand ,就会重复此操作。

请提供帮助

此致

Jawad Khaleel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawad、您好!

    您的应用程序代码及其处理 IRQ 中断的方式似乎存在时序问题。

    如果您接收到一个0xC0的 IRQ、那么 这将表明 IRQ 中断不会被及时处理。 时序对于 TRF7970A 来说非常重要 、并且所有中断必须以高优先级进行处理。

    器件常见问题解答的第4.6节概述了获取0xC0 IRQ 状态的问题: http://www.ti.com/lit/pdf/sloa246

    当您重复该周期并得到 NO_RESPONSE_REPLUSY、这意味着标签未及时回复时、 如果您从未回复在未正确处理0xC0时首次尝试通信、则可能会在等待其他命令时处于等待状态。 因此、请解决0xC0的接收问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您的回复。

    我已经阅读 了器件常见问题解答的第4.6节、概述了获得0xC0 IRQ 状态的问题。

    但这对我没有太大帮助!

    我的 MCU 以168MHz (认为这足够了)的频率运行(尝试使用480MHz、但它没有解决问题。)

    我的 SPI 波特率为3MBit/s (尝试从1.5到3Mbit/s)

    我为 IRQ 引脚提供了最高优先级(优先级= 1),这样我就不会错过中断。

    每次收到中断时、我都使用0x0F 直接命令重置 FIFO、甚至尝试在 Iso14443A_PollingCommand 之前添加中断、  但这无法解决0xC0问题。

    因此、我快速获得中断、因为中断具有最高优先级、并且每次需要时都将 FIFO 复位、但仍然将  0xC0作为 IRQ 状态。

    你认为我错了什么!?

    请帮帮我。

    此致

    Jawad Khaleel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawad、您好!

    您能否获得逻辑状态分析器、并在器件启动期间观察所有 SPI 线路+ IRQ、直至遇到错误情况?

    具体而言、我需要每个 SPI 命令之间具有精确(ms 最小值、我们首选)时序的波形、以便查看命令的顺序、IRQ 触发的时间以及 MCU 正在读取哪些标志。

    如果您在家中没有这种解决方案、Saleae 可为您提供良好的解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    再次感谢您的帮助。

    我 没有逻辑状态分析器、而是有一个常规示波器、在这里我捕获了所有 SPI 线路和 IRQ 线路、如下所示。

    SPI MISO 是黄色线。

    SPI MOSI 是蓝线。

    SPI SCK 是紫色线。

    IRQ 是绿线。

    发送的命令如下所述。

    1.按照数据表中的说明为 VIN、SS、EN2、EN 供电。

    2.检查 SPI 连接:

    2.1.我发送 SOFT_INIT (0x03)命令、因此0x83被发送到 TRF7970A

    2.2我发送 IDLE_Command (0x00)、因此0x80发送到  TRF7970A

    2.3我对 TRF797x_MODEG_CONTROL 执行读取寄存器单命令

    因此、0x49  被发送到  TRF7970A

    并按照预期接收一个字节 MODERAM_CONTINL_VALUE ACT_SOFT_INIT (0x91)

    3. Trf797xInitialSettings (Trf797xInitialSettings):

    3.1发送 TRFSET (0x0F) directet 命令

    因此、0x8F 被发送到  TRF7970A

    3.2将 TRF797x_MODEG_CONTROL 值更新为0x01

    因此、0x0901被发送到  TRF7970A

    3.3将 TRF797x_NFC_TARGET_LEVEL 值更新为0x00

    因此、0x1800被发送到  TRF7970A

    3.4按照 上一个主题中的建议、将 TRF797x_reguler_control 更新为0x01  

    因此、0x0B01被发送到  TRF7970A

    4、 NFC_Iso14443A_Read:

    4.1将 TRF797x_STATUS_CONTROL 值更新为0x21

    因此、0x0021被发送到  TRF7970A

    4.2 Trf797xWriteInitiatorSetup (0x88)

    4.2.1将 TRF797x_ISO_CONTROL 值更新 为0x88

    因此、0x0188被发送到  TRF7970A

    4.2.2将 TRF797x_MODEG_CONTROL 值更新 为0x01

    因此、0x0901被发送到  TRF7970A

    4.2.3将 TRF797x_FIFO_IRQ_LEVENTIVENTIVATE_VALUE 更新 为0x0C

    因此、0x140C 被发送到  TRF7970A

    4.3 Iso14443a_TagSelection (REQA)

    4.3.1 Iso14443a_PollingCommand (ui8Command)

    我通过 SPI 发送下面的缓冲区

    G_ui8TrfBuffer[0]= 0x8F;//复位 FIFO
    G_ui8TrfBuffer[1]= 0x90;//发送而不带 CRC
    G_ui8TrfBuffer[2]= 0x3D;//连续写入
    G_ui8TrfBuffer[3]= 0x00;//数据包长度(以字节为单位)-发送字节长度的上半字节和中半字节
    G_ui8TrfBuffer[4]= 0x0F;//数据包长度(以字节为单位)-发送字节长度的较低半字节和不完整半字节
    G_ui8TrfBuffer[5]= 0x26;//从函数输入发送轮询命令- REQA (0x26)或 WUPA (0x52)

    在这里、我们可以看到在轮询命令之后中断引脚上升

    发送到 TRF7970A 的命令 与4.3.1中的命令相同

    您可以看到、在使用 POLLING 命令90-96us 后、中断上升

    6、您可以看到中断上升了900 μ s、再次变为低电平

    发送到 TRF7970A 的命令 与4.3.1中的命令相同

    7、这是对6上中断线下降的更深入的了解

    在这里您可以看到当我读取 IRQ 寄存器....时我获得的0xC0

    没有两个中断我错过了第一个中断!

    900us 上升持续时间是否合适? 轮询命令之后的上升时间96us 是正确的?

    此致

    Jawad Khaleel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawad、您好!

    这里的重点是、您没有丢失 IRQ、但您没有足够及时地为第一个 IRQ 提供服务、这些捕获使这一点变得非常清楚。

    [引用 user="Jawad Khaleel"]且轮询命令后的上升时间96us 是否正确?

    是的。

    [引用 user="Jawad Khaleel">900us 上升持续时间是否合适? [/报价]

    甚至不接近、这种速度非常慢、是根本原因。 您没有及时读取 IRQ。 典型的 IRQ 高电平时间应低于30us。 接收到 IRQ 时、MCU 应立即读取 IRQ 寄存器以获取清除 IRQ 的状态。

    等待如此长的时间后、RX 在 TX 被注册之前就已经启动、因此您可能会因为 FIFO 未被复位而获得损坏的数据。 因此、固件将处理此错误情况并在该处停止通信以重新启动。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    这是我 的 Trf797xIRQ 函数:

    void Trf797xIRQ (void)//中断处理程序
    {
    uint8_t ui8IrqStatus、ui8IsoControl;
    g_ui8IrqFlag = 0x01;
    
    DO
    {
    // IRQ 状态寄存器必须读取
    Trf797xReadIqStatus (&ui8IrqStatus);
    
    if (ui8IrqControl = 0x778xEr);
    
    
    
    
    
    
    仅限 UCC24_IsoT = 0x870x7字节
    ;IsoQ4 = 0x7字节;IQ7uQTR_EQ4 = 0x7)
    if ((ui8IsoControl & BIT5)!= BIT5)// RFID 模式
    {
    Trf797xISR (&ui8IrqStatus);
    }
    else// NFC 模式
    {
    //不执行任何操作
    }
    
    }while (HAL_GPIO_ReadPin (RFID_IRQ_GPIO_Port、RFID_IRQ_Pin)=GPIO_PIN_SET);
    } 

    由于我为该中断引脚提供了最高优先级、因此中断会立即启动。
    在 TRF7970A 能够降低 IRQ 引脚之前、MCU 是否能够这么快并反复读取 ui8IrqStatus?

    此致
    Jawad Khaleel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawad、您好!

    我不熟悉您的 MCU、但很明显、它不会以您所期望的优先级触发中断。

    https://e2e.ti.com/cfs-file/__key/communityserver-discussions-components-files/667/TEK00015.PNG

    查看该图像-在得到0xC0之前不会读取 IRQ 状态。 MCU 无法像您描述的那样读取它。

    您需要与 MCU 支持团队合作、了解 IRQ 读取为何如此缓慢。 我无能为力。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    首先、感谢您的帮助。

    现在、我设法在 Iso14443a_PollingCommand 之后单独获取 TX_COMPLETE 和 RX_COMPLETE 、但在 RX_COMPLETE 之后、我使用获得了另一个中断

     G_sTrf797xStatus = NO_RESPONSE_received;

    此中断导致 Iso14443a_PollingCommand 在末尾返回 STATUS_FAIL

    状态 为 NO_RESPONSE_received 的中断是什么意思!? 是否    接收到 TX_COMPLETE 和 RX_COMPLETE?

    接收到 RX_COMPLETE 后是否禁用中断引脚是一个选项? 或者在 第三个中断之前,我仍然需要从 Iso14443a_PollingCommand 返回吗?

    或者可能还有另一种方法可以对 TRF7970A 进行频带 、以发送没有响应的中断?

    此致

    Jawad Khaleel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jawad、您好!

    NFC 需要在数据包之间进行精确计时。 如果标签未根据规格及时回复、则 会触发 NO_RESPONSE_received 状态。

    NO_RESPONSE_received 实际上意味着未接收到 IRQ。 每次传输都会有一个超时、如果超时发生在 IRQ 之前、则 会设置 NO_RESPONSE_received 状态。

    您应该注意的一件事是超时是否正确发生。 移植时、有时会不正确处理超时问题。 您可能希望切换和监控 GPIO 以验证 RX 超时是否正确发生(因此、在启动 RX 超时时时时升高引脚、并在完成时降低引脚)。