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.

[参考译文] RTOS/CC1310:RF 参数设置问题

Guru**** 2551110 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/792665/rtos-cc1310-rf-parameter-setting-problem

器件型号:CC1310

工具/软件:TI-RTOS

您好,团队

在 WOR-RX 的基础上、我需要在另一个任务中一次设置几个射频参数:  工作频率、Tx 功率。由于 Rxsniff 命令不断进入和退出、我无法立即对其进行设置。我认为修改这些参数时需要考虑的核心问题是射频命令的调度。

首先,如何在运行期间有效地设置工作频率并避免与 Rxsniff 命令冲突,RF_CONTRON()? 例如、我想将433MHz 更改为434MHz。 我希望您能提供一个代码片段。

2.rf_setTxPower()也执行命令,它还需要考虑与其它命令的冲突?

执行命令时、射频内核处于空闲状态。 对 RF_cmdCancel() API 的调用是否等效于空操作?

如何判断射频内核是否处于空闲状态、是否有可用的相关 API?

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

    1) 1)您可以通过将您使用的 fs 命令更新为新频率来更改频率。 这意味着、要更改频率、您还需要使用新频率再次运行"CMD FS"命令。

    2) 2)如文档所述、如果无线电处于活动状态、此 API 立即生效。 如果这会导致您的应用程序中出现问题、我会考虑确保这不会干扰另一条命令、但我希望您可以任意选择。

    3) 3)您只能取消已发布的命令、这意味着它始终会导致您从队列中删除命令、或者在运行时停止/中止命令。

    4) 4)我不知道您为什么需要这些信息、您能否详细说明一下? 除非队列中有要运行的命令、否则射频驱动器通常会尝试关闭射频内核以节省功耗、这意味着它实际上只是"有效"或"关闭"、除非您要求驱动器始终保持开启状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 M:
    我认为我目前的问题尚未完全消除。

    设置频率时,应该修改 FS 结构中的哪些参数?可以实现 RF_CONTINR()?

    您说过、当射频内核处于活动状态时、此类 API 会立即生效。 这种活动状态是否意味着只要 RF 内核通电即可运行、或在内核空闲时立即运行?

    是的、我发布了一条命令。 执行命令后、射频内核是否会自动删除队列中的命令?如果删除、应用程序是否会执行 Cmdcancel 一次并导致不安全的结果?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    X 您好、

    您需要对 FS 结构进行哪些更改取决于多个方面。 在最简单的情况下、您只需更改"freq"字段、但您可能还需要调整其他器件。 在这种情况下、您最好使用 SmartRF Studio 通过所需设置来设置 PHY、并查看它为您生成的结构。 没有计划在射频驱动器中实现此类 API、但是您可以自由地实现自己的"更改频率"功能。

    活动状态只是指未被旋转的射频内核的雕像。 射频内核是一种外设、这意味着它可以独立于主 CPU 运行、并且只要它通电即可。 射频驱动器通常认为、当不需要降低功耗时、它会关断。

    对于3)、虽然我不会在这里遇到任何大问题、但您不应在当前未使用的任何命令上调用 cancel。 如果使用不再有效的句柄,则行为可能无法预测,就像任何驱动程序一样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W、
    至于3)、您是不是说如果我使用 Cmdcancel、射频内核中必须有指令? 在我的应用中、Rxsniffcmd 在一个任务中运行、而另一个任务可能需要随时修改。 当我想执行 Cmdfs 命令时、可以执行 Rxsniffcmd。 射频内核空闲。 正如您所说、我无法使用 Cmdcancel。 我应该使用什么方法来解决这个问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    X 您好、

    我不确定我是否完全理解您的设置、但您应该真正避免将射频代码拆分为多个任务(与任何外设一样)、除非您能够保证它们不会发生冲突的行为。 请告诉我、您应该构建一个无线电控制任务、并从另一个任务向该单个任务发出事件(以确保您完全控制并深入了解您使用无线电执行的操作)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、M-W,

    我的应用不太可能将射频操作放在一个任务中。下面显示了两个任务、其目的是实现射频冲突。

    /* WOR-RX 任务优先级=2*/
    while (1)
    {
    /*获取对资源的访问*/
    Semaphore_pend (semHandle、BIOS_wait_forever);
    
    /*设置未来的下一次唤醒时间*/RF_cmdPropRxSniff.StartTime
    += WOR_WAKE_UP_INTERVE_RAT_RAT_TICKs (SetPara.wakeTime);
    
    /*计划 RX */
    rxCmdhandle = RF_postCmd (rfHandle、(RF_OP*)&RF_PropRxCrone_Prentryx、rityrmdrandr、randrrrrandrrrandr)回调、rrrrrrrrf_randr
    rf_pendCmd (rfHandle、rxCmdhandle、0);
    
    //解锁资源*/
    Semaphore_post (semHandle);
    }
    
    /* UART 任务优先级=4*/
    while (1)
    {
    set Frequency instruction;
    ……
    if (semaphore_pend (semHandle、0)= false)
    {
    if (!EasyLink_CmdHandle_IsValid (rxCmdhandle))返回 false;
    RF_Stat 状态= RF_CancelCmd (rfHandle、rxCmdhandle、1);
    UART_WRITE (uartHandle、STATUS、1);
    if (status!= RF_StatusSuccessess)返回 false;
    }....
    
    }
    

    当我第一次设置频率时、STATUS = 0x83、然后设置 STATUS = 0x04。 我认为我的想法可以避免射频命令冲突、但实际结果是这样的。 原因是什么?如何解决?

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

    您不能使用 EasyLink API 来检查命令是否有效、而只需检查句柄是否为负。 我不知道在这里要告诉您的是、当跨任务共享句柄时、您需要在某种程度上确保线程安全。

    至于返回值、这些值在头文件中定义、只需查找 RF_STATUS.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W、
    是的、我可以删除移植的 EasyLink API。我的代码中使用信标来保护共享句柄、但它有错误。 您能用正确的方式教我吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    X 您好、

    我不确定您的意思是错误、您能详细说明一下吗? 在代码中使用信标之前、您是如何创建信标的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W、
    我的信标创建没有问题。 我是说 RF_Stat status = RF_CancelCmd (rfHandle、rxCmdhandle、1);每次删除返回的状态值始终为0x04、我检查了相关帖子、看起来我们的驱动程序有点问题。 我的目标非常简单、要在两个任务中实现对射频内核的非冲突访问、请提供一种方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    X 您好、

    在给定 Rf_Stat enum 时、0x04表示 Rf_StatCmdEned (在池中找到 Cmd、但已结束)。 事实仍然是、如果您打算(通常)跨多个线程共享驱动程序、则应实现所需的适当功能、以便在需要时使您的用法"线程安全"。 具体的操作方式因您对所述驱动程序的使用情况而异。

    虽然您只需致电 cancelCmd ()即可"到期",但我仍建议您在应用中自行跟踪此情况。 换句话说、一个线程应该知道其他线程射频命令是否仍然有效(例如、如果/当您收到"CMD 完成"标志时、将句柄设置为 NULL 并在您的应用程序中执行 NULL 检查)。