CH224Q/A-数据寄存器解析(一)
CH224Q/A 解析数据寄存器
前言
上篇文章简述了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中文网
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)