在 Cypress CCGx 系列的 CTD(Type-C Dock)解决方案中,使用 FRS(Fast Role Swap) 实现电源角色的快速切换需要结合硬件配置、固件策略和中断处理。以下是实现该功能的步骤和示例代码说明:
在 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 角色
// 其他策略配置...
};通过 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);
}
}在检测到电源断开后,调用 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);
}
}在 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;
}cycfg_conn_dw.c 中配置正确的 CCGx FRS 引脚和唤醒源。DR_SWAP 或 PR_SWAP。CY_PD_STATUS_REG 中的 FRS 状态位(例如 FRS_DETECTED)。完整示例参考 Cypress SDK 中的 dpm_frs.c 和 usbpd_frs.c,关键函数包括:
cy_pdstack_dpm_enable_frs()cy_pdstack_dpm_frs_isr()如果问题仍然存在,请检查以下内容:
frs_enable 和 flags 在初始化时正确加载。如需进一步调试,请提供 PD 协议分析仪的日志截图或波形文件。
举报
更多回帖