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.

[参考译文] CC1312PSIP、last_CMD_DONE 中断出现't 即将出现

Guru**** 2482105 points
Other Parts Discussed in Thread: CC1312PSIP

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1241822/cc1312psip-the-last_cmd_done-interrupt-isn-t-coming

器件型号:CC2652PSIP
主题中讨论的其他器件:CC1312PSIP

在 CC1312PSIP 芯片组上运行 PG 应用程序并使用 SDK 7_10_00_63_eng 时、我们面临着以下问题。

在以下情况下、我没有获得 LASE_CMD_DONE 中断:

我们的内部闪存中有一个特殊扇区用于保存器件输出状态。

经过250次写入操作后、我必须擦除该扇区(10.3毫秒)并重写已保存的数据(又是20-300微秒)。

为了描述这个问题,我想显示自 CPU 系统调用 RF_postCmd ()以来的一个良好周期和不良周期。

 

                                           良好循环

 

CPU 系统                                            CPU 无线电                          

        |                                                      |

        | RF_postCmd ()                                                                              |

        |                                                      | 13.2毫秒后触发中断

        |

        | rf_hwiCpe0PowerFsm (uintptr_t a0)            

                         在 RF_fsmSetupState 中

               /*将设置链发送到射频内核*/

              rf_dbellSubmitCmdAsync ((uint32_t) pRadioSetup);

                                                                                                                    |

                                                                                                                    |

                                                                                                                     200微秒后触发中断

   

        | rf_hwiCpe0PowerFsm(uintptr_t a0)

                        处于 rf_fsmActiveState 中

              /*分派下一个命令*/

              rf_dispatchNextCmd ();                                  |

                                                            |

                                                            57us 后触发中断

         |

         | rf_hwiCpe0Active (uintptr_t a)

               /*无 CMD_DONE、无 LAST_CMD_DONE

                                                             |

                                                             |

                                                             671us 后触发中断

         |

         | rf_hwiCpe0Active (uintptr_t a)

             /*中断只是一个没有终止的普通事件。 */

                 CMD_DONE

                                                             |

                                                             1毫秒后触发中断

                                                             |

         |

         | rf_hwiCpe0Active (uintptr_t a)

             /*查找终止事件。 */

                最后_ CMD_DONE

              if (rfcpeifg &(RFC_DBELL_RFCPEIFG_LAST_FG_COMMAND_DONE_M | RFC_DBELL_RFCPEIFG_LAST_COMMAND_DONE_M))

                               /*我们将调用回调并取消分配命令。 */

                            nextEvent |= RF_FsmEventLastCommandDone;

  

红线–rf_postCmd

Brown 线路–中断(五次、包括 Last_CMD_DONE)

蓝线- rf_dispatchNextCmd

 

                                           坏周期

 

CPU 系统                                                CPU 无线电                          

        ||                                                                                                         

        | RF_postCmd ()                                          |

        ||                                                                                                          

        |                                                       |

        |                                                       |

        | flashSectorElaze 后12.54毫秒                          |

                                                           |

                                                           |

                                                           10.33毫秒后触发中断

 

        | rf_hwiCpe0PowerFsm (uintptr_t a0)            

                         在 RF_fsmSetupState 中

               /*将设置链发送到射频内核*/

              rf_dbellSubmitCmdAsync ((uint32_t) pRadioSetup);

 

         |

         |

         | flashDataWrite

                                                           |

                                                                                                                    |

                                                                                                                    |

                                                                                                                     257 usec 后触发中断

   

        | rf_hwiCpe0PowerFsm(uintptr_t a0)

                        处于 rf_fsmActiveState 中

              /*分派下一个命令*/

              rf_dispatchNextCmd ();                                                            

 

        | flashDataWrite

                                                                                                                    |

                                                                                                                     59微秒后触发中断

         |

         | rf_hwiCpe0Active (uintptr_t a)

               /*无 CMD_DONE、无 LAST_CMD_DONE

                                                                                                                 

         | flashDataWrite

                                                            |

                                                            162us 后触发中断

         |

         | rf_hwiCpe0Active (uintptr_t a)

             /*中断只是一个没有终止的普通事件。 */

                 CMD_DONE

 

                                                       288ms 内无中断 Last_CMD_DONE、直到 CPU 系统执行整个射频栈重新启动。

 

 

 

红线–rf_postCmd

棕色线–中断(仅四个中断、不是 Last_CMD_DONE 中的最后一个)

蓝线- rf_dispatchNextCmd

