1. 项目概述与核心价值
在嵌入式电源管理领域,尤其是USB Power Delivery(PD)控制器这类高度集成的芯片中,固件更新能力早已不是“锦上添花”,而是产品生命周期的“生命线”。想象一下,你设计的一款高端笔记本或快充充电宝,因为PD协议的一个小版本更新,或者发现了一个影响充电效率的固件缺陷,难道要全部召回吗?显然不现实。这时,一套可靠、高效的现场固件更新(FOTA)机制就成了救命稻草。
我最近在深度调测德州仪器的TPS26750A这款双端口PD控制器时,就花了大量时间研究它的4CC任务系统,特别是其中负责固件补丁更新的PTCx系列任务。这套机制的精妙之处在于,它不仅仅是一个简单的数据搬运工,而是一个包含状态机管理、安全校验、错误恢复的完整流程。从让控制器进入等待补丁的“PTCH”模式,到分块传输、校验,再到最终激活,每一步都有明确的任务(Task)来驱动,并通过标准的I2C接口与主机(通常是嵌入式MCU或EC)通信。
这套流程的价值,对于嵌入式开发者而言是巨大的。它意味着:
- 功能迭代与缺陷修复:无需改动硬件PCB,即可通过软件更新支持新的PD协议版本、优化充电策略或修复已知问题。
- 现场配置与个性化:可以为不同客户或不同批次的产品加载不同的应用配置(Application Configuration),实现硬件的软件化定制。
- 提升系统可靠性:通过严谨的校验流程(如CRC)和状态查询机制,确保补丁加载过程万无一失,避免因升级失败导致设备“变砖”。
本文将基于TPS26750A的技术手册,为你深入拆解从“PTCs”启动补丁下载,到“PTCd”传输数据,再到“PTCc”完成校验的完整流程。同时,我们也会探讨与之紧密相关的系统任务,如通过“I2Cr”/“I2Cw”读写外部器件,以及“GPsh”/“GPsl”控制GPIO等操作。我的目标不是复述数据手册,而是结合实际的调试经验和踩过的坑,告诉你这些任务在真实项目中如何协同工作,以及如何构建一个健壮的更新流程。无论你是正在评估PD控制器的硬件工程师,还是负责实现固件更新逻辑的软件工程师,这些来自一线的细节和经验,都能让你少走很多弯路。
2. 核心任务机制与设计思路拆解
在深入每个任务之前,我们必须先理解TPS26750A(以及类似架构的PD控制器)管理固件更新的核心设计哲学。它不是通过一个简单的“写内存”命令来完成的,而是通过一个精心设计的任务(4CC Task)系统。你可以把这个系统想象成给芯片下达的“工作指令单”。
2.1 4CC任务系统:芯片的“指令集”
4CC,即“4-Character Code”,每个任务都有一个像“PTCs”、“I2Cr”这样的四字符代码。主机通过I2C总线,向PD控制器特定的命令寄存器(CMDx)写入这个代码,就相当于下达了一个指令。控制器收到后开始执行,执行期间CMDx寄存器会变为非零,执行完毕后再清零,主机通过轮询这个寄存器或等待中断信号来知晓任务完成。
这种设计有几个关键优势:
- 原子性操作:一个任务代表一个完整的操作单元(如“开始下载”、“写一页Flash”),避免了主机在复杂流程中管理中间状态。
- 状态隔离:任务执行期间,控制器可能进入特定模式(如“PTCH”模式),普通寄存器访问可能受限,任务机制确保了流程的严谨性。
- 错误封装:每个任务都有明确的标准返回码(Standard Task Return Code)或扩展的输出数据(OUTPUT DATAX),将操作成功与否清晰地反馈给主机。
2.2 补丁(Patch)与应用配置(Application Config)的双重奏
在TPS26750A的语境下,“固件更新”实际上可能包含两部分内容:
- 设备补丁(Device Patch):这是用于修改或增强控制器内部固件(Firmware)功能的二进制代码。可以修复bug,也可以增加新特性。
- 应用配置(Application Configuration):这是一组配置数据,用于初始化PD控制器的各种寄存器,比如设置GPIO功能、配置电源路径策略、定义PDO(电源数据对象)等。它决定了控制器“如何行为”。
一个“补丁包”(Patch Bundle)可以同时包含这两者,也可以只包含其一。在更新流程中,它们被分别处理、分别校验。理解这个区别至关重要,因为后续的很多状态码和错误码都是针对这两部分分别报告的。
2.3 核心流程总览与模式切换
整个补丁加载流程围绕着PD控制器的MODE寄存器状态展开。这个寄存器反映了控制器所处的核心状态:
‘APP ‘:正常应用模式。控制器正在运行主固件,执行正常的PD协议通信和电源管理功能。在此模式下,大部分补丁下载任务会被拒绝。‘PTCH’:补丁模式。控制器正在等待或正在接收补丁数据。这是执行PTCs/PTCd/PTCc等任务的先决条件。‘BOOT’:引导模式。通常表示固件启动失败或配置错误,需要干预。
因此,一个完整的更新流程,本质上是将控制器从‘APP ‘模式引导至‘PTCH’模式,完成数据加载和校验后,再返回‘APP ‘模式(或直接运行新补丁)。任务‘GO2P’就是专门用于从应用模式强制跳回补丁模式的“开关”。
实操心得:模式检查是第一步在发起任何补丁相关任务前,第一件事就是读取MODE寄存器。如果不在
‘PTCH’模式,盲目发送‘PTCs’任务会被拒绝。同样,在‘APP ‘模式下发送结束补丁模式的‘PBMe’任务也会被拒绝。养成检查模式的习惯,能避免很多看似诡异的失败。
3. 补丁下载任务链详解与实操要点
这是整个更新流程最核心的部分,涉及一系列必须按顺序执行的任务。我们以一个典型的、包含应用配置和设备补丁的完整更新流程为例,逐步拆解。
3.1 阶段一:进入与准备 (GO2P->PTCs)
3.1.1 强制进入补丁模式 (GO2P任务)
如果你的设备已经在正常运行(MODE=‘APP ‘),你需要先使用‘GO2P’任务让它回到等待补丁的状态。
- 任务作用:强制PD控制器重新进入补丁模式(MODE =
‘PTCH’)。 - 输入:无。
- 输出:标准任务返回码(Byte 1)。
- 关键约束:这个任务仅在ADCINx配置选项为
NegotiateHighVoltage时才能使用!如果你的硬件设计用了其他配置(比如通过电阻设置固定地址),这个任务会失败。这是手册里明确强调但容易被忽略的一点。 - 执行过程与副作用:
- 主机发送
‘GO2P’命令到CMDx寄存器。 - 控制器开始模式切换,此时USB PD PHY会被禁用(即暂停PD通信)。
- 控制器可能临时NAK(不应答)I2C事务。这是个大坑!主机需要等待控制器的IRQ信号(因为INT_EVENT1.ReadyForPatch被置位),然后再尽快开始推送补丁数据。
- 主机发送
- 实操要点:
- 错误处理:如果任务被拒绝(返回码非成功),首先检查ADCINx配置,其次检查当前模式。
- 等待中断:不要用死循环轮询CMDx寄存器归零后就立刻发数据。正确做法是:发送
‘GO2P’-> 轮询CMDx=0确认任务完成 -> 然后等待INT_EVENT1.ReadyForPatch中断,或者至少等待一个手册建议的延时(如10ms),再开始后续操作。直接发数据可能会因为控制器未准备好��导致I2C通信失败。
3.1.2 启动补丁下载序列 (PTCs任务)
控制器进入‘PTCH’模式后,就可以用‘PTCs’任务正式宣告补丁下载开始,并告诉控制器这次补丁包里有什么。
- 任务作用:初始化固件,准备补丁包加载序列,并声明补丁包内容。
- 输入 (INPUT DATAX):
- Byte 1: 补丁包头信息。
- Bit 1 (DevicePatch):
0表示补丁包包含设备补丁;1表示不包含。 - Bit 0 (AppConfig):
0表示补丁包包含应用配置;1表示不包含。 - 高6位保留,写0。
- Bit 1 (DevicePatch):
- Byte 1: 补丁包头信息。
- 输出 (OUTPUT DATAX):这个任务的输出非常丰富,用于报告各部分的状态。
- Byte 4 (AppConfigStartStatus): 应用配置的启动状态 (
0x00成功,0x20已加载,0x40已开始)。 - Byte 3 (DevicePatchStartStatus): 设备补丁的启动状态 (同上)。
- Byte 2 (PatchStartStatus): 整体补丁启动状态 (
0x00成功,0x40警告,0x80失败)。 - Byte 1 (Return Code): 标准返回码,但其高半字节和低半字节分别指示了
rpReturn和acReturn的最高位,方便快速判断严重性(成功/信息/警告/错误)。
- Byte 4 (AppConfigStartStatus): 应用配置的启动状态 (
- 实操要点与状态解析:
- “已加载”状态:如果返回
0x20(已加载),意味着控制器认为对应的补丁或配置已经存在于内存中(可能是之前加载过且未复位)。这时你需要决定是继续强制更新(可能需要先使用‘PTCr’重置),还是跳过这部分。这是一个重要的状态管理点。 - “已开始”状态:如果返回
0x40(已开始),意味着一个下载序列已经启动但未完成。此时你应该先发送‘PBMe’或‘PTCr’来终止当前序列,再重新开始,而不是强行发送‘PTCs’。 - 顺序性:
‘PTCs’必须在任何‘PTCd’(数据传输)之前调用,且一个完整的下载周期内只能调用一次。
- “已加载”状态:如果返回
3.2 阶段二:数据传输 (PTCd任务)
这是数据搬运的主力任务,负责将补丁包的实际二进制数据分块传送给PD控制器。
- 任务作用:在
‘PTCs’成功后,用于传输补丁二进制数据,每次最多传输64字节。 - 输入 (INPUT DATAX):512位(64字节)的补丁数据。数据必须严格按照补丁包格式组织。
- 输出 (OUTPUT DATAX):提供详细的传输进度和状态反馈。
- Byte 10-9 (TotalDataTransferred): 已发送的总数据大小(包括应用配置和设备补丁)。
- Byte 8-7 (DevicePatchDataTransferred): 已发送的设备补丁数据大小。
- Byte 6-5 (ApplicationConfigurationDataTransferred): 已发送的应用配置数据大小。
- Byte 4 (PatchStatus): 当前补丁加载状态机的状态。这是一个非常重要的调试信息!从
0x01(应用配置头阶段1)到0x0A(补丁过程成功完成),清晰地展示了控制器内部处理到了哪一步。 - Byte 3 (TransferStatus): 本次传输任务的状态 (
0x00下载成功,0x01补丁长度超限,0x02未在期待补丁)。
- 关键流程与避坑指南:
- 轮询CMDx:在发送下一组64字节数据之前,必须轮询CMDx寄存器,直到其值变为0,表明上一个
‘PTCd’任务已完成。这是流控的关键。 - 检查TransferStatus:每次
‘PTCd’任务完成后,不仅要看CMDx归零,更要读取OUTPUT DATAX的Byte 3 (TransferStatus)。如果它不是0x00,说明传输出了问题,必须停止并检查。0x01(长度超限)通常意味着补丁包大小与头信息声明不符,或者传输数据量超过了预期。 - 理解PatchStatus:
PatchStatus是内部状态机的外在体现。例如,当状态变为0x03(等待应用配置数据)时,说明控制器已经解析完了应用配置的头信息,正在等待后续的数据块。主机可以根据这个状态来验证流程是否符合预期。 - 数据拼接:整个补丁包可能需要几十甚至上百个
‘PTCd’任务来发送。主机程序需要维护一个数据指针,每次递增64字节,并处理最后可能不足64字节的尾包。
- 轮询CMDx:在发送下一组64字节数据之前,必须轮询CMDx寄存器,直到其值变为0,表明上一个
3.3 阶段三:完成与校验 (PTCc任务)
当所有数据通过‘PTCd’发送完毕后,就需要用‘PTCc’任务来收尾,触发控制器进行最终的校验和初始化。
- 任务作用:结束补丁加载序列。发送此任务后,控制器将对传输的二进制数据执行CRC校验。如果校验成功,将执行补丁包内的
patch_init函数。如果在‘PTCs’之前发送此任务,则告知控制器“没有可用补丁”,直接跳过补丁过程。 - 输入:无。
- 输出 (OUTPUT DATAX):这是所有任务中输出最复杂的一个,包含了详尽的校验结果和状态信息,长达320位(40字节)。我们需要关注几个核心字段:
- Byte 40-37 (acCalculatedCRC / acTransferredCRC): 应用配置数据的计算CRC和传输CRC。如果不匹配,
acFailCode会指示AC_FAIL_CRC_CHECK_FAIL。 - Byte 30 (acFailCode): 应用配置数据加载失败的具体原因代码。
- Byte 29 (acState): 应用配置状态机的当前状态。
- Byte 24 (rpBundleSignature): 传输的补丁包头中的签名。
- Byte 23 (rpState): ROM补丁状态机的当前状态。
- Byte 22 (patchBundleGood / configBundleGood): 顶层状态机是否找到了好的补丁/配置包。
- Byte 21 (DevicePatchCompleteStatus): 设备补丁完成的返回码(
rpReturn)。这是判断补丁是否被成功接受和执行的关键!0x00表示成功,其他如0x41(包头CRC不匹配)、0x42(补丁与ROM版本不兼容)、0x43(补丁代码CRC不匹配)都是常见的错误。 - Byte 20 (AppConfigPatchCompleteStatus): 应用配置完成的返回码。
- Byte 1 (Return Code): 同样,其高低半字节分别汇总了
rpReturn和acReturn的最高位。
- Byte 40-37 (acCalculatedCRC / acTransferredCRC): 应用配置数据的计算CRC和传输CRC。如果不匹配,
- 完成条件与校验逻辑:
- 主机发送
‘PTCc’任务。 - 控制器开始计算整个补丁包(或配置数据)的CRC,并与包头中携带的CRC值进行比对。
- 如果CRC校验通过,控制器会跳转到补丁包中的
patch_init函数执行初始化(如果有设备补丁)。 - 对于应用配置,控制器会将其应用到相应的寄存器中。
- 任务完成后,主机需检查
DevicePatchCompleteStatus和AppConfigPatchCompleteStatus。两者均为0x00方表示完全成功。
- 主机发送
- 严重警告:手册明确指出,在
‘PTCc’任务完成后,需要等待CMDx寄存器变为0,然后立即检查OUTPUT DATAX寄存器中的状态。不能只检查CMDx就认为万事大吉。CRC失败、版本不兼容等错误都体现在输出数据里,不检查这些状态码就等于盲人摸象。
3.4 辅助任务:查询、重置与模式退出
3.4.1 补丁查询 (PTCq任务)
在更新流程的任何阶段,如果你不确定当前状态,可以使用‘PTCq’任务进行查询。
- 作用:查询补丁过程的当前状态。
- 输出信息:包括补丁来源(SRAM、EEPROM、I2C)、补丁状态(加载中、运行中、错误等)、已传输数据大小以及当前的
PatchLoadingState。这是一个强大的调试工具,当流程卡住时,通过查询可以知道控制器内部状态机停在了哪里。
3.4.2 补丁重置 (PTCr任务)
如果加载了错误或不想要的补丁,或者想清除现有补丁,需要使用‘PTCr’任务。
- 作用:将补丁固件重置为“无补丁”状态。
- 输入复杂性:这个任务需要“钥匙”(Reset Key)。
- 要重置设备补丁,需在输入DATAX的Byte 3写入
0xBE作为DevicePatchResetKey,并将Byte 1的DevicePatchReset位置1。 - 要重置应用配置,需在输入DATAX的Byte 4写入
0xEF作为AppConfigResetKey,并将Byte 1的AppConfigReset位置1。 - 如果对应类型的补丁/配置并未运行,则无需提供钥匙,对应位置写0即可。
- 要重置设备补丁,需在输入DATAX的Byte 3写入
- 安全设计:这种“钥匙”机制是一种安全措施,防止误操作意外重置正在运行的补丁,可能导致系统行为异常。
3.4.3 退出补丁突发模式 (PBMe任务)
这个任务在技术手册提供的多设备同时更新的流程图(Patch Burst Mode)中扮演重要角色,用于结束一个补丁突发下载序列。
- 作用:结束补丁加载序列。在单设备更新流程中,我们使用
‘PTCc’来结束。但在多设备并行更新的“突发模式”下,‘PBMe’用于让控制器完成补丁加载过程。 - 关键限制:如果MODE寄存器已经是
‘APP ‘(应用模式),此任务将被拒绝。这意味着它只能在‘PTCH’模式下使用。 - 副作用:成功后,控制器会恢复第二个目标地址(由ADCINx引脚配置),并保持MODE寄存器为
‘PTCH’,等待下一次补丁过程重启。这为多轮更新提供了可能。
4. 系统任务:I2C、Flash与GPIO操作
除了核心的补丁任务,PD控制器还提供了一系列系统级任务,使其能够作为一个智能的外设管理器,而不仅仅是PD协议芯片。
4.1 I2C主控读写 (I2Cr,I2Cw任务)
这两个任务允许PD控制器作为I2C主设备,主动读写其他I2C从设备(如传感器、EEPROM等),极大扩展了其应用灵活性。
4.1.1 I2C读事务 (I2Cr)
- 作用:通过I2Cc端口(控制器作为主设备)从指定目标地址和寄存器偏移量读取数据。
- 输入:
- Byte 1: 目标设备地址(7位地址,高位保留)。
- Byte 2: 要读取的寄存器偏移量。
- Byte 3: 要读取的字节数。
- 输出:读取到的数据字节(按接收顺序存放)和标准返回码。
- 注意:任务完成只代表I2C事务指令已成功插入队列或执行,不代表从设备一定正确响应。如果从设备NAK,
INT_EVENTx.I2CControllerNACKed会被置位。
4.1.2 I2C写事务 (I2Cw)
- 作用:通过I2Cc端口向指定目标地址执行I2C写事务。
- 输入:
- Byte 1: 目标设备地址。
- Byte 2: 事务长度(数据包字节数 + 1字节寄存器地址)。
- Byte 3: 寄存器偏移量。
- Byte 4-14: 事务负载(最多11字节数据)。
- 一个至关重要的警告:手册明确写道:“This command is not to be used for updating the EEPROM. Refer to the flash commands (FLxx) for updating the EEPROM.” 这意味着
‘I2Cw’任务有长度限制(最多11字节数据),且可能不是原子性的。对于EEPROM(存储补丁或配置)的烧写,必须使用专用的Flash任务(‘FLad’,‘FLwd’等),这些任务内部会处理EEPROM的页写、延时等特性。 - 确认写入:手册建议,如果可能,主机应使用
‘I2Cr’任务来确认写入是否成功。因为‘I2Cw’成功仅代表写命令被加入队列。
4.2 外部Flash/EEPROM操作 (FLrd,FLad,FLwd,FLvy任务)
这是一组专门用于操作连接在I2Cc总线上的外部EEPROM(通常地址为0x50)的任务,用于存储和加载补丁包或应用配置。
- `‘FLrd’ (Flash Read):从指定地址读取Flash内容。输入为32位地址,输出为128位(16字节)数据。注意:任务执行期间,控制器会忽略I2Cc_IRQ引脚,直到任务完成。
- **
‘FLad’ (Flash Address)**:设置Flash写操作的起始地址。为后续的‘FLwd’`任务做准备。 - **
‘FLwd’ (Flash Write)**:从‘FLad’设置的地址开始写入数据,地址自动递增。一次最多写入32字节。**关键点**:必须等待一个‘FLwd’任务完成(CMDx=0且ReturnCode为0x00`)后,才能发起下一个。EEPROM的页写周期需要时间。 - `‘FLvy’ (Flash Verify):验证指定地址的补丁/配置是否有效。通常用于在写入后验证数据的完整性。
实操心得:Flash操作时序对EEPROM进行写操作时,严格遵守
‘FLad’->‘FLwd’(循环) -> (可选)‘FLvy’的顺序。每次‘FLwd’后,必须检查其返回码,并考虑EEPROM的页写时间(典型值5ms),在任务完成后添加适当延时,再进行下一次操作或验证,否则会导致数据损坏。
4.3 GPIO控制 (GPsh,GPsl任务)
这两个任务允许主机直接控制PD控制器的GPIO引脚输出高电平或低电平。
- 作用:
‘GPsh’设置指定GPIO为高,‘GPsl’设置为低。 - 输入:GPIO编号。
- 前置条件:GPIO必须在应用配置(Application Config)中被设置为输出(Output Enable),并且有一个初始值。如果GPIO在配置中是输入模式,这些任务将无法生效。
- 严重警告:手册用“Extreme care must be taken”来强调。如果GPIO连接到了控制器的GPIO事件(例如,某个GPIO被配置为在过压时触发中断),手动用任务改变其电平可能会干扰这些内置功能,导致不可预知的行为。除非你非常清楚硬件连接和配置,否则慎用此功能。
4.4 其他系统任务 (ANeg,DBfg)
- `‘ANeg’ (Auto Negotiate):强制PD控制器重新评估自动协商寄存器,并根据新的电源需求(如果与当前合约不同)发起新的Request消息。这在动态调整功耗需求的系统中非常有用。
- `‘DBfg’ (Clear Dead Battery Flag):清除“死电池”标志。当控制器由VBUS供电启动(例如电池完全没电时)后,此标志被置位,并会限制一些功能(如快速角色交换、硬复位等)。在系统主电源稳定后,应使用此任务清除该标志以恢复全部功能。注意:清除该标志会改变控制器的电源输入选择。
5. 完整更新流程实战与问题排查
结合以上所有任务,我们可以勾勒出一个健壮的、单设备通过I2Ct接口进行固件更新的完整流程,并附上常见的“坑点”。
5.1 标准单设备更新流程
前置条件与检查:
- 确保PD控制器的
VIN_3V3供电稳定。 - (可选)通过
‘PTCq’查询当前补丁状态。 - 读取
MODE寄存器,确认当前状态。
- 确保PD控制器的
进入补丁模式:
- 如果
MODE为‘APP ‘,且硬件配置支持,发送‘GO2P’任务。 - 等待:轮询CMDx直到为0,然后等待INT_EVENT1.ReadyForPatch中断或至少10ms延时。
- 再次读取
MODE,确认已变为‘PTCH’。
- 如果
启动下载序列:
- 准备
‘PTCs’任务的输入数据,指明本次包包含设备补丁、应用配置或两者。 - 发送
‘PTCs’任务。 - 轮询CMDx直到为0,读取OUTPUT DATAX,仔细检查
PatchStartStatus、DevicePatchStartStatus、AppConfigStartStatus。必须全部为成功或预期状态(如“已加载”)才能继续。
- 准备
传输补丁数据:
- 将补丁包二进制数据按64字节分块。
- 对于每一块数据: a. 发送
‘PTCd’任务,DATAX寄存器填入64字节数据。 b.轮询CMDx寄存器直到为0。 c. 读取OUTPUT DATAX,检查TransferStatus必须为0x00(成功)。可同时查看PatchStatus了解内部进度。 - 重复���到所有数据发送完毕。
完成与校验:
- 发送
‘PTCc’任务。 - 轮询CMDx直到为0。
- 至关重要:立即读取OUTPUT DATAX寄存器。
- 核心检查项:
DevicePatchCompleteStatus (rpReturn):必须为0x00(成功)。其他任何代码都代表失败,需根据代码排查(如CRC错误、版本不兼容)。AppConfigPatchCompleteStatus:必须为0x00。patchBundleGood和configBundleGood:应为1。rpState和acState:应变为完成状态(如RP_RUNNING,AC_DONE_SUCCESS)。
- 如果所有状态均正常,补丁和应用配置应已生效。可以读取
MODE寄存器,此时可能已自动或通过其他流程返回‘APP ‘模式。
- 发送
后置操作:
- 进行功能测试,验证新固件或配置是否工作正常。
- (可选)再次使用
‘PTCq’查询,确认补丁状态为“Running”和“Completed Successfully”。
5.2 常见问题排查速查表
在实际开发中,你几乎一定会遇到下面这些问题。这里我把它整理成一个表格,方便你快速对照排查。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
‘GO2P’或‘PTCs’任务被拒绝 | 1. 当前MODE不是‘APP ‘(对‘GO2P’)或不是‘PTCH’(对‘PTCs’)。2. ‘GO2P’任务使用的ADCINx配置不是NegotiateHighVoltage。3. 前一个补丁序列未正确结束。 | 1. 读取MODE寄存器确认状态。2. 检查硬件原理图ADCINx引脚配置。 3. 尝试发送 ‘PBMe’任务结束当前序列,或发送‘PTCr’重置补丁状态,再重试。 |
‘PTCd’任务返回TransferStatus: 0x01(补丁长度超限) | 1. 实际通过‘PTCd’发送的数据总长度与补丁包头中声明的长度不符。2. 补丁包本身格式错误或损坏。 | 1. 核对补丁工具生成的二进制文件大小,与‘PTCd’发送的总字节数是否一致。2. 使用校验工具检查补丁包文件的CRC是否正确。确保传输过程中数据没有错位或丢失。 |
‘PTCd’任务返回TransferStatus: 0x02(未在期待补丁) | 在发送‘PTCd’数据之前,没有成功执行‘PTCs’任务,或者‘PTCs’任务执行失败。 | 1. 确认‘PTCs’任务已执行且返回成功状态。2. 在每次 ‘PTCd’前,确认上一个‘PTCd’任务已完成(CMDx=0)。 |
‘PTCc’任务后DevicePatchCompleteStatus为0x41(包头CRC不匹配) | 补丁包的头部数据在传输过程中出现错误,计算的CRC与包中存储的CRC不一致。 | 1. 检查生成补丁包的工具链版本是否与控制器ROM版本兼容。 2. 确保 ‘PTCd’传输过程中数据无误。可以尝试重传整个补丁包。3. 验证主机I2C驱动时序是否稳定,有无毛刺导致数据错误。 |
‘PTCc’任务后DevicePatchCompleteStatus为0x42(补丁与ROM版本不兼容) | 试图加载的补丁二进制文件不是为当前PD控制器的ROM版本编译的。 | 1. 确认你使用的补丁文件是否与芯片的硅版本(Silicon Revision)和固件版本完全匹配。 2. 联系芯片供应商获取正确的补丁文件。 |
‘PTCc’任务后DevicePatchCompleteStatus为0x43(补丁代码CRC不匹配) | 补丁代码部分(不包括包头)的CRC校验失败。 | 1. 补丁文件本身可能已损坏。 2. 传输过程中代码段数据出现错误。需要重新生成或获取补丁文件,并确保传输链路可靠。 |
‘PTCc’任务后AppConfigPatchCompleteStatus非零,或acFailCode指示错误 | 应用配置数据加载失败。常见原因有CRC错误、数据量超出SRAM分配、头版本不对等。 | 1. 根据acFailCode具体值排查:- 0x01: 检查配置头版本号。- 0x02: 检查应用配置数据大小是否超出限制。- 0x03: 应用配置数据CRC错误,检查配置生成过程和传输过程。 |
| 流程卡住,CMDx寄存器长时间不归零 | 1. I2C通信中断或控制器无响应。 2. 控制器在执行任务时遇到内部错误。 3. 供电不稳定。 | 1. 用逻辑分析仪抓取I2C波形,看是否有ACK缺失或总线挂死。 2. 尝试硬件复位PD控制器,重新开始整个流程。 3. 检查电源质量,确保在固件更新期间供电充足且稳定。 |
| 更新后系统行为异常 | 1. 补丁本身有Bug。 2. 应用配置数据配置错误(如错误的GPIO、电源参数)。 3. 新旧固件/配置不兼容。 | 1. 回滚到之前的已知稳定版本,确认问题是否由更新引起。 2. 仔细审查应用配置数据,特别是电源路径、PDO、保护阈值等关键参数。 3. 使用 ‘PTCq’和‘PTCr’任务,查询或重置当前补丁状态,尝试加载一个“空补丁”或默认配置看是否能恢复。 |
5.3 调试技巧与最佳实践
- 状态机是朋友:充分利用
‘PTCq’任务和‘PTCd’输出中的PatchStatus/PatchLoadingState。它们是你窥探控制器内部进度的窗口。在关键步骤前后查询状态,可以快速定位流程卡在哪个环节。 - 日志记录:在主机代码中,详细记录每个任务的发送、返回码、输出数据以及关键寄存器(如MODE)的值。当出现问题时,这份日志是无价的调试依据。
- 超时与重试:对每个需要轮询CMDx的操作(如任务执行、等待中断),一定要添加超时机制。如果超时,应进行错误处理(如复位控制器、重试流程),而不是永远等待。
- 电源完整性:固件更新过程,尤其是写Flash时,对电源噪声非常敏感。确保更新期间系统电源(特别是给PD控制器和EEPROM供电的电源)干净、稳定。
- 版本管理:严格管理补丁文件和应用配置数据的版本,并与硬件版本、控制器ROM版本绑定。在更新前,可以尝试通过
‘PTCq’查询当前运行的补丁版本,实现版本校验和防降级。 - 模拟测试:在批量更新前,务必在实验室环境下进行充分的边界测试:测试极长/极短的补丁包、测试传输过程中随机插入错误、测试突然断电后恢复上电的行为等。TPS26750A的这套任务系统虽然复杂,但设计严谨,理解其每一步的意图和反馈,就能构建出稳定可靠的固件更新方案。