This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TPS65987D:电源角色交换并非始终工作

Guru**** 663810 points
Other Parts Discussed in Thread: TUSB8041, TUSB321, TPS2500
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/989003/tps65987d-power-role-swap-not-always-working

器件型号:TPS65987D
主题中讨论的其他器件:TUSB8041TUSB321TPS2500

您好!

过去几个月、我们一直致力于开发 USB Type C 扩展坞、以便将多个器件连接到手机、并可以将充电器连接到系统。

简要功能:

  • 手机通过 USB Type C 连接器连接到第一个 PD 控制器(TPS65987DDH)。 当系统未连接充电器时、此控制器处于功耗灌电流模式、即为集线器和连接的设备供电。 控制器始终处于 UFP 模式。
  • 电话端口的数据线连接到集线器(TUSB8041)
  • 有两个 USB Type C 连接器可用于将设备(例如摄像机、闪存驱动器、鼠标、键盘等)连接到集线器。 这两个器件均由5V 电源供电、最大电流为500mA (TUSB321与 TPS2500)。
  • 电路板上有另一个 PD 控制器(TPS65987DDH)、用于将充电器(USB Type C)连接到系统。 连接充电器后、必须为系统供电、手机进入充电模式。
  • 手机将始终连接到电路板。
  • 电路板上没有电池。 两个 PD 控制器中的一个将在电池电量耗尽模式下启动
  • PP_HV1和 PP_HV2处于双链路(两个 PD)中、并连接到内部5V 电源轨。 SMPS 制造1V1和3V3供内部使用。
  • GPIO1上有一个从电话 PD 到充电器 PD 的连接、此连接有一个下拉电阻器和一个 RC 滤波器(1k/100nF)。

配置电话 PD (高级模式):

  • 在 BP_WaitFor3V3_Internal 中引导;因此、当 Board_3V3稳定时、PD 控制器从闪存加载其配置
  • PP 开关作为灌电流或拉电流
  • Power DUO 模式
  • GPIO1配置为输入:加载应用配置1
  • Load App Config 1在上升沿触发 CMD:DBfg (清除电池电量耗尽标志)=>因此当充电器处于灌电流模式时、该标志会清除
  • 加载应用配置1在上升沿触发 CMD:SWSr (切换至源)
  • 加载应用配置1在上升沿触发 CMD:SWSk (切换至灌电流)
  • 处理和启动交换至源已启用
  • 1配置了发送源功能
  • 1配置了发送接收能力

配置充电器 PD (高级模式):

  • 在 BP_NoWait 中引导;因此它始终尝试从闪存加载其配置
  • PP 开关仅作为灌电流
  • Power Duo 模式
  • GPIO1为输出:灌电流仲裁输出
  • 处理并启动与灌电流的交换已启用
  • 1配置了发送接收能力

此器件与永久连接到手机的电路板一起使用。 充电器仅在为手机充电时连接、不工作。 大部分时间它按预期工作、但有时电话-PD 没有响应。 只有电话的硬重置或断开/连接才能解决此问题。

使用调试工具、我发现电话 PD 在无响应时处于的状态为:common_State_ATTACHWAIT_SNK。

另一个问题:有时电话-PD 具有重复性、但它处于 PEState_Sink_Ready 或 PEState_Legacy 模式。 在这种情况下、手机可以为电路板供电、但在连接充电器时、它不会充电。 看起来两个 PD 控制器都处于灌电流模式(充电器中的 P1_RCP 为 true)。

当器件工作时、电话 PD 处于 PEState_Source_Ready 和 PRState_SinkTxOk 状态。

当我硬重新启动电话时(不更改设备上的任何内容)、电话-PD 会继续并与电话协商 PDO。

已尝试:

  • 配置来实现的
  • 在电话 PD 上使用灌电流仲裁输入
  • 在与 Charger-PD 相同的输入上使用两者- APP 配置、灌电流仲裁输入
  • 已尝试在电话 PD 中进行灌电流和拉电流的虚拟设备配置
  • 许多有关端口配置和控制的配置
  • 更快/更慢的压摆率
  • 其他电话

遗憾的是、这也不能解决问题。

我是否错过了一件事? 有人有线索吗?

