USB论坛
直播中

李娓仑

8年用户 1440经验值
私信 关注
[问答]

CCG3PA根据情况移除PD充电的最佳方法是什么?

我有一个独特的 PD 充电(来源)CCG3PA 应用程序,如果 GPIO 检测到某种情况,则完全禁用 PD 充电(包括基于的 5V 配置文件)。 我的第一个想法是在满足条件时调用 " dpm_stop(端口);然后在条件不再为真"时调用 " dpm_start(端口)。" 但是,我不确定这是否是没有其他 MCU 功能(例如持续监控 GPIO)产生负面影响的最佳方法。 你能否告诉我满足条件时禁用 PD 源充电的最佳方法,但它不会阻碍/禁用其他 MCU 功能?

回帖(1)

任凭风吹

2025-6-5 17:46:48

根据您的需求,以下是禁用 PD 充电同时避免影响其他 MCU 功能的最佳实践:




分步解决方案:




  1. 动态修改 PDO(电源数据对象)而非完全停止 DPM

    调用 dpm_stop() 可能会中断 PD 协议栈的底层状态机,导致意外行为(如端口复位)。建议通过以下方式实现:




    • 条件触发时:移除所有 PDO(包括 5V),使端口无法协商供电。


      // 获取当前 PDO 配置
      cy_stc_pd_pdo_t *pdo_list;
      uint8_t pdo_count = Cy_PD_Stack_Dpm_GetSourcePdos(port, &pdo_list);

      // 清空 PDO 列表(禁用所有电源输出)
      Cy_PD_Stack_Dpm_SetSourcePdos(port, 0, NULL);

      // 可选:立即关闭 VBUS(若硬件支持)
      Cy_PD_Stack_Dpm_DisableVbus(port);


    • 条件解除时:恢复原始 PDO 配置。
      Cy_PD_Stack_Dpm_SetSourcePdos(port, original_pdo_count, original_pdo_list);
      Cy_PD_Stack_Dpm_EnableVbus(port); // 重新启用 VBUS




  2. 使用 GPIO 中断而非轮询

    避免阻塞其他任务:


    // 配置 GPIO 中断
    Cy_GPIO_SetInterruptEdge(GPIO_PORT, GPIO_NUM, CY_GPIO_INTR_FALLING);
    Cy_GPIO_SetInterruptMask(GPIO_PORT, GPIO_NUM, 1);
    Cy_GPIO_ClearInterrupt(GPIO_PORT, GPIO_NUM);



  3. 在中断中设置标志,在主循环处理逻辑

    保持中断处理轻量:


    volatile bool disable_charge = false;

    // GPIO 中断服务例程
    void gpio_isr(void) {
       disable_charge = (Cy_GPIO_Read(GPIO_PORT, GPIO_NUM) == condition);
       Cy_GPIO_ClearInterrupt(GPIO_PORT, GPIO_NUM);
    }

    // 主循环
    while(1) {
       if (disable_charge) {
           Cy_PD_Stack_Dpm_SetSourcePdos(port, 0, NULL);
       } else {
           Cy_PD_Stack_Dpm_SetSourcePdos(port, original_pdo_count, original_pdo_list);
       }
    }





关键注意事项:



  • VBUS 控制:确保在禁用 PDO 后调用 Cy_PD_Stack_Dpm_DisableVbus() 以关闭物理电源输出。

  • PD 协议兼容性:修改 PDO 会触发 PD 重新协商,确保设备端正确处理 RejectWait 状态。

  • 硬件依赖:某些 CCG3PA 实现可能需要通过 Cy_PD_Stack_Dpm_UpdateSrcCap 通知协议栈更新电源能力。




验证方法:



  1. 使用协议分析仪(如 Total Phase)监控 PD 通信,确认禁用时无 Source Capabilities 广播。

  2. 测量 VBUS 电压,确保在条件触发时降至 0V。

  3. 测试其他 MCU 功能(如 UART、ADC)是否在禁用充电时正常运行。


此方法在保留 PD 协议栈运行的同时精准控制供电,避免全局状态机复位带来的副作用。

举报

更多回帖

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