使用PD协议分析仪调试Type-C PD兼容性

Type-C PD协议目前已经大量用于手机/PC等数码产品,但由于各家设备厂商在PD接口设计的时候做了一些定制化,导致在与第三方配件匹配的过程中,经常有不兼容的情况发生。比如说最常见的充电器,常常出现第三方充电器无法充电的情况,或者只能使用5V充电,无法进入快充。这就给充电器的生产厂家带来很大的麻烦,不知道问题出在哪里。
为了更加有效开发和准确验证基于控制流程的协议沟通,使用PD协议分析抓取CC线上的数据包是非常有必要的。某宝上有一款非常廉价的PD协议分析仪,可以兼容Cypress原厂的CY4500工具,通过USB接口将抓取到的协议包发送到主机端,通过上位机软件EZ-PD Analyzer Utility解码并显示PD协议包。不仅可以实时显示并解析PD通信包,而且还实时测量电力传输过程中的电压和电流值,进而缩短了开发周期,对于调试以及兼容性测试帮助非常大。
某宝上买的协议分析仪

充电器软件的PD协议控制流程图
图 1 充电器软件的PD协议控制流程图

本文利用PD协议分析仪记录了充电过程中的标准PD协商供电以及私有化充电通信过程,如图 2所示,而在此过程中CC电平和VBUS电压变化情况图 3所示。首先作为供电方的充电器广播供电能力(Source Capability)5V/3A, 9V/2.7A和12V/2A,手机回复供电请求(Request),选择9V,随后充电器回复接受信息(Accept),并且将电压调整至9V,发送供电准备好信息(PS_RDY)。可以从Vbus(mv)一栏,看出在整个协商通信过程中的电压变化情况,发送PS_RDY时,电压已经调整至9V。标准PD协商供电之后,本位采用加密的非结构化的定制化信息(Unstructured VDM)进行私有化验证,验证通过之后手机端发起数据角色交换的指令(DR_SWAP),从而成为数据主设备,再发送调节电压电流指令,完成高效的充电策略。
协议分析仪抓取的充电器供电协商通信过程的PD协议
图 2 协议分析仪抓取的充电器供电协商通信过程的PD协议

充电器的PD供电协商波形
图 3 充电器的PD供电协商波形

可以看到使用协议分析仪对CC线的通讯协议数据做监测,能使调试变得清晰可控,大大加速找到兼容性问题原因的过程。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个更加详细的PD3.0协议的初始化Type-C控制器C语言代码示例: ```c // 定义Type-C控制器状态 typedef enum { CONTROLLER_ACTIVE, CONTROLLER_INACTIVE, CONTROLLER_ERROR } controller_state_t; // 定义Type-C控制器模式 typedef enum { USB_PD_MODE, USB_TYPE_C_MODE, USB_TYPE_C_ALT_MODE } controller_mode_t; // 定义Type-C控制器事件 typedef enum { INSERT_EVENT, REMOVE_EVENT, ERROR_EVENT } controller_event_t; // 定义Type-C控制器协议版本 typedef enum { PD_2_0, PD_3_0 } controller_protocol_version_t; // 定义Type-C控制器消息格式 typedef enum { PD_MESSAGE_FORMAT, VDM_MESSAGE_FORMAT } controller_message_format_t; // 初始化Type-C控制器 void init_type_c_controller() { // 配置控制器支持的电压和电流 set_controller_voltage(5V); set_controller_current(3A); // 配置控制器寄存器 set_controller_mode(USB_PD_MODE); set_controller_state(CONTROLLER_ACTIVE); // 配置控制器的中断和事件处理 enable_controller_interrupt(INSERT_EVENT); enable_controller_interrupt(REMOVE_EVENT); register_controller_event_handler(controller_event_handler); // 配置控制器的数据格式和协议处理能力 set_controller_protocol_version(PD_3_0); set_controller_message_format(PD_MESSAGE_FORMAT); } // Type-C控制器事件处理函数 void controller_event_handler(controller_event_t event) { switch (event) { case INSERT_EVENT: // 处理插入事件 break; case REMOVE_EVENT: // 处理拔出事件 break; case ERROR_EVENT: // 处理异常事件 break; default: break; } } // 设置控制器支持的电压 void set_controller_voltage(int voltage) { // 设置控制器电压 } // 设置控制器支持的电流 void set_controller_current(int current) { // 设置控制器电流 } // 设置控制器模式 void set_controller_mode(controller_mode_t mode) { // 设置控制器模式 } // 设置控制器状态 void set_controller_state(controller_state_t state) { // 设置控制器状态 } // 启用控制器中断 void enable_controller_interrupt(controller_event_t event) { // 启用控制器中断 } // 注册控制器事件处理函数 void register_controller_event_handler(void (*handler)(controller_event_t)) { // 注册控制器事件处理函数 } // 设置控制器协议版本 void set_controller_protocol_version(controller_protocol_version_t version) { // 设置控制器协议版本 } // 设置控制器消息格式 void set_controller_message_format(controller_message_format_t format) { // 设置控制器消息格式 } ``` 在这个示例中,我们定义了一些枚举类型,包括Type-C控制器的状态、模式、事件、协议版本、消息格式等。然后,我们实现了一些函数,包括初始化Type-C控制器、事件处理函数、设置控制器参数等。这些函数可以调用Type-C控制器的API来实现具体的功能,比如设置电压、电流、模式等,启用中断,注册事件处理函数等。最终,我们得到了一个可以支持PD3.0协议Type-C控制器。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值