主题中讨论的其他器件:MSP432P401R、 CC1201
工具/软件:Code Composer Studio
您好!
我具有与两个 MSP432P401R Launchpad 和两个 TRF7970A BoosterPack 的活动连接 P2P。
GUI 似乎显示了424kbps 的当前通信、但如果我在一个 MSP432P401R 中调试代码、我会在结构上看到当前通信速度为212kbps:
这是 GUI 错误吗? 为什么通信不是424kbps?
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.
工具/软件: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
您好、Ralph、
因此、我注意到我无法达到424kbps 的数据速率。
在下面、您可以看到 main 中的代码、我们在 PC 上不使用 GUI 的情况下发送数据、并测量 GPIO 以查看数据的发送速度以及可以发送多少个数据包。
我在一个方向和两个方向上进行了测试、它们仅在最大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"]
我在一个方向和两个方向上进行了测试、它们仅在最大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:)