前言

       上篇文章简述了CH224Q/A的基本用法,CH224Q/A使用电阻配置时可以进行IIC控制,较为复杂的部分还是对数据寄存器的解析。

        在0X60~0X8F寄存器中保存着电源数据,当请求28V时会进入EPR模式,此时保存的数据为EPR Source Cap的部分数据,请求其他挡位电压保存的则是完整的SPR Source Cap。(上篇文章有提及)。


本文主要讲述解析SPR Source Cap相关部分,并且具体解析需要参考USB-PD官方文档

若想快速上手且了解PD协议 可以从
第三章开始观看

一、PD协商基础流程

        文字描述协商流程过于繁琐,会使用户看的一知半解,本章会用两种抓包方式来展示最基本的PD协商过程

Power-Z抓包

工具:Powerz KM003C   、 Power-Z上位机(Power-Z Lab 2.4) 

        截取部分为最基础的PD协商流程。可以看出,每一行代表一个协议包,并可以清楚得知每个包是由哪一端发送、VBUS/IBUS 以及 Data等信息。

逻辑分析仪抓包

工具:DSLogic U2Basic   、 DS View上位机 

整体:

放大后:

        开解码器后可以得知每包消息的具体内容以及波形等,相比Power-Z更精确,但没有Power-Z方便。同学们可以根据需求选择合适的抓包方式来进行调试

二、数据包格式

        截取一段逻辑分析仪抓来的Source Cap,发现解码器已将这包消息分成了若干片段

接下来可以参考USB-PD官方手册来获取这些片段表示什么信息

        可以看出,PD 电源数据包格式 一般是Preamble+SOP+Header+Data+CRC+EOP

可把此数据包分为物理层协议层两部分。

PHY Layer(物理层)

Preamble 

          由64位交替0 1构成,由0开始1结尾。这个段用于频率对齐等功能,暂且不理会

SOP(Start of Packet Sequences)

        由四个Key-Code组成。

    

  

CRC 

        CRC应当紧接在数据包之后,消息头和数据应采用 32 位循环冗余校验码进行保护。

EOP(End Of Packet)

        结束包(可提前强制结束数据包)

Protocol Layer(协议层)

Message Header

        每条消息都应该由Message Header开始 我们把他叫做消息头,头包含有关该消息的基本消息以及PD端口功能

Data Objects

        以下仅列出Fixed 与 PPS的消息内容

三、分析SPR Source Cap

回到刚刚抓到的包可以看出协议层部分包含了 1个头 、 5个Fixed +1个PPS 。 

将此Source Cap分成两部分逐位分析

并且将以上内容与刚刚抓到的Source Cap包联系起来,绘制出一个表格使其更直观

Header+Fixed

此图表将每一位表达的内容以及作用注释了出来,在后续的解析可以参考这个表格

PPS 

四、解析CH224Q/A 数据寄存器 

        上篇文章读取过CH224Q/A在数据寄存器中保存的SPR Source Cap(与本篇文章相同的测试环境)

与SPR Source Cap数据一一对应,用户可以根据第三章内容来进行解析。

附上屎码(仅供参考,上一篇完整工程CV下来的一部分):

// .h 
typedef struct
{
    _I2C_status_typedef I2C_status;  //别管 
    u8 vol_status;//别管
    u8 current_status;//别管
    u8 AVS_H;//别管
    u8 AVS_L;//别管
    u8 PPS_ctrl;//别管
    u8 PD_data[48]; //IIC读取到的数据
}_CH224Q_typedef;

//Header
typedef union
{
    struct
    {
        u8  MsgType: 5;
        u8  PDRole: 1;
        u8  SpecRev: 2;
        u8  PRRole: 1;
        u8  MsgID: 3;
        u8  NumDO: 3;
        u8  Ext: 1;
    }Message_Header;
    u16 Data;
}_Message_Header;

//Fixed Supply PDO - Source
typedef union
{
    struct
    {
        u32 MaxCurrent:10;
        u32 Voltage:10;
        u32 PeakCurrent:2;
        u32 Reserved:1;
        u32 EPRModeCap:1;
        u32 Unchunked:1;
        u32 DualRoleData:1;
        u32 USBComCap:1;
        u32 UnconstrainedPWR:1;
        u32 USBSuspendSupported:1;
        u32 DualRolePWR:1;
        u32 FixedSupply:2;
    }bit;
    u32 Data;
}_FixedSupply;

//SPR Programmable Power Supply APDO – Source
typedef union
{
    struct
    {
        u32 MaxCurrent:7;
        u32 Reserved1:1;
        u32 MinVoltage:8;
        u32 Reserved2:1;
        u32 MaxVoltage:8;
        u32 Reserved3:2;
        u32 PPSPWRLimited:1;
        u32 PPS:2;
        u32 APDO:2;
    }bit;
    u32 Data;
}_PPSupply;
//.c

_FixedSupply        Rx_FixedSupply;
_PPSupply           Rx_PPSupply;

//PD_Msg为PD电源挡位信息  PD_Msg[x][0]:(1: Fixed,     2: PPS,        )//
//                       PD_Msg[x][1]:(Fixed:电压,   PPS:挡位最小电压)//
//                       PD_Msg[x][2]:(Fixed:电流,   PPS:挡位最大电压)//
//                       PD_Msg[x][3]:(Fixed:X,      PPS:电流,      )//
u16 PD_Msg[10][4];

void SPR_SourceCap_Analyse()
{
    memcpy( &Rx_Header.Data, &CH224Q.PD_data[0], 2 );
       for(u8 i=0;i<Rx_Header.Message_Header.NumDO;i++)//循环NDO次
        {
            memcpy( &Rx_FixedSupply.Data, &CH224Q.PD_data[4*i+2], 4 );
            if(Rx_FixedSupply.bit.FixedSupply==3) //检测是否为PPS
            {
                memcpy( &Rx_PPSupply.Data, &Rx_FixedSupply.Data, 4 );
                PD_Msg[i][0]=2;
                PD_Msg[i][1]=Rx_PPSupply.bit.MinVoltage*100;
                PD_Msg[i][2]=Rx_PPSupply.bit.MaxVoltage*100;
                PD_Msg[i][3]=Rx_PPSupply.bit.MaxCurrent*50;
                continue;
            }
           //Fixed
            PD_Msg[i][0]=1;
            PD_Msg[i][1]=Rx_FixedSupply.bit.Voltage*50;
            PD_Msg[i][2]=Rx_FixedSupply.bit.MaxCurrent*10;
            PD_Msg[i][3]=0;
        }
    
}

参考资料:

USB Power Delivery | USB-IF
TYPE-C接口PD供电协商过程 - USB中文网
PD供电能力Source_Capabilities消息格式及数据分析 - USB中文网


Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