此致、
Matthijs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthijs、

    最好能够使用该工具来调试跟踪。

    电话 PD 看起来像在 ATTACHWAIT_SNK 中 、正在等待主机源 VBUS 或 VCONN 提供 VPD、请参阅随附的状态图。

    您能否在 PD 日志、CC 线路和 VBUS 没有响应时捕获日志、以及您的项目文件?

    此致、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    感谢您的快速回复!

    附件中提供了充电器和电话的项目文件 :e2e.ti.com/.../Project-files.zip

    来自电话 PD 控制器的"PD 状态机跟踪":

    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	INT	0x50 = PATCH_LOADED
    Port 0	PD	0x1 = PEState_CableTypeDetect
    Port 0	Type-C	0x66 = COMMON_STATE_UNATTACHED_SNK
    Port 1	PD	0x1 = PEState_CableTypeDetect
    Port 1	Type-C	0x0 = SRC_STATE_DISABLED
    Port 0	Type-C	0x65 = COMMON_STATE_ATTACHWAIT_SNK

    另一个值得一提的优点是器件上没有 MCU。 因此、遗憾的是、我们在操作模式下向 PD 控制器发送4CC 命令的工作非常有限。

    今天下午、我将能够使用 USB PD 分析仪捕获电话和电话 PD 之间的 PD 通信(CC、VBus 等)。 我将在有它时发布它。

    此致、
    Matthijs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    我能够在 USB 线路上捕获跟踪:

    放大了最后一部分(手机不再响应):

    图例(希望它可读):

    PD 布线上相应封装的屏幕截图还包括:

     线路818至821是电话最后发送的数据包。 之后、它不再响应。

    此致、
    Matthijs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthijs、

    感谢您提供的数据、但我能否获取 PD 跟踪本身而不是 jpeg、您能否将 PD 状态机转储到文件中?

    如果在连接充电器时手机 PD 作为电源、很奇怪 VBUS 不存在且 PD 处于 ATTACHWAIT_SINK 状态。

    是否已尝试删除 Phone PD 侧的初始交换至源?

    如果 GPIO1、PPHV 发生故障、您能否同时捕获在 PHONE PD、CC 线路和 VBUS 上的 GPIO1、PPHV?

    为什么在状态机中加载了修补程序的 INT?

    发生这种情况时、您能否提供事件序列?

    是这样吗?

    • 坞站在连接电话的情况下通电;Phone_PD 为灌电流
    • 然后、将充电器连接到充电器 PD 端口上
    • 您是否在日志中看到了 PR_SWAP?
    • 等等

    此致、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    我是 Matthijs 的同事。
    在没有 Matthijs 的情况下、我接受了有关此问题的测试和调查。

    我使用逻辑分析仪测量了 GPIO 1信号电源和 CC 信号的时序、以查看 PD 分析仪的确切序列。 我发现、在充电器的 GPIO 1变为高电平后、PD 通信完全停止。 在某种程度上丢失了捕获、但我可以从存储器中对其进行描述。

    正常运行时、我们有:
    电话电源扩展坞(灌电流)、未连接充电器。
    充电器已连接
    充电器 PD 控制器信号灌电流仲裁(变为高电平)

    手机端 PD 控制器发出拉电流功能
    Phopne 向 PD 控制器发出请求
    电话 PD 接受
    电话 PD 发出 PS_RDY 信号

    在这个序列中的某个位置、手机上的 VBUS 会进入 VSafe (断开/停止灌电流)
    然后、再次打开 VBUS、并以源为源。

    成功案例与失败案例之间的区别在于、在发出灌电流仲裁信号后、电话和 PD 控制器之间根本没有 PD 通信。

    此外、我注意到、重新连接手机时会发送硬重置、但任何一方都不再响应。
    之后、我重新启动了电话、然后电话卡在我们一侧的无限 PR_SWAP 请求流中。

    这让我想到了将此交换请求行为更改为正常命令的想法、该命令通常应根据 USB PD 规范发出源模式操作的启动。 因此、我将命令更改为发送源功能、而不是当接收端仲裁变为高电平时。 现在、这似乎可以可靠地运行! 当电话接收到源功能时、它始终会响应请求。

    我一直在使用这种新配置在使用不同电话的多个原型上进行测试。
    由于这具有很高的优先级、我没有做出很好的新的选择。 如果您仍想看到它们、我需要使用旧配置。 感谢迄今的帮助!

    PS 我想知道您发送的状态图来自哪个文档?

    此致、
    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dave、

    GPIO 应通过其 APP_Config 将电话 PD 角色更改为拉电流、当它在灌电流模式下等待时、它会显示未正确加载。 这就是我希望看到此 IO 行为的原因。

    我查看了 Charger pjt 文件、发现没有与 SINK_ARB_INPUT 关联的 GPIO 事件、根据器件主机接口文档、该事件与  SINK_ARB_OUTPUT 协同工作。 当输入侧未被驱动时、这个引脚可 在内部悬空、这也许是它有时工作、有时不工作的原因。 您能否为此 SINK_ARB_INPUT 事件分配 GPIO 并将其驱动为低灌电流、这将始终是灌电流 PD?  

    状态图来自2019年8月2.0版 USB Type-C 规范第168页。

    此致、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    我们使用充电器 PD 上的灌电流仲裁输出、该控制器实际上始终处于灌电流状态。

    我们最初使用了电话侧 PD 控制器上的灌电流仲裁输入、使用了内部或外部下拉电阻、似乎可以正常工作。
    但是、这也不可靠、我们发现的问题是手机 PD 控制器拒绝了交换、我们也在使用 I2C 手动发出交换时拒绝了交换。 我们发现它被拒绝、因为在大多数情况下、电池电量耗尽标志处于活动状态、这在我们的情况下基本上是不可避免的。

    因此、我们将其更改为首先使用应用 IO 配置发出清除死电池标志命令、然后依次使用切换至源命令。
    由于我们只有一个可用于连接此 PCB 上的2个 PD 控制器的 IO、因此我们尝试以这种方式解决问题。 此外、我们还尝试使用灌电流仲裁输入和应用 IO 配置以及无电电池清除命令、方法是在 PCB 上使用额外的接线补丁、该补丁也不可靠。

    关于您显示的部分,我们已经阅读了它,但在配置工具中找不到 MultiPortSinkNonOverlapTime。 在实践中、如果我们查看测量结果、那么使用默认值似乎足够长:您知道该寄存器是否可用于此控制器、或者是否在工具中缺失?

    此致、
    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dave、

    为什么手机 PD 上有 SINK_ARB_INPUT?  这应该位于已将 GPIO1设置为 SINK_ARB_OUTPUT 的充电器 PD 上。 您能否尝试在充电器 PD 中为 SINK_ARB_INPUT 设置 GPIO?

    在 pjt 文件中、不支持多端口灌电流、因此它无关紧要。

    此致、

    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    也许我们对端口在我们的设置中的作用有一些误解、所以我们先尝试清楚说明这一点。
    我们称之为充电器 PD 控制器的是连接到 USB-C 端口的 PD 控制器、该端口只能用作 PCB 的接收器。
    我们所说的电话 PD 控制器可控制更复杂的端口、从而实现使用 USB-C 电缆连接到电话的电源角色交换功能。
    我们之所以将充电器作为输出、是因为此 PD 控制器在检测到充电器连接器和电源的插入或移除时启动电源角色交换。 主要是插入事件、在移除时、PCB 断电、电话 PD 控制器将重置并与连接的电话协商以重新启动电源。

    我们看到、当通过提升灌电流仲裁 GPIO 信号连接充电器时、充电器会初始化仲裁序列。 由于电话 PD 控制器无法知道充电器已连接、因此无法启动仲裁。

    我希望这能澄清我们的设置吗?

    此致、
    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dave、

    为了使用 SINK_ARB_OUTPUT 事件、您需要具有与其关联的 SINK_ARB_INPUT 事件。 这就是我之前附加的 TRM 快照中的协同工作。 在此充电 PD 项目文件中、我没有看到分配给该 SINK_ARB_INPUT 事件的 GPIO。 我知道您的配置、但使用此输出事件的要求是将输入事件置于相同的 PD 配置中。 您可以保留 Phone PD 中的设置、但在 Charger PD 中为 SINK_ARB_INPUT 事件分配 GPIO、并将其设置为低电平、然后重试。 希望这一点很清楚。

    此致、

    Peter