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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1521455/cc1312r-time-syncronised-rf-transmission

器件型号:CC1312R

工具/软件:

您好、

在无线电系统中、我们默认在 RF 接收中。

然后、我们会得到这样的信息:从现在起、我们必须恰好以 300ms 的时间发送射频数据包。 传输的优先级高于任何正在进行的接收。

当然、我可以立即访问射频内核、取消接收命令并 在正确的时间运行包含触发事件的 RF_cmdPropTx 命令。
不过、我认为这将使射频内核在接下来的 300ms 内保持等待状态。 这可能会导致传入的数据包丢失。 (不必要的长时间失聪)

理想情况下、我想使用 simpleLink 来调度此命令、但阅读 RF_ScheduleCmd 文件似乎无法按预期方式工作。

另一种方法是设置触发时间、例如在发送时间前的几毫秒、然后运行取消命令+ RF_cmdPropTx(含触发时间)

请建议如何获得我的定时传输。

无需更多导线

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

    您好、

    你看到了这些例子吗?

    dev.ti.com/.../node

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

    谢谢 Richard。

    示例很好、但没有直接涵盖我的问题。

    但我们以您的示例作为起点。 假设我要在 300ms 内发送信标。 但我想接收数据包、直到那时。

    因此、我将 RFCore 置于接收位置。

    a) 我是否可以在 SimpleLink 中以 300ms 的速率对发送进行排队  

    或。

    b) 我必须使用计时器、并在 295ms 后让我的应用程序执行
    cancelReceive + TX(绝对开始时间= 300ms)


    无需更多导线

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

    尊敬的 no_more_wire:  

    您可以通过多种方法对此类命令链进行编程、这样无线电就可以自主执行、而无需使用计时器。

    其中一种方法是使用 TRIG_REL_PREVSTART triggerType、该类型将在上一条命令(此处为 RX)启动后执行 TX 300ms:

    /* Now let's chain the commands */
    /* We consider a 300 mS RX, followed by a TX. It executes ASAP  */
    
    RF_cmdPropRx1.startTrigger.triggerType = TRIG_NOW;
    RF_cmdPropRx1.pktConf.bRepeatOk = 0;
    RF_cmdPropRx1.pktConf.bRepeatNok = 1;
    RF_cmdPropRx1.pktConf.endType = 0;
    RF_cmdPropRx1.endTrigger.triggerType = TRIG_REL_START;
    RF_cmdPropRx1.endTime = RF_convertMsToRatTicks(300); //Do you want to stay in RX for 300 mS?
    RF_cmdPropRx1.pNextOp = (rfc_radioOp_t *)&RF_cmdTxAck;
    
    /* In your application, you may want to ignore the rest of the chain if you somehow do not receive a packet */
    RF_cmdPropRx1.condition.rule = COND_ALWAYS;
    RF_cmdPropRx1.condition.nSkip = 0;
    
    
    RF_cmdPropTxAck.pktLen = PAYLOAD_LENGTH;
    RF_cmdPropTxAck.startTime = RF_convertMsToRatTicks(300);
    RF_cmdPropTxAck.pPkt = packet;
    RF_cmdPropTxAck.startTrigger.triggerType = TRIG_REL_PREVSTART;
    RF_cmdPropTxAck.pNextOp = //Depends of what you want to do
    RF_cmdPropTxAck.condition.rule = COND_ALWAYS;
    RF_cmdPropTxAck.condition.nSkip = 0;

    您也可以使用绝对时序来实现。 在该位置、您可以捕获当前无线电时间戳、并执行与该锚点相关的命令:

    uint32_t timestamp = RF_getCurrentTime();
    
    RF_cmdPropRx1.startTrigger.triggerType = TRIG_ABSTIME;
    RF_cmdPropTxAck.startTrigger.triggerType = TRIG_ABSTIME;
    
    ......
    
    // Execute RX in 1 mS
    RF_cmdPropRx1.startTime = timestamp + RF_convertMsToRatTicks(1);
    RF_cmdTxAck.startTime = RF_cmdPropRx1.startTime + RF_convertMsToRatTicks(300);

    您可以在此处了解详情: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_8_30_01_01/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf-guide/rf-core-index.html

    此致、

    Arthur

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

    上述链会导致 TX 在 RX 结束 300ms 后发生、但我认为 此处不需要执行此操作。 我的理解是、无线电处于 RX 状态(没有任何结束时间)、然后您会得到信息、表明 TX 应该恰好在 300ms 内发生。

    您无法 在仍处于活动 RX 状态时将此 TX 安排在 300ms 内发生、因此、您唯一可以做的是让应用程序在 (300ms — 一些裕度时间)之后取消 RX 命令、然后提交 TX 命令。

    Siri

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

    在这种情况下、使用 CMD_PATTERN_CHECK 及其 bRxVal 属性(设置为 1)、我们可能可以进行此设置、以便 RFcore 可以直接从接收到的数据包中读取信息、而这些信息必须在 300ms 内传输。

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

    我想我现在已经掌握了完整的情况。  
    我确实收到了一个数据包、下一次传输将在这个接收时间进行计时。  
    但在介于两者之间的 300ms 内、我需要处于 RX 中、能否获得另一个接收。 E.B.第一个事件之后 100ms。
    因此我无法链接命令... :-(

    这意味着我必须在应用计划中存储第一个接收到的数据包的时间戳 (t_RX)、并将计时器设置为 295ms 等
    计时器节拍计时

    - CancelRX
    - CMD_FS(当 I 在不同通道上发送时)
    - CMD_PROP_TX_ADV(带绝对触发器的 t_RX+300ms)

    如果我记得正确、我在 HWI 中无法做到这一点、因此我必须在 SWI 或高优先级任务中做到这一点、以确保尽快完成。

    您是否发现此策略有任何问题/弱点?

    无需更多导线

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

    尊敬的 no_more_wire:

    我们可能仍然能够使用命令链。 您在以下问题上看到了任何缺陷吗?

    这是假设该值始终为 300mS。 如果它必须不时的不同,我们必须分割这条链。 然后、我们可以将时间戳存储在无线电回调中、并启动 CMD_PROP_RX2 -> CMD_FS2 链。

    如果无法实现、我们可以使用 TRIG_EXTERNAL(使用计时器而不是 GPIO)使用您的 Cancel_RX、CMD_FS、CMD_PROP_TX_ADV 策略: (+) LAUNCHXL-CC1352R1:射频传输的外部触发器 — Sub-1GHz 论坛 — Sub-1GHz - TI E2E 支持论坛

    否则,我看不到你的策略有问题,除了它可能需要一些实验来找到正确的时间,如你建议的 295 ms.

    此致、

    Arthur

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

    可能可以使用 CMD_SCH_IMM 来运行立即命令 (CMD_STOP) 作为无线电操作命令、这可以链接到 TX 命令、并计划在将来运行 300ms(或更早一点,因为应该在 300ms 时间内运行的是 TX)。

    我现在还没有时间来测试、但请告诉我、这是否是您希望我们下周研究的内容。

    BR

    Siri

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

    我对这两种解决方案的担心是、我可能会对 simplelink 和 IT 队列中发生的情况失去控制。

    亚瑟:我不会知道只是在一个模式,我将答复 TX。 我知道以后处理(包括解密)++。
          另外,我可以有接收一个数据包的情况,开始新的接收,发现我将回复收到的数据包,然后收到第二个数据包,然后回复第一个。

          因此、我必须为每次接收到新信号时动态更改结束触发器。
          以及当我多次输入 RX 时排队的命令会发生什么情况。

    Siri:  当我收到数据包时、我确实使用一种机制来运行 immidiate 命令以设置数据包长度。
         我担心的是、将来安排 STOP+ CMD_FS+ CMD_TX_ADV 会干扰同时我运行的其他命令。
         但是、如果已调度命令只是存储在 simplelink 中的某个位置、并且不会干扰我发送到射频内核的其他命令、则可能会出现这种情况        与应用计时器相比是一个不错的选择。 一旦我安排了将来的一次传输、我就不打算再安排一次传输         已发送。

    无需更多导线

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

    实际上、我尝试了关于使用  CMD_SCH_IMM 的建议、但无法使其正常工作。

    已联系到 R&D、他们告诉我无法以这种方式使用 CMD_SCH_IMM。 原因是 CMD_SCH_IMM 是无线电操作命令、一次只能运行一个无线电操作命令(具有 2.4GHz IEEE 命令的前台/后台命令除外)。

    我想这是您唯一的选择、可以跟踪应用中的时序、并在需要时运行 TX 命令之前手动取消 RX。

    BR

    Siri