USB论坛
直播中

王健

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

请问CYPD5126 能否通过PSoC™ Creator 中的 API 检测电源(VBUS 或 VSYS)?

我正在使用USB PSoC™Creator 中的 CYPD5126 PD 控制器。是否有 API 或方法可以确定系统是由 VBUS 还是 VSYS 供电?
我们希望确保在执行 I2C 固件更新之前系统在 VSYS 上运行。

回帖(1)

王鑫

2025-8-6 17:46:35

是的,可以在运行于 CYPD5126 上的固件中检测当前的主要电源是 VBUS 还是 VSYS,但这不是通过 PSoC™ Creator 中提供的一个简单的、高级别、直接命名为 GetCurrentPowerSource() 的专用 API 函数来实现的。


CYPD5126 内部的模拟系统始终在监测 VBUS (VBUS_IN) 和 VSYS (VBUS_DD) 的电压。你需要通过读取特定的模拟电压监测寄存器状态位来获取所需信息。


以下是如何实现的详细方法:




  1. 理解电源路径控制 (Power Path Control):



    • 当 VBUS 电压高于设定的阈值(由固件配置的 VBUS_VSYS_SEL 或类似选项决定)并且高于 VSYS 电压加上一个容差时,内部 FET 开关会导通,将 VBUS 连接到 VSYS 轨。此时,系统由 VBUS 供电

    • 当 VBUS 电压低于该设定阈值低于 VSYS 电压减去一个容差时,内部 FET 开关会断开。此时,系统由 VSYS 供电(通常来自电池或其他后备电源)。

    • 关键点:VSYS 轨道上实际存在的电压来源(VBUS 还是本地后备)就是这个问题的答案。




  2. 访问监测寄存器 (Analog Voltage Monitor Registers):



    • 你需要读取模拟电压监测寄存器,通常是 VDDA_PD 寄存器 (0x6B)

    • VDDA_PD (0x6B) 寄存器包含多个与电源路径相关的状态位。其中最重要的位是 OP_SRC (Operating Source),有时也称为 PWRSRC (Power Source) 或类似名称。

    • 检查芯片数据手册或相关的寄存器映射文档 (Register TRM - Technical Reference Manual) 以确认:

      • VDDA_PD 寄存器 (0x6B) 中用于指示当前电源的位的确切位置和名称 (通常是 Bit 1,叫做 OP_SRC, PWRSRC, VBUS_DET 或类似)。

      • 该位的含义

        • 0: 表示系统当前由 VSYS (VBUS_DD) 供电 (或者 VBUS 未高于阈值)。

        • 1: 表示系统当前由 VBUS (VBUS_IN) 供电 (并且 VBUS 高于阈值)。






  3. 如何在固件中读取该位:



    • 使用 Cypress/Cypress (现为 Infineon) 提供的 PD Stack API 中用于访问设备的系统/模拟寄存器的底层函数

    • 关键 API: 在 PSoC Creator 的 PD 项目环境中,最常用的方法是使用 dpm_platform_read_reg 函数。这个函数允许你直接读取指定的内存映射寄存器地址。


    • 代码示例 (示意性):


      #include "dpm_platform.h" // 通常需要包含这个头文件来访问底层寄存器读写函数
      #define VDDA_PD_REG_ADDR 0x40006000 // **重要!确认这是 CYPD5126 在 DPM 内存映射中的正确基址+偏移量!**
                                          // 假设 VDDA_PD 的实际内存地址是 0x40006000,这仅为示意,你需查阅 TRM!
      #define VDDA_PD_OP_SRC_BIT_POS 1    // **重要!查阅 TRM 确认位位置!**

      bool IsSystemPoweredByVSYS(void) {
          uint8_t vdda_pd_reg;

          // 使用 DPM 平台函数读取 VDDA_PD 寄存器
          if (dpm_platform_read_reg(VDDA_PD_REG_ADDR, &vdda_pd_reg) != STATUS_SUCCESS) {
              // 处理读取错误
              return false; // 或在错误时返回安全值/记录错误
          }

          // 检查 OP_SRC/PWRSRC 位
          if ((vdda_pd_reg & (1 << VDDA_PD_OP_SRC_BIT_POS)) == 0) {
              return true; // 位为 0: 由 VSYS 供电
          } else {
              return false; // 位为 1: 由 VBUS 供电
          }
      }


    • 极其重要:

      • 确认寄存器地址 (VDDA_PD_REG_ADDR): 该地址不是简单的 0x6B。0x6B 通常是设备的寄存器索引。你需要查阅 CYPD5126 的 Register Technical Reference Manual (TRM) 或 PD Stack 文档,找到 VDDA_PD 寄存器在 DPM (Device Policy Manager) 固件可以访问的内存映射地址空间中的实际物理地址或偏移量dpm_platform_read_reg 使用的地址是这个内存映射地址。

      • 确认位位置 (VDDA_PD_OP_SRC_BIT_POS): 同样需要查阅 TRM,确认 OP_SRC/PWRSRC 位在 VDDA_PD 寄存器中的具体位置(例如是 bit 1、bit 0 还是其他位置)。

      • 确认位含义: 明确是 0 表示 VSYS 供电还是 1 表示 VSYS 供电。上面示例的逻辑 (位为0 -> VSYS) 很常见,但务必以官方文档为准





  4. PSoC Creator 配置和寄存器名称:



    • 在 PSoC Creator 的 EZ-PD™ 配置工具中配置的 VBUS_VSYS_SEL 选项只是设定了切换的电压阈值,它本身并不会在固件中直接给你一个“当前电源”的状态位。该配置会影响模拟比较器的参考点,其输出结果体现在上面提到的寄存器状态位上 (OP_SRC/PWRSRC)。




