在 CCG5 中实现 DR_SWAP 需要综合考虑协议规范、硬件配置和代码逻辑。以下是分步解决方案:
Data Role 设置为 DRP(Dual Role Port)而非固定 DFP。Dual Role Data 功能(允许动态切换数据角色)。cy_pdport_configure() 是否配置了正确的角色策略。在发送 DR_SWAP 前,需确认对方设备支持数据角色交换。通过检查 PDO 或 Get_Status 响应中的标志位:
case APP_EVT_PD_CONTRACT_NEGOTIATION_COMPLETE:
if (port == PORT_0 && dpm_get_info(port)->cur_port_type == PRT_TYPE_DFP) {
// 检查对方是否支持 DR_SWAP
const dpm_port_partner_info_t *partner_info = dpm_get_partner_info(port);
if (partner_info && (partner_info->flags & DPM_PARTNER_FLAG_DATA_SWAP)) {
dpm_pd_command(port, DPM_CMD_SEND_DR_SWAP, NULL, NULL);
}
}
break;合同谈判完成事件(APP_EVT_PD_CONTRACT_NEGOTIATION_COMPLETE)可能过早,建议在端口进入就绪状态后发送:
case APP_EVT_PD_PORT_STATUS_UPDATE:
if (port == PORT_0 && dpm_get_info(port)->cur_port_type == PRT_TYPE_DFP) {
// 延迟发送(例如 100ms),确保状态稳定
start_timer(port, TIMER_DR_SWAP, 100);
}
break;
case APP_EVT_TIMER_EXPIRY:
if (timer_id == TIMER_DR_SWAP) {
dpm_pd_command(port, DPM_CMD_SEND_DR_SWAP, NULL, NULL);
}
break;注册回调函数处理 DR_SWAP 的响应:
case APP_EVT_PD_COMMAND_COMPLETE:
if (cmd == DPM_CMD_SEND_DR_SWAP) {
if (status == CY_PD_STAT_SUCCESS) {
// 交换成功,更新本地数据角色
} else {
// 处理失败(如重试或回退)
}
}
break;app_handler.c 中启用 CY_PD_LOG_MSG,观察 DR_SWAP 是否被发送及响应状态。DR_SWAP 请求是否发出及对方响应。// 在 app_handler.c 中添加以下逻辑
case APP_EVT_PD_PORT_STATUS_UPDATE:
if (port == PORT_0 && dpm_get_info(port)->cur_port_type == PRT_TYPE_DFP) {
const dpm_port_partner_info_t *partner_info = dpm_get_partner_info(port);
if (partner_info && (partner_info->flags & DPM_PARTNER_FLAG_DATA_SWAP)) {
// 避免频繁重试,可添加重试计数器
static uint8_t retry_count = 0;
if (retry_count < 3) {
dpm_pd_command(port, DPM_CMD_SEND_DR_SWAP, dr_swap_callback, NULL);
retry_count++;
}
}
}
break;
// 回调函数示例
void dr_swap_callback(uint8_t port, cy_en_pd_status_t status, void *context) {
if (status == CY_PD_STAT_SUCCESS) {
CY_PD_LOG_MSG("DR_SWAP success on port %dn", port);
} else {
CY_PD_LOG_MSG("DR_SWAP failed (status=0x%x)n", status);
}
}PDO 是否包含 DataSwap 标志。通过以上步骤,应能正确触发 DR_SWAP 并实现 PORT0 切换为 UFP。如仍失败,建议提供协议日志进一步分析。
举报
更多回帖