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.

[参考译文] CC1312R:在某些情况下无法发送。

Guru**** 2468610 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1438085/cc1312r-unable-to-send-in-certain-cases

器件型号:CC1312R

工具与软件:

您好!

我在使用基于 rfUARTbridge 示例的程序时遇到问题。

我已经展示了示例的"取消接收、发送数据包、发出接收"部分并将其放置在一个单独的函数 SendPacket 中。

这似乎不会改变示例的行为。

随后、我添加了可 在发生事件时发出 SendPacket 的函数。

正如预期的那样、它也能很好地工作。

但是、我现在添加了几个函数、用来添加要发送的数据、但其中一个函数的行为有误、即2:d 射频函数永远不会完成传输。
 
我觉得可以很容易地测试传输的状态、但是没有状态

程序不会停止或崩溃、而是在某个库内执行

我打印了前面的 rf_cancelcmd 的结果、它总是在时报告131、0x83
取消操作可以正常工作、但是当我通过调用 sendpacket 将来自代码另一部分的数据包注入时、取消操作将返回3。

所以,对我来说,似乎取消由于某种原因而失败,因此随后的发送
挂起。

我已经检查了所有消息变量和计数、我可以看到
RF_PropTX 在所有情况下都正常。

区别在于、在我发出(在)发送命令时 TX 的状态字通常为0、在发送之前的值为0x3400、我认为它是用于无线电处理器的
需要更新的驱动程序代码(W)以及需要用户程序读取的驱动程序代码(R)、那么它为什么具有一个值(最后状态?)、这一点很重要?

有人知道该看什么吗?

void SendPacket (char * message、int count){

      if (count >= 254)
          计数= 254;

      rf_cmdPropTx.pktLen =计数;
      INT I、STATUS;
      对于(I=0;I<count;I++)
      {
          packet[i]= message[i];
      }
//      延时(4);
//      xprint_schar(GetRssi());
//      xprint ("\n");
//      while (RF_getRssi(rfHandle)>=-100 ){}  //可怜的人 CCA、挂这里直到 RSSI 低于-100、
      /*取消正在执行的命令*/
      rf_cancelCmd (rfHandle、rfPostHandle、1);//首次停止接收

      /*Send packet*/
      状态= RF_runCmd (rfHandle、(RF_Op*)& RF_cmdPropTx、RF_PriorityNormal、NULL、0); //然后发送数据包
      if (status!= 2){
          xprint ("什么?");
      }
      已发送++;
      /*切换绿色 LED 以指示 TX */

      GPIO_TOGGLE (CONFIG_GPIO_GLED);

      /*恢复 RF RX */
      rfPostHandle = rf_postCmd (rfHandle、(RF_Op*)&rf_cmdPropRx、   //three、重新启动接收
                                                           RF_PriorityNormal、&ReceivedOnRF 回调
                                                           RF_EventRxEntryDone);
}

此致、

Gullik

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

    下面更详细地介绍发生的情况:

    执行 rf_cancelcmd 时、每次调用该函数时、rfPostHandle 参数都会递增2。 我想这就是无线电库

    跟踪队列中实际操作的编号/标识、如果我正确理解、这是带回调的 RF 接收、它们全部是或者应该是。

    当我启用导致错误的函数时、 rfPostHandle 的值为16384。 因此、我想执行队列中没有此类高编号条目

    命令状态为3、而不是0x83。 在某些 H 文件中、将数字/位转换为错误关键字有点困难。

    那么、现在的问题是:谁修改了 rfPostHandle、这是我的代码中简单的"缓冲区溢出"问题吗?

    文档将 rfPostHandle 称为"命令句柄"、但它似乎不是一个结构、

    但一个简单的 int16_t。。。 困惑…

    到达那里…

    Gullik

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

    下面更详细地介绍发生的情况:

    执行 rf_cancelcmd 时、每次调用该函数时、rfPostHandle 参数都会递增2。 我想这就是无线电库

    跟踪队列中实际操作的编号/标识、如果我正确理解、这是带回调的 RF 接收、它们全部是或者应该是。

    当我启用导致错误的函数时、 rfPostHandle 的值为16384。 因此、我想执行队列中没有此类高编号条目

    命令状态为3、而不是0x83。 在某些 H 文件中、将数字/位转换为错误关键字有点困难。

    那么、现在的问题是:谁修改了 rfPostHandle、这是我的代码中简单的"缓冲区溢出"问题吗?

    文档将 rfPostHandle 称为"命令句柄"、但它似乎不是一个结构、

    但一个简单的 int16_t。。。 困惑…

    到达那里…

    太太… 我在 rfPostHandle 设置了观察点。 我似乎很成功、但我无法调试、"继续"箭头显示为灰色、并尝试这样做

    显示变量不起作用..... 这是一个观察点应该工作的方式,我认为我应该能够看到实际上修改了变量的语句..

    分辨率:变量 rfPostHandle 已被 SPI 事务修改。 由于 JTAG 调试可能无法解决这一问题、因此我对它不可见。 使用普通断点进行调试、直到我发现 SPI 的缓冲区规格中存在错误、这可以解决问题。 因此、请注意观察点无法处理存储器的 DMA 修改。 我学到了一些新的东西。。

    此致、

    Gullik

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

    尊敬的 Gullik:

    不确定如何为您提供最佳帮助、但以下 调试建议如下:

    1.可以将射频驱动文件添加到工作区。 当重建示例并启动新的调试会话时、它应该不再从 rflib 库中执行、而是从工作区中的源文件中执行。

    2.请记住射频内核是一个独立的内核、点击 M4上运行的 C 代码中的断点不会停止射频内核。 这可能会在尝试调试无线电时导致一些看似奇怪的行为。

    3.如果您尝试设置一个断点、但 CCS 会将该断点移动到较低的行、这通常意味着该行在汇编代码中得到了优化。 两种解决方案:

    A)您可以调整您的功能的优化。 (如果使用 LTO、则将其关闭)。

    B)您可以打开反汇编视图并直接在汇编代码中设置断点。

    希望这对您有所帮助!

    谢谢、

    Marie H.