总结与建议:



  1. 可以检测: 是的,你可以通过读取 CYPD5126 的模拟监测寄存器(主要是 VDDA_PD 0x6B)中的 OP_SRC/PWRSRC 状态位来可靠地确定当前系统是 由 VSYS (位 = 0) 还是由 VBUS (位 = 1) 供电

  2. 使用 dpm_platform_read_reg API: 在固件中使用这个底层函数来读取包含了所需状态位的寄存器的正确内存映射地址

  3. 查阅文档: 这是成功的关键。你必须查阅适用于你使用的特定 CYPD5126 固件库版本的 Register TRM,以找到:

    • VDDA_PD 寄存器的内存映射地址(用于 dpm_platform_read_reg)。

    • OP_SRC/PWRSRC 位在该寄存器中的精确位置 (bit position)。

    • 该位的明确定义 (0 和 1 分别代表什么)。

    • 可能还需要查看任何关于读取模拟寄存器的注意事项。


  4. 在 VSYS 上更新固件: 一旦你在固件中正确实现了 IsSystemPoweredByVSYS() 这样的函数,你就可以在进行 I2C 固件更新操作之前检查其返回值。如果返回 false (VBUS 供电),你可以选择延迟更新、向主机报告状态、或者在某些设计下安全地暂时忽略 VBUS 移除风险(如果你的系统有超级电容保证或设计上允许短暂中断)。


替代或补充思路:



  • 监测 VBUS_IN 电压变化: 除了检测“主要”电源源,你也可以定期读取 VBUS_IN 的模拟电压值。如果检测到稳定的电压(通常在 5V 附近),说明 VBUS 存在;如果读到 0V 或很低电压,说明是 VSYS 在供电(假设没有负载导致电压骤降)。但这不如状态位直接。

  • 硬件设计保障: 如果可靠性要求极高,可以考虑设计硬件电路,使得无论 VBUS 还是 VSYS 供电,只要系统总电压高于一个最低工作阈值,就能安全进行固件更新(例如使用大电容或超级电容在短暂拔插时维持电压)。


最重要的第一步:找到 CYPD5126 的详细寄存器技术手册 (TRM),定位 VDDA_PD 寄存器的内存地址和 OP_SRC 位的位置及含义。 这个信息是解决问题的核心。

举报

更多回帖

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