USB论坛
直播中

幽默

10年用户 887经验值
擅长:362163
私信 关注
[问答]

如何在ctd解决方案中使用FRS (ccg2,3)?

  你好,我正在检查用作 c 型多功能集线器的 ctd 解决方案。
多集线器希望通过允许 CCG3 在外部POWER_DRILL2GO被切断时(当充电端子在 ccg2 处被切断时)通过 FRS 切换到灌POWER_DRILL2GO来防止集线器丢失。
但是,鉴于sdk用户指南的内容,很难将其应用到实践中。 (有标志设置或 dpm_enable 函数,但效果不佳。)
我想有一些我不知道的地方,但如果可能的话,你能否给我举一个来自 ctd us 解决方案代码的示例,这是 ctd 解决方案的示例代码?
如果那不起作用,除了图片的设置之外我还需要留点什么吗?



上面的代码说,frs_enable 将在初始协商后应用,所以我一开始就设置了它,但我不知道这是否正确。

回帖(1)

王超

2025-6-3 17:58:28

在 Cypress CCGx 系列的 CTD(Type-C Dock)解决方案中,使用 FRS(Fast Role Swap) 实现电源角色的快速切换需要结合硬件配置、固件策略和中断处理。以下是实现该功能的步骤和示例代码说明:




1. FRS 核心配置


dpm_cfg_t 结构体中启用 FRS 相关标志,并配置超时时间:


dpm_cfg_t dpm_cfg = {
    .frs_enable = 1,               // 启用 FRS 功能
    .frs_timeout = 100,            // FRS 超时时间(单位:ms)
    .flags = DPM_FLAGS_FRS_SNK,    // 指定 FRS 触发时切换到 Sink 角色
    // 其他策略配置...
};



2. 检测外部电源状态


通过 GPIO 或寄存器检测外部电源(CCG2 的充电端子)是否断开:


// 配置 GPIO 中断检测外部电源状态
void gpio_interrupt_handler(void)
{
    if (gpio_read_pin(EXT_PWR_DETECT_PIN) == 0) {
        // 外部电源断开,触发 FRS
        cy_pdutils_sw_timer_start(timer_id, FRS_TIMEOUT);
    }
}



3. 触发 FRS 切换


在检测到电源断开后,调用 dpm_enable_frs 函数触发角色切换:


void handle_frs_trigger(void)
{
    cy_stc_pdstack_context_t *stack_ctx = get_stack_context();
    cy_stc_pdstack_dpm_context_t *dpm_ctx = get_dpm_context();

    // 检查当前是否支持 FRS
    if (dpm_ctx->dpm_cfg.frs_enable) {
        // 发送 FRS 信号
        cy_pdstack_dpm_enable_frs(stack_ctx, CCG_FRS_ROLE_SNK);
    }
}



4. 处理 FRS 事件


dpm_event_handler 中处理 FRS 相关事件:


cy_en_pdstack_dpm_status_t dpm_event_handler(
    cy_stc_pdstack_context_t *context,
    cy_en_pdstack_dpm_event_t event,
    void *data)
{
    switch (event) {
        case CY_PDSTACK_DPM_EVENT_FRS_COMPLETE:
            // FRS 完成,更新电源状态
            update_power_role(CY_PD_PWR_ROLE_SNK);
            break;
        case CY_PDSTACK_DPM_EVENT_FRS_TIMEOUT:
            // FRS 超时处理(例如复位 PD 合约)
            cy_pdstack_dpm_reset_pd_contract(context);
            break;
        // 其他事件...
    }
    return CY_PDSTACK_DPM_STAT_SUCCESS;
}



5. 关键注意事项



  • 硬件设计:确保 VBUS 路径支持快速切换(低阻抗 MOSFET 和快速比较器)。

  • 固件配置

    • cycfg_conn_dw.c 中配置正确的 CCGx FRS 引脚和唤醒源。

    • 确保 PD 策略允许 DR_SWAPPR_SWAP


  • 调试工具

    • 使用 CyMCUElf Tool 监控 PD 报文和 FRS 时序。

    • 检查 CY_PD_STATUS_REG 中的 FRS 状态位(例如 FRS_DETECTED)。





示例代码片段


完整示例参考 Cypress SDK 中的 dpm_frs.cusbpd_frs.c,关键函数包括:



  • cy_pdstack_dpm_enable_frs()

  • cy_pdstack_dpm_frs_isr()




如果问题仍然存在,请检查以下内容:



  1. 硬件 VBUS 路径是否支持 FRS 切换速度(< 200μs)。

  2. 确保 frs_enableflags 在初始化时正确加载。

  3. 使用逻辑分析仪抓取 CC 线波形,确认 FRS 信号是否发送。


如需进一步调试,请提供 PD 协议分析仪的日志截图或波形文件。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分