紫色线- flashSectorElaze + flashDataWrite

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

    尊敬的 Yan:

    感谢您的详细解释。  

    我有几个 关于您的应用的问题。

    1. 您是否仅使用 RFlib API、还是您还在修改驱动程序本身?  您能否解释一下您说我们将调用回调并取消分配命令时正在做什么?   

         if (rfcpeifg &(RFC_DBELL_RFCPEIFG_LAST_FG_COMMAND_DONE_M | RFC_DBELL_RFCPEIFG_LAST_COMMAND_DONE_M))

                                     /*我们将调用回调并取消分配命令。 */

      [/报价]
    2. 您能在发现此问题时分享的应用级代码吗? 仅是函数调用、而不是无线电 FSM 事件。  
    3. 此外、您是否看到问题每次发生还是偶尔发生?

    此致、

    SID

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

    尊敬的 Sid:

    感谢您的快速回复。

    下面是你问我的细节:

    1.我使用 RFlib API。 此驱动程序未被修改、而是添加了一个简单的函数。

    ratmr_t rf_getRat0 (void)
    {
       返回 rf_ratSyncCmd.start.rat0;

    以下注释位于 RFlib 驱动程序状态机中。 请参阅 RFCC26X2_multiple.c 中的函数"static void rf_hwiCpe0Active (uintptr_t a)"

     if (rfcpeifg &(RFC_DBELL_RFCPEIFG_LAST_FG_COMMAND_DONE_M | RFC_DBELL_RFCPEIFG_LAST_COMMAND_DONE_M))

                                   /*我们将调用回调并取消分配命令。 */

    2.我没有使用这个函数,因为没有产生 LASE_CMD_DONE 中断。

    void PG_Scheduler_L1_Callback (RF_Handle h、RF_CmdHandle ch、RF_EventMask e)

    {

       如果(e &(RF_EventCmdDone | RF_EventLastCmdDone)

       {

           如果(ch == pg_scheduler_l1.current.command_handle)

           {

                event_post (radio.event.handle、e);

           }

       }

    3。在擦除闪存扇区(10.3毫秒)和写入闪存时偶尔会发生该问题。 禁用中断的时间。

     我已经注意到逻辑,这个问题更经常发生时,当我们启动闪存操作超过10-12毫秒后,因为 RF_postCmd ()被调用。  

    在这种情况下、来自 CPU 无线电的第一个中断在 RF_postCmd ()之后延迟22-23ms。 您可以在我的上面的流程图中看到它。  

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

    尊敬的 Yan:

    1.在您的 post_Cmd ()中,您发布的命令或命令链是什么?  

    2.在这种情况下,命令链可能没有完成执行吗? 例如、如果它是一条等待数据的 RX 命令、可能该命令尚未完成执行?

    3.您可以在哪里分享您正在做的代码片段吗? 您如何准确地禁用中断?

    擦除闪存扇区(10.3毫秒)并写入闪存时偶尔出现此问题。 此时我们禁用中断。

    此致、

    SID

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

    尊敬的 Sid:

    1.我们使用 RF_postCmd ()和发送命令链。

    pg_scheduler_l1.current.command_handle = rf_postCmd (radio.driver_handle、
    rf_cmd_chain[msg_chain[pg_scheduler_L1.L1_txn_d->type][0],
    RF_PriorityNormal、
    PG_Scheduler_L1_Callback、
    RF_EventCmdDone | RF_EventLastCmdDone);

    2.我认为所有的命令都被发送了,否则我们就不会得到 CMD_DONE 的中断。

    3.我们通过以下方法禁用/启用中断:

    IntMasterDisable ();//禁用处理器中断。
    VIMSMModeSet (VIMS_BASE、VIMS_MODE_DISABLED);while (VIMSMModeGet (VIMS_BASE)!= VIMS_MODE_DISABLED){}

    FlashSectorErase (ui32SectorAddress);

    VIMSMModeSet (VIMS_BASE、VIMS_MODE_ENABLED);//启用高速缓存中断。
    IntMasterEnable ();//启用处理器中断。

    /*我们对 FlashProgram 也是如此*/

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

    尊敬的 Yan:

    1. rf_cmd_chain[msg_chain[pg_scheduler_L1.L1_txn_d->type][0]在这里发送了哪些无线电命令? 请您发布该连锁店吗?
    2. 他们是否有开始和结束触发器? 这些命令上的 pastTrig 参数是什么?
    3. 此外、每个无线电命令 本身都有一个状态字段。 请在调试会话中跟踪这些示例吗? 这样我们就可以了解链中的命令发生了什么、以及这些命令是否已完成或仍然处于活动状态。

    此致、
    SID

     

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

    尊敬的 Sid:

    1.

    rf_op* const rf_cmd_chain_tx[]=
    {
           (RF_Op*)&RF_cmdFS,// 1162-1172

           (RF_Op*)&RF_cmdPropTx,
            null、
    };

    rf_op* const rf_cmd_chain_rx[]=
    {
         (RF_Op*)&RF_cmdFS,// 1162-1172

          (RF_Op*)&RF_cmdPropRxSniff,// TODO:更改为 Rx Sniff
          null、
    };

    RFC_CMD_FS_t RF_cmdfs =//
    {.

    commandNo = 0x0803、
    .status = 0x0000、
    .pNextOp = 0、//插入适用的指针:(uint8_t*)&xxx
    .StartTime = 0x00000000、
    .startTrigger.triggerType = 0x0、
    .startTrigger.bEnaCmd = 0x0、
    .startTrigger.triggerNo = 0x0、
    .startTrigger.pastTrig = 0x1、
    .condition.rule = COND_NEVER,
    .condition.nSkip = 0x0、
    .frequency = RF_CMD_FS_FREQ、
    .fractFreq = RF_CMD_FS_Fract_FREQ、

    RFC_CMD_PROP_TX_t RF_cmdPropTx =
    {
    .commandNo = 0x3801、
    .status = 0x0000、
    .pNextOp = 0、//插入适用的指针:(uint8_t*)&xxx
    .StartTime = 0x00000000、
    .startTrigger.triggerType = 0x0、
    .startTrigger.bEnaCmd = 0x0、
    .startTrigger.triggerNo = 0x0、
    .startTrigger.pastTrig = 0x1、
    .condition.rule = COND_NEVER,
    .condition.nSkip = 0x0、
    .pktConf.bFsOff = 0x0、
    .pktConf.bUseCrc = 0x1、
    .pktConf.bVarLen = 0x1、
    .pktLen = 0x1E、//设置应用有效载荷长度
    .syncWord = RF_CMD_PROP_TX_SYNC_WORD
    .pPKT = 0、//插入适用的指针:(uint8_t*)&xxx
    };

    RFC_CMD_PROP_RX_Sniff_t RF_cmdPropRxSniff =
    {
    .commandNo = RF_CMD_PROP_RX_Sniff_CMD_NO、
    .status = 0x0000、
    .pNextOp = 0、
    .StartTime = 0x00000000、
    .startTrigger.triggerType = 0x0、
    .startTrigger.bEnaCmd = 0x0、
    .startTrigger.triggerNo = 0x0、
    .startTrigger.pastTrig = 0x1、
    .condition.rule = COND_NEVER,
    .condition.nSkip = 0x0、
    .pktConf.bFsOff = 0x0、
    .pktConf.bRepeatOk = 0x0、
    .pktConf.bRepeatNok = 0x1、
    .pktConf.bUseCrc = 0x1、
    .pktConf.bVarLen = 0x1、
    .pktConf.bChkAddress = RF_CMD_PROP_RX_PKT_CFG_B_CHK_ADDRESS、
    .pktConf.endType = 0x0、
    .pktConf.filterOp = 0x0、
    .rxConf.bAutoFlushIgnored = 0x1、
    .rxConf.bAutoFlushCrcErr = 0x1、
    .rxConf.bIncludeHdr = 0x1、
    .rxConf.bIncludeCrc = 0x0、
    .rxConf.bAppendRssi = 0x1、
    .rxConf.bAppendTimestamp = 0x1、
    .rxConf.bAppendStatus = 0x1、
    syncWord = sync_word、
    .maxPktLen = RF_CMD_PROP_RX_MAX_PKT_LEN、//连接 RF_QUEET_DATA_ENTRY_BUCK_SIZE
    .address0 = 0xFF、
    .address1 = RF_CMD_PROP_RX_ADDRESS_1、// TODO:将其更改为 defaultConfig.pram.Node_short_ID
    .endTrigg.triggerType = TRIG_NEVER,
    .endTrigger.bEnaCmd = 0x0、
    .endTrigger.triggerNo = 0x0、
    .endTrigger.pastTrig = 0x0、
    .EndTime = 0x00000000、
    .pQueue = 0、
    .pOutput = 0、
    .csConf.bEnaRssi = 0x1、
    .csConf.bEnaCorr = 0x1、
    .csConf.operation = 0x0、
    .csConf.busyOp = 0x1、
    .csConf.idleOp = 0x1、
    .csConf.timeoutRes = 0x1、
    .rsiThr = RADIO_SETTINGS_SENSITIVY_THRESHOLD_dBm、
    .numRssiIdle = 0x1、
    .numRssiBusy = 0x1、
    .corrPeriod = 960*4、/*从 RX 应用程序配置*/
    .corrConfig.numCorrInv = 1、
    .corrConfig.numCorrBusy = 1、
    .csEndTrigger.triggerType = TRIG_REL_START、// TRIG_never TRIG_REL_START
    .csEndTrigger.bEnaCmd = 0x0、
    .csEndTrigger.triggerNo = 0x0、
    .csEndTrigger.pastTrig = 0x0、
    .csEndTime = 750*4,/*从 RX 应用程序配置*/
    };

    命令状态的详细信息。 您认为在哪种方法可以更好地获取所有这些内容?

    CMD_DONE、LASE_CMD_DONE???  

    谢谢

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

    尊敬的 Yan:

    我们关心的是每条命令在好情况和坏情况下的状态。  

    当您说没有 Last_CMD_DONE.If 您在应用程序中放入一个断点并找到每个正常运行的命令的状态。  

    在288ms 内无 Last_CMD_DONE 中断,直到 CPU 系统执行整个射频堆栈重新启动。

    除了执行整个射频堆栈重新启动、我们只需要一个断点以及每个命令的状态。  

    此致、

    SID

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

    尊敬的 Sid:

    好的、我将在 CMD_DONE 回调开始时输出每个命令状态。

    我们不会在坏情况下得到 LAST_CMD_DONE 中断;因此、我在那里也看不到要输出的逻辑。

    BTW -我们使用 cc1312 PSIPX (2BW35479)、SDK 7.10.00.63_eng 和 IAR 8.50.9。 在这种设置下进行调试时遇到了真正的问题。  无法在调试模式下上传应用程序。 我玩过 IAR 中的不同配置、但这没有帮助。 此设置中有什么问题?

    谢谢。

    Yan

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

    尊敬的 Yan:  

    在288毫秒内无 Last_CMD_DONE 中断,直到 CPU 系统执行整个射频堆栈重新启动

    如果我理解了您的理解、那么如果没有获得 Last_CMD_DONE、那么您将在288ms 后执行复位。 我是对吗? 您在这里使用什么逻辑来执行系统复位。 在复位之前、您是否可以在此处打印命令状态?  

    在这种设置下进行调试时遇到了真正的问题。  无法在调试模式下上传应用程序。 我玩过 IAR 中的不同配置、但这没有帮助。 此设置中有什么问题?

    谢谢。

    [/报价]

    我将在末端测试 IAR 版本。
    1.您是否能够使用其他 SDK 版本在调试模式下上传应用程序映像?  
    2.您在终端看到的错误消息是什么?

    此致、
    SID  

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

    尊敬的 Sid:

    我们进行了打印输出、结果有好有坏。

    以下是288ms 之后复位的命令状态。

    rf_cmd_chain_tx[0]->status = 400

    rf_cmd_chain_tx[1]->status = 3400

    rf_cmd_chain_rx[0]->status = 400

    rf_cmd_chain_rx[1]->status = 2

    以下是正常序列中的命令状态。

    rf_cmd_chain_tx[0]->status = 400

    rf_cmd_chain_tx[1]->status = 3400

    rf_cmd_chain_rx[0]->status = 400

    rf_cmd_chain_rx[1]->status = 3409

    谢谢。

    Yan

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

    尊敬的 Yan:

    感谢您提供状态代码。 在"坏情况"下、 RF_cmdPropRxSniff 似乎仍处于活动状态。  

    一种可能是此命令的 endTrigger 过去了。 并且由于 pasttrig 设置、它不会被触发、命令也不会结束。  

    针对这种可能性的一个测试/修复方法是在发布命令链之前添加这行代码。  

    RF_cmdPropRxSniff.csEndTrigger.pastTrig=1;
     

    即使是过去的 END 触发器、这也会使 sniff 命令结束。 请尝试此操作。

    此致

    SID

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

    尊敬的 Yan:  

     RF_cmdPropRxSniff 命令还具有一个 endTrigger。

    请尝试执行这行代码。  

    RF_cmdPropRxSniff.endTrigger.pastTrig=1;

    此致、

    SID

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

    谢谢 Sid

    我将会测试它。

    此致、

    Yan

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

    尊敬的 Sid:

    endTrigger 的配置解决了问题。

    请检查您建议使用该芯片组的 IAR 版本(cc1312 PSIPX (2BW35479)、SDK 7.10.00.63_eng)。

    对于 cc1312R1、我们在 IAR 8.50.9方面不存在问题。

    谢谢。

    Yan

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

    尊敬的 Yan:

    IAR EWARM 8.20中添加了对 IAR 的 CC1312R1器件支持。 因此、它在8.50.9中可以正常工作。  https://updates.iar.com/?key=ecfd06c5cb3a4bf48df9e3924a49b1c6&version=8.20

    IAR EWARM 9.32.1中添加了 CC1312PSIP 器件支持。  https://updates.iar.com/?key=ecfd06c5cb3a4bf48df9e3924a49b1c6&version=9.32

    因此、如果您安装最新的 IAR、应该不会因为 IAR 上的器件支持而出现问题。  

    此致、

    SID