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.

[参考译文] CC1311P3:射频内核在看门狗复位后无响应–如何正常处理恢复?

Guru**** 2694555 points

Other Parts Discussed in Thread: CC1311P3

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1592625/cc1311p3-rf-core-becomes-unresponsive-after-watchdog-reset-how-to-handle-recovery-gracefully

器件型号: CC1311P3

我正在使用  看门狗模块 在 TI MCU CC1311P3 器件型号上、用于检测系统挂起。 看门狗配置如下:

Watchdog_Params params;
watchdog_init ();
Watchdog_Params_初始化 (&params);

params.resetMode = Watchdog_RESET_ON;
params.debugStallMode = WATCHDOG_DEBUG_STALL_ON;
params.callbackFxn =空;

watchdogHandle = Watchdog_open (CONFIG_WATCHDOG_0、&params);
if (watchdogHandle == NULL)

  while (1);
}

uint32_t ticks = Watchdog_convertMsToTicks (watchdogHandle、10000);
WATCHDOG_setReload (watchdogHandle、ticks);

在我的主线程中、我会定期清除看门狗:

while(1)
{
    Watchdog_clear(watchdogHandle);
// other functionality

/***

*******
**/

}

 

当发生看门狗复位(由于射频挂起或其他错误)时、MCU 会按预期复位。 然而、在复位后、射频内核有时会无响应、从而导致后续传输故障。 我怀疑在看门狗触发复位后、射频内核可能会保持过时或无效状态。


  • 推荐的方法是什么 缓慢地恢复射频内核 在 CC13xx/CC26xx 器件上进行看门狗复位后?

  • 有任何问题 特定的射频驱动程序重新初始化步骤 应该在系统复位后执行该操作、以确保正常运行?

  • 是否有方法 软恢复射频内核 在射频栈无响应时不触发完全系统复位?

  • 有任何问题 已知问题或最佳实践 是否需要在具有有源射频通信的应用中处理看门狗复位?

    谢谢、
    专题 B




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

    请解释射频内核无响应的含义?

    您正在尝试对对讲机执行什么操作、它如何失败?

    在进行看门狗复位时、射频内核不存在问题、因此我需要您提供一些可以重现问题的代码、以便我们进行调试。  

    请使用 SDK 中的看门狗示例作为 起点、并添加必要的射频代码来重现问题。

    Siri

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

    HI Siri 、这是我们用于看门狗复位的逻辑。 当射频内核失速 while () 逻辑看门狗复位触发时、如果我们尝试发送任何 CTRL cmd、则 RF 将没有响应。  

    //主线程  

    Watchdog_Params params;
    watchdog_init ();
    Watchdog_Params_初始化 (&params);

    params.resetMode = Watchdog_RESET_ON;
    params.debugStallMode = WATCHDOG_DEBUG_STALL_ON;
    params.callbackFxn =空;

    watchdogHandle = Watchdog_open (CONFIG_WATCHDOG_0、&params);

    if (watchdogHandle == NULL)

    while (1);
    }

    uint32_t ticks = Watchdog_convertMsToTicks (watchdogHandle、10000);
    WATCHDOG_setReload (watchdogHandle、ticks);
    #endif

    SemaphoreP_Params semParams;
    SemaphoreP_Params_init (&semParams);
    SemTx = SemaphoreP_create (0、&semParams);

    //MqRx = MessageQueueP_Construct (&MqRxObj、MAX_LENGTH、NO_OF_Message、MqRxBuf);
    MqRx = MessageQueueP_Construct (&MqRxObj、sizeof (input_rx)、no_of_message、MqRxBuf);
    IF (MqRx == NULL)

    while (1);
    }

    TaskP_Params_init (&ParamsTaskTx);

    ParamsTaskTx.name =“TX 任务“;
    ParamsTaskTx.priority = 5;
    ParamsTaskTx.STACKSIZE = 4096;

    TaskTx = TaskP_create (txThread、&ParamsTaskTx);
    if (TaskTx == NULL)

    while (1);
    }

    // TX 头  

    // TX 线程  

    while (1)

    /*恢复 UART 读取*/
    watchdogHandle (watchdogHandle);
    //MessageQueueP_Pend (MqRx、&input、MessageQueueP_WAIT_FOREVER);
    MessageQueueP_Pend (MqRx、&INPUT_Rx、MessageQueueP_WAIT_FOREVER);

    /*检查是否通过 UART*/接收到任何内容
    if (bytesReadCount != 0)

    /*数据包长度设置为数字
    * UART2_READ ()*/读取的字节
    int i;

    /*检查 RF CTRL 数据/CTRL STS */
    rf_ctrl_data_STS = rf_ctrl_proce_data_frm_uart ((uint8_t*) 输入);

    /*数据包长度设置为数字
    * UART2_READ ()*/读取的字节

    //提取 ctl_d 字段(数据/控件/片段)
    uint8_t ctl_d = RF_CTRL_DATA_CTRL_STS (input[RF_CTRL_HW_CTL_D_RD_POS]);

    uint8_t ctrl_cmd_id = input[RF_CTRL_CMD_ID_RD_POS];

    开关 (ctl_d)

    如果是 RF_CTRL_CTL_D_DATA:
    如果是 RF_CTRL_CTL_D_DATA_RTS:
    RF_cmdPropTxAdv_CST.pktLen +=(INPUT[RF_DATA_LEN_RD_POS]|(INPUT[RF_DATA_LEN_RD_POS+1]<<<8))-RF_DATA_RD_POS;
    if (RF_cmdPropTxAdv_CST.pktLen!= 0)

    uint16_t DATA_len = input[RF_DATA_LEN_RD_POS]|(input[RF_DATA_LEN_RD_POS + 1]<< 8);
    uint8_t* data_ptr =&input[RF_DATA_RD_POS];

    Buffer_slot_t* slot =&rf_circ_buffer.slot[rf_circ_buffer.write_index];

    //如果尚未聚合、请开始
    IF(!UART_DATA_AGG_IN_PROGRESS)

    if (slot->state != slot_empty)

    //插槽仍在使用、丢弃数据
    休息;
    }
    时隙->长度= 0;
    UART_DATA_AGG_IN_PROGRESS = TRUE;
    }

    //检查数据是否适合当前插槽
    if ((slot->length + data_len)> buffer_slot_size)

    CTRL_cmd->cmd_id = TX_ERR;
    CTRL_cmd->ctl_d = RF_CTRL_CMD_ID_CTRL;
    CTRL_cmd->hw_id = RF_CTRL_RADIO_CH0;
    CTRL_cmd->sync_word[0]= 0xAA;
    CTRL_cmd->sync_word[1]= 0x77;

    CTRL_cmd->cmd_data.rf_tx_err.err_overflow = 1;
    ctrl_cmd->cmd_data.rf_tx_err.overflow_size = slot->length + data_len;

    rfUARTBridge_UART2_write ((uint8_t *) ctrl_cmd);

    //溢出:重置聚合
    UART_DATA_AGG_IN_PROGRESS = FALSE;
    //slot->length = 0;

    //将数据作为最大大小复制到循环缓冲槽中并递增缓冲区索引
    memcpy (&slot->data[slot->length]、data_ptr、buffer_slot_size);
    slot->length = buffer_slot_size;

    rf_circ_buffer.write_index =(rf_circ_buffer.write_index + 1)% buffer_slot_count;

    休息;
    }

    //将数据复制到循环缓冲槽中
    memcpy (&slot->data[slot->length]、data_ptr、data_len);
    slot->length += data_len;

    IF (ctl_d == RF_CTRL_D_DATA_RTS)

    CNT++;
    rf_circ_buffer.write_index =(rf_circ_buffer.write_index + 1)% buffer_slot_count;

    uint8_t index = rf_circ_buffer.read_index;

    if (rf_circ_buffer.slots[index].state!= slot_empty)

    rf_cmdPropTxAdv_cst.ppkt =&rf_circ_buffer.slots[index].data;
    }
    rf_circ_buffer.slots[index].state = slot_empty;
    rf_circ_buffer.READ_INDEX =(rf_circ_buffer.READ_INDEX+1)% BUFFER_SLOT_COUNT;

    /*发送数据包并返回到 RX。 将来的计划命令*/
    /*数据包长度设置为个数
    * UART2_READ () 读取的字节+标头长度(32 位)*/

    RF_CmdHandle cmdHandle;

    /*在 TX 高级中、必须手动提供长度。 */
    cmdHandle = RF_postCmd (rfHandle、(RF_Op*)&RF_cmdPropTxAdv_CST、
    RF_PriorityNormal、&ReceivedOnRFcallback、
    RF_EventCmdDone );
    /*重置数据包长度*/
    RF_cmdPropTxAdv_CST.pktLen = 0;

    SemaphoreP_Pend (SemTx、SemaphoreP_WAIT_FOREVER);
    }
    }
    休息;

    在看门狗复位后、射频内核无响应。

    谢谢、
    专题 B  

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

    尊敬的 Theiv:

    遗憾的是、我无法告诉您发生了什么、正如我在最后一个线程中所写的、在无线电的看门狗复位后没有需要执行的特殊操作。

    您如何确定对讲机发生故障? 您也在使用 UART、由于复位时将失去与调试器的接触、如何知道您的代码甚至到达了使用无线电的位置?

    我假设可能是您在通过 UART 接收数据时复位器件。 您是否研究过如果您在另一个设备正在通过 UART 发送数据时启动代码、那么您的代码会有什么行为?

    我唯一的建议是在代码中添加尽可能多的调试信号。 在运行时在代码中的不同位置切换引脚、这两者都会告诉您代码首次被卡住时发生了什么、以及重置后«停止»工作的位置。

    您是否对 UART 通信实施了流控制、以便设备可以向发送方指示其未准备好接收数据? 这将确保当您的器件复位时、通过 UART 发送数据的另一个器件将停止发送、直到您的器件准备好再次接收。

    很抱歉、我无法为您提供任何更清晰的答案、说明您应该在代码中做些什么。

    Siri

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

    嗨、 Siri: 当看门狗复位与从其他 MCU 接收的 UART 数据并行发生时、射频内核是否可能无响应。 我们没有启用射频和其他 MCU 的流量控制。 告诉我们从看门狗复位中平稳恢复的任何替代选项?  

    谢谢、
    专题 B

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

    我已经回答过、看门狗复位对射频内核没有已知问题、因此、如果我们不知道无线电应该从什么恢复、我们无法为您提供“平稳恢复“的任何建议。

    Siri