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.

[参考译文] CCS/TRF7970A:有源 P2P 通信不会切换到424kbps

Guru**** 2502785 points
Other Parts Discussed in Thread: TRF7970A, CC1201

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/897069/ccs-trf7970a-active-p2p-communication-not-switching-to-424kbps

器件型号:TRF7970A
主题中讨论的其他器件:MSP432P401RCC1201

工具/软件:Code Composer Studio

您好!

我具有与两个 MSP432P401R Launchpad 和两个 TRF7970A BoosterPack 的活动连接 P2P。

GUI 似乎显示了424kbps 的当前通信、但如果我在一个 MSP432P401R 中调试代码、我会在结构上看到当前通信速度为212kbps:

这是 GUI 错误吗? 为什么通信不是424kbps?

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

    您好、Michael、

    老实说、我不记得 GUI 是如何针对这种情况进行设置的、但查看代码、它看起来可能存在一个小错误:

    if (sTRF79x0Status.sInitialatorMode.bits.bActiveTypeF =1)
    {
    if (sTRF79x0Status.sInitialatorPayloadFrequency.b212kpbs)
    {
    g_sNfcStatus.sP2PActiveCommCurrent.bits.bActive212kbps = 1;
    }
    else if (sTRF79xbImpeds.b2kpbs
    
    )= 1;sP2 CommInitial.bq24kbps = 1;{sRF1b.bq24kbps = bq24kbps = bq24kbps
    
    

    if 和 else if 语句在这里是相同的。 我想这个想法是使用 b424kpbs 吗?

    奇怪的是、这同样适用于无源 P2P。

    无论如何、连接应该以424kbps 的速率运行(同样、我刚才注意到结构中的拼写错误吗?)、但是控制器中的变量没有得到正确的更新。

    所有这些都说了... 我们不建议使用主动 P2P 而非被动 P2P。 活动状态始终相当不稳定、很难在其他 NFC 设备之间工作。 最后、我还检查了 NFC 论坛未提供任何测试来验证有源 P2P 操作。 我们强烈建议改用无源 P2P、因为它的稳健性要高得多。

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

    是的、我早就看到了错误、我已经修复了它、并且添加了轮询函数中缺少的 if 语句。 现在、我只能为目标和发起方启用424 KB、它可以正常工作。

    我打算仅在两个器件 TRF7970A 之间使用以424kbs 有效的 NFC P2P。 我不想与其他设备兼容。

    在424kbs 有效时、两个 TRF7970A 之间的连接是否始终保持稳定? NFC 堆栈上是否存在任何软件问题?

    此致、

    Michael

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

    您好、Michael、

    软件方面不应该有问题、但问题更多地是一般硬件层面、而是由于 Active P2P 的工作方式、形成一个稳健的系统。

    让我们首先从基础知识开始。

    您为什么认为您需要主动 P2P? 您的要求是什么?主动解决这些要求如何优于被动解决?

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

    您好、Ralph、

    我的目标是通过无线方式发送数据、并且在两侧都有电源电压。

    正如我所理解的、无源器件在目标没有电源电压并且从 NFC 场获取功率的情况下、对吧?

    我希望从目标端以230、4kbps 的速率将 UART 数据发送到两端的发起方、这就是我希望使用424kbps 的原因。

    你怎么看?

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

    您好、Ralph、

    因此、我注意到我无法达到424kbps 的数据速率。

    在下面、您可以看到 main 中的代码、我们在 PC 上不使用 GUI 的情况下发送数据、并测量 GPIO 以查看数据的发送速度以及可以发送多少个数据包。

    • 如果我们发送1个字节、则大约需要14ms 重新发送下一个字节。  
    • 如果我们发送125个字节、则需要大约16.3ms 来重新发送接下来的125个字节
    • 如果我发送的字节超过125字节、NFC 状态将发生变化、并且不会停留在 NFC_DATA_EXCHANGE_Protocol 上

    我在一个方向和两个方向上进行了测试、它们仅在最大125字节的数据下工作。

    while (1)
    {
    eTempNFCState = NFC_run ();//侦听声器轮询
    
    if (eTempNFCState = NFC_DATA_EXCHANGE_Protocol)
    {
    
    if (NFC_P2P_getModeStatus (&sP2PMode、&sP2PBitrate))
    {
    COUNTER_NFC_P2P_getModeStatus++;
    //
    //读取接收状态结构-检查是否有来自目标的已接收数据包
    //
    sP2PRxStatus = NFC_p2p_getReceiveState();
    if (sP2PRxStatus.sDataReceivedStatus!= Received_no_sag碎片)
    {
    //UARTSend (((uint8_t *) sP2PRxStatus.pui8RxDataPtr、sP2PRxStatus.ui16DataFIXedLength);//TODO ReceivME
    }
    }
    
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);//LED
    }
    其他
    {
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);//LED
    }
    
    //更新当前状态(如果已更改)。
    if (eCurrentNFCState!= eTempNFCState)
    {
    if (eCurrentNFCState!= NFC_target_wait_for_activation
    && eCurrentNFCState!= NFC_State_Idle
    &&(eTempNFCState = NFC_Protocol_activation)
    || eTempNFCState == NFC_DISABLED)
    {
    eCurrentNFCState = eTempNFCState;
    
    //初始化 NFC-A、NFC-B 和 NFC-F 的 ID
    NFC_initIDs();
    
    ui16字节接收器= 0;
    ui32PacketRemaining = 0;
    }
    其他
    {
    eCurrentNFCState = eTempNFCState;
    }
    }
    
    if (g_ui16字节接收器=0)
    G_ui16BytesReceivats=125;//here 最大可发送的一个字节、为什么不发送更多字节?
    
    //检查是否已从 NFC 主机接收到任何数据包。
    if (g_ui16字节接收器>0 || g_ui16字节大小>0)
    {
    serial_processCommand();
    }
    }
    
    
    
    void Serial_processCommand (void)
    {
    uint8_t ui8FragmentLength;
    
    ui8FragmentLength = SNEP_getTxBufferStatus();
    
    if ((uint32_t) ui8FragmentLength > g_ui16BytesReceivt)
    {
    ui8FragmentLength =(uint8_t) g_ui16BytesReceivent;
    }
    if (SNEP_setupPacket (&g_ui8SerialBuffer[0]、g_ui16BytesReceivent、ui8FragmentLength)= STATUS_SUCCESS)//此函数是正确的还是应该使用不同的函数?
    //if (NFC_p2p_sendNdefPacket (&g_ui8SerialBuffer[0]、first、ui8FragmentLength、g_ui16BytesReceivent)!= 0)
    {
    memset (&g_ui8SerialBuffer、0、g_ui16BytesReceived);
    G_ui16字节接收器= 0;
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);
    }
    else//failed cannot add data do queue (else//failed 无法再添加数据)、我很忙
    {
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_PIN_3);
    }
    } 

    下面是测量 GPIO_PIN_3的屏幕截图、您可以看到重新发送下一个字节所需的时间(双向发送125字节)  

    这里是我们的 NFC 配置、我们可能需要在这里设置其他内容吗?

    //
    //
    //! NFC_configuration -处理初始 NFC 配置。
    //!
    //! 设置所有 NFC 模式参数。
    //!
    //! 启用的当前模式:卡仿真
    //! 支持的当前模式:卡仿真 A 和对等2对等
    //! 读/写器尚不受支持。
    //!
    //
    
    void NFC_configuration (void)
    {
    G_sP2PSupportedModes.ui8byte = 0x00;
    G_sP2PSupportedTargetBitRATE.ui8byte = 0x00;
    G_sP2PSupportedInitiatorBitRATE.ui8byte = 0x00;
    G_sP2PSetupOptions.ui8byte = 0x00;
    
    //设置正在使用的 TRF7970版本
    G_eTRFVersion = TRF7970_A;
    
    //外部放大器(默认为断开连接)
    G_bExtAmplifier = false;
    
    //为收发器配置 TRF 外部放大器
    TRF79x0_setExtAmplifier (g_bExtAmplifier);
    
    //配置 TRF 电源(5V =真、3V =假)
    G_bTRF5VSupply = false;
    
    //配置 TRF 电源
    TRF79x0_setPowerSupply (g_bTRF5VSupply);
    
    //毫秒 NFC 堆栈将处于监听模式
    G_ui16ListenTime = 500;//500
    
    //设置 NFC 堆栈在禁用射频字段的情况下的时间(监听模式)
    NFC_setListenTime (g_ui16ListenTime);
    
    //启用(1)或禁用(0) TRF7970A 的自动 SDD 防碰撞功能
    G_bEnableAutoSDD = 0;
    
    
    //启用对等2对等支持的模式
    G_sP2PSupportedModes.bits.bTargetEnabled = 1;
    G_sP2PSupportedModes.bits.b 启动器使能= 1;
    
    //设置 P2P 支持的比特率-目标模式
    G_sP2PSupportedTargetBitRAes.bits.bPassive106kbps = 0;
    G_sP2PSupportedTargetBitRAes.bits.bPassive212kbps = 0;
    G_sP2PSupportedTargetBitRAes.bits.bPassive424kbps = 0;
    G_sP2PSupportedTargetBitRAes.bits.bActive106kbps = 0;
    G_sP2PSupportedTargetBitRAes.bits.bActive212kbps = 0;
    G_sP2PSupportedTargetBitRAes.bits.bActive424kbps = 1;
    
    //设置 P2P 支持的比特率-发起方模式
    G_sP2PSupportedInitiatorBitRAes.bits.bPassive106kbps = 0;
    G_sP2PSupportedInitiatorBitRAes.bits.bPassive212kbps = 0;
    G_sP2PSupportedInitiatorBitRAes.bits.bPassive424kbps = 0;
    G_sP2PSupportedInitiatorBitRAes.bits.bActive106kbps = 0;
    G_sP2PSupportedInitiatorBitRAes.bits.bActive212kbps = 0;
    G_sP2PSupportedInitiatorBitRAes.bits.bActive424kbps = 1;
    
    
    //认证配置开始//
    
    //启用(1)或禁用(0) Wave 1 NFC 论坛认证功能
    //注意:启用此功能会影响与未通过认证的 NFC 设备的互操作性。
    G_bSupportCertification = 0;
    
    //允许在启动器模式下自定义 DID (设备标识)号码
    G_ui8NfcDepInitiatorDID = 0x00;
    
    //启用 LLCP
    G_sP2PSetupOptions.bits.bP2PSupportLLCP = 1;
    
    //启用环回
    G_sP2PSetupOptions.bits.bP2PSupportLoopback = 0;//Zum debuggen
    
    //指定重置前允许的超时和协议错误的最大数量
    G_sP2PSetupOptions.bits.ui3P2PMaxTimeouts= 10;//2
    G_sP2PSetupOptions.bits.ui3P2PMaxProtocolErrors = 10;//2
    
    
    //为正确的模式和通信比特率配置 Peer 2 Peer 函数
    NFC_P2P_CONFIGURE (g_sP2PSupportedModes、g_sP2PSupportedTargetBitRAates、g_sP2PSupportedInitiatorBitRAates);
    
    //配置 NFC DEP 功能,包括传递 DID
    NFCDEP_CONFIG_P2P (g_sP2PSetupOptions、g_bSupportCertification、g_ui8NfcDepInitiatorDID);
    
    //在 NFC_a.c 内设置自动 SDD 标志
    NFC_A_setAutoSDD (g_BEnableAutoSDD);
    
    //在 tf79x0.c 内设置当前的 TRF 版本
    TRF79x0_setVersion (g_eTRFVersion);
    
    //为所有协议设置认证支持- NFC 论坛认证所需
    NFC_setSupportCertification (g_BSupportCertification);
    
    //在 tf79x0.c 内设置测试使能标志- NFC 论坛认证所需
    TRF79x0_testFlag (g_BSupportCertification);
    } 

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

    您好、Michael、

    [引用 user ="Michael Liesenberg85"]作为一个 FAAR、我知道无源器件在目标没有电源电压并且从 NFC 场获取其功率的情况下是不是这样的吗?

    这完全不是真的。

    我建议您阅读我们的应用手册以了解完整的详细信息、但我将在这里解释一些内容。 顺便说一下、这是应用手册 :http://www.ti.com/lit/pdf/sloa192

    无源 P2P 是仅一个 NFC 设备创建射频场-发起方的地方。 目标器件不会生成射频场。 但是、我们尚未构建一个既由射频场供电又由 TRF7970A 和主机 MCU 供电的系统。 在所有无源 P2P 应用中、发起设备和目标 TRF7970A 都由电源电压供电、就像您的用例一样。

    根据您的描述、您绝对应该使用无源 P2P。

    主动 P2P 的唯一优势是尝试扩展通信范围、但大多数情况下、它在较长的范围内的性能太差、无论如何都无法正常工作。

    [引用 user="Michael Liesenberg85"]我希望从目标端向发起方发送230、4kbps 的 UART 数据,这就是我要使用424kbps 的原因。[/quot]

    那么、您期望在空中传输大约~30kBytes/s?

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

    [引用用户="Michael Liesenberg85"]

    因此、我注意到我无法达到424kbps 的数据速率。

    [/报价]

    424kbps 是无线传输。 这不是总传输时间。 发送数据会产生开销。 我们在两个 TRF7970A 的 IIRC 之间测得的最高数据速率为~35kByt/s、但我不记得这是无源 P2P @ 424kbps 还是 R/W 和卡仿真@ 848kbps。 我认为对于 P2P 来说、30kBytes/s 是可行的。

    [引用用户="Michael Liesenberg85"]

    • 如果我们发送1个字节、则大约需要14ms 重新发送下一个字节。  
    • 如果我们发送125个字节、则需要大约16.3ms 来重新发送接下来的125个字节
    • 如果我发送的字节超过125字节、NFC 状态将发生变化、并且不会停留在 NFC_DATA_EXCHANGE_Protocol 上

    我在一个方向和两个方向上进行了测试、它们仅在最大125字节的数据下工作。

    [/报价]

    这是预期的。 如果发送的字节超过125字节、则必须在多个周期内发送。

    TRF7970A 有一个大小为127字节的 FIFO。 数据包开销需要另外两个字节。 因此、当发送的字节超过125字节时、数据包会被分频。 这正是器件必须以的工作方式。

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

    您好、Ralph、

    非常感谢您的回答。

    由于我无法减少15ms 的时间来重新发送数据、因此我认为 TRF7970A 不适合我的应用。

    我可以自己在 MCU 上执行协议、无需与市场上的其他器件兼容。 您知道 TI 可以使用的收发器吗?

    我的目标是使用全球允许的频率。 频率越低、我认为集成到应用中的效果就越好。

    也许 CC1201看起来可以达到1250kbps、并且可以在多种不同的频率下工作?

    频率有多低? 它是否也适用于13.567/27.283/40.66 MHz?

    此致、

    Michael

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

    您好、Michael、

    [引用用户="Michael Liesenberg85">我可以自己在 MCU 上执行协议、我不需要与市场上的其他器件兼容。 您知道 TI 可以使用的收发器吗?[/quot]

    您应该能够减少时间、但我不确定是多少。 但是、我们无法在任何级别支持类似这样的专有应用、这并不重要、因此我不建议尝试。 这可能是一项为期数周的任务、而不是几天的任务、以拆分 NFC 堆栈、但保留适当的错误处理等 特别是在没有事先了解的情况下。

    至于其他器件、我只了解 NFC。 我不知道 CC1201或其他器件能够支持什么。 我建议您为该问题发布新的 E2E 帖子、以便拥有相关知识的合适团队可以处理该问题。

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

    您好、Ralph、

    是否有办法将 TRF7970A 芯片与我自己的堆栈一起使用?

    我希望能够执行我自己的低级堆栈、以便在不产生开销的情况下尽可能快地发送1个字节。

    是否有办法做到这一点、或者内部 TRF7970A 固件不会以这种方式工作、并且需要 ISO 选择?

    是否有任何 NFC 芯片是非常虚拟的、我可以使用自己的堆栈写入和读取一个字节?  

    编辑:

    我看到我可以使用直接模式0并执行我自己的模块、在 MOD 引脚上发送数据、在另一侧读取 IO_6?

    是否有任何有关如何使用它的示例代码?

    在 MCU 方面、我该怎么做? 我可以使用另一个 SPI 并在 MOD 引脚上连接 MOSI、并在具有1MHz 时钟的 SPI 上轻松发送8位数据?

    在接收器件上、可能使用计时器来检查 IO_6状态、高电平还是低电平?

    此致

    Michael

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

    您好、Michael、

    您绝对可以将器件与您自己的堆栈一起使用、但 如果遇到问题、我们实际上并不支持该器件。

    [引用 user="Michael Liesenberg85"]我希望能够执行我自己的低级堆栈、以便在不产生开销的情况下尽可能快地发送1个字节。

    您只需执行以下操作:

    1) 1)将寄存器配置为您要使用的通信调制和数据速率以及基本配置(如电源设置等)

    2) 2)确保您的目标器件使用相同的接收数据

    3) 3)转动启动器侧的 RF 场

    4) 4)发送带或不带 CRC 的字节。

    从这里、您可以在启动器上获得一个 TX 完成、在接收器上获得一个 RX 中断、该中断将能够立即从 FIFO 中读取。  

    复杂性伴随着确保数据包不丢失或传达预期的数量等

    如果您不担心数据丢失、那么它实际上非常简单。 尤其是当它仅是单向通道时。

    [引用用户="Michael Liesenberg85"]是否有办法这样做,或者内部 TRF7970A 固件不会这样工作,并且需要 ISO 选择?

    寄存器0x01中的 ISO 选择只是为了告诉器件 AFE 应该如何处理调制方案和传输。

    [引用 USER="Michael Liesenberg85">是否有任何非常虚拟的 NFC 芯片、我只需使用自己的堆栈写入和读取一个字节即可?  [/报价]

    我想说、我们的解决方案非常适合、因为大多数"黑盒"芯片都有您不想使用的 NFC 层。

    [引用 user="Michael Liesenberg85"]我发现我可以使用直接模式0并执行我自己的模块、在 MOD 引脚上和在另一侧读取 IO_6?

    对于您所做的事情、这相当于使用一个沉船球将钉子敲到位。

    是的、这是可能的、我们有一些示例代码、但 DM0非常复杂、并且可能会增加处理时间、这比使用直接模式2所需的时间更长。 您必须让 MCU 以13.56MHz 运行、并通过软件算法手动解码位流、以展开调制并提取数据。 根本不是高效的、而是一种绕过官方协议的方法。 我不认为即使您可以提高无线数据速率(我 知道这是否可行、但我怀疑是...) 尝试解调接收到的数据时、您仍然可能会丢失所有这些增益。

    为此,请坚持使用直接模式2:)