USB Type-C拓展DisplayPort and USB2.0(基于PD通讯)

news/2025/2/16 0:44:15/

我们的电脑现在大多都只有一个Type-C端口,不能挂载多余的外设,为了解决这一问题,便产生了Type-C扩展坞。拓展坞是常用于笔记本电脑的一种外置设备,可以扩展、丰富笔记本的外接端口,使得笔记本可以连接多个外置设备(例如显示器、U盘、SD卡、TF卡、投影仪等)。
说到Type-C拓展坞就不得不提及USB PD,想必大家一听到USB PD都会下意识想到PD快充,实际上USB PD还有Alternate Mode等拓展功能,并且是Type-C拓展坞最核心的知识点。下面便基于CH543D进行了拓展设计,实现单口Type-C转Display Port口和USB 2.0口(简易版),效果演示如下:

CH543D拓展坞方案的数据协商过程是在USB PD快充的基础上增加了VDM的数据处理,同样是在CC线上进行(确定主机端和设备端)。通过VDM协商后,便能实现单口Type-C转Display Port和USB 2.0,具体的协商过程如下:

1、上图为USB PD快充的协议流程(相关解析请查阅上篇文章)。当PD快充在CC线上完成后,主机将会对设备发送VDM类请求,如下图:

上图为VDM协商的具体流程,相关解析如下:
1、主机会先发送 Disc IDENT类请求(0xff008001/0xff00A001),设备进行响应回复Good CRC和ACK(0xff008041/0xff00A001)。
2、主机收到ACK响应后回复Good CRC,然后进行下一步请求Disc SVID(0xff008002/0xff00A002),设备进行响应回复Good CRC和ACK(0xff008042/0xff00A042)。
3、主机收到ACK响应后回复Good CRC,然后进行下一步请求Disc Mode(0xff018003/0xff01A003),设备进行响应回复Good CRC和ACK(0xff018043/0xff01A043)。
4、主机收到ACK响应后回复Good CRC,然后进行下一步请求Enter Mode 1(0xff018104/0xff01A104),设备进行响应回复Good CRC和ACK(0xff018144/0xff01A144)。
5、主机收到ACK响应后回复Good CRC,然后进行下一步请求DP Stat POS 1(0x ff018110/0x ff01A110),设备进行响应回复Good CRC和ACK(0xff018150/0xff01A150)。
6、主机收到ACK响应后回复Good CRC,然后进行下一步请求DP Configure POS 1(0x ff018111/0x ff01A111),设备进行响应回复Good CRC和ACK(0xff018151/0xff01A151)。

            
 基本的协议架构参考上述,下面开始进行实践,硬件采用的是:“沁恒微电子”的CH543D芯片,CH543D 内置了 USB Power Delivery 控制器和 PD BMC PHY 收发器,支持 USB type C、BC、PD2.0、PD3.0、PPS,还支持 12V 高压电源。PD通讯时需要的BMC编解码、4B5B编解码、CRC校验也都有集成,这样的话使用CH543来实现USB PD通讯是比较简单的。
在原理图中使用了Type-C公口,并在端口出外加1.2K下拉电阻做E-mark处理(CH543内置5.1K下拉电阻和外置1.2K下拉电阻并联后为1K下拉电阻,E-mark处理可提升兼容性),若使用Type-C母口,需做正反插检测处理(差分信号需要进行切换)。
原理图中USB 2.0母口和Type-C母口直接相连,通过USB PD协议沟通确认数据的主从关系后,便可以实现一个USB 2.0通讯接口(本文为拓展坞的简易版,只采用了USB 2.0。感兴趣的小伙伴可以尝试升级为USB 3.0通讯口)。
另外,值得注意的是原理图中采用了多组差分线,可以有效的保证视频传输时的稳定和高效性。另外Display Port拉电阻的处理是重点,并做了HPD检测处理。为了达到节约成本的同时提高性能,在应用中增加了USB 2.0母口,同时省略了一个Type-C下载母口(图中Type-C下载用JP1排针进行代替),如此一来就能实现拓展坞的基本功能。

VDM消息包含:Header + VDM Header + 消息内容,在VDM消息中:Header下的Message Type都是一致的为:0x0f只能判断消息是否属于VDM,不能区分VDM的具体类型(如下图)。

VDM消息包含:Header + VDM Header + 消息内容,在VDM消息中:Header下的Message Type都是一致的为:0x0f只能判断消息是否属于VDM,不能区分VDM的具体类型(如下图)。
为了能区分VDM的具体数据类型,所以在工程中增加了解析VDM Header的结构体:_VDM_Hdr_Struct。结构体中的Command可以用来区分VDM具体类型,代码如下:

typedef struct  {UINT16 ModeIndex:3;UINT16 :2;UINT16 SVDMVer:2;UINT16 StructuredVDM:1;UINT16 Command:5;UINT16 :1;UINT16 CommandType:2;UINT16 SVIDH8:8; //00 ffUINT16 SVIDL8:8;
} _VDM_Hdr_Struct;
typedef union {_VDM_Hdr_Struct  VDMHdrStruct;UINT8 VDMHdrData[4];
} _Union_VDM_Hdr;

 VDM数据类型可以区分后,下面来讲解VDM通讯流程。前面有提及VDM是基于USB PD快充的(有关USB PD快充的知识点,请参考“上篇文章”),接下来将会围绕着VDM进行讲解。因为VDM接收/发送的消息“相对固定”,所以在工程中用数组方式进行了固定处理,代码如下:


/*       VDM       */
UINT8C  ACK_Disc_Ident[ ] = 
{0xc9,0x1f,0x00,0x6c,0xa8,0x5e,0x02,0x00,0x10,0x01,0x02,0x50,0xdb,0x00,0x00,0x11	
};
UINT8C  ACK_Disc_SVID[ ] = {0x00,0x00,0x01,0xff};
/* 四线,仅支持模式C */
#if 0//VDM 模式列表
UINT8C  ACK_Disc_Mode[ ] = {0x05,0x04,0x00,0x00};
//VDM DP状态
UINT8C  ACK_DP_Stat_Pos_1[ ] ={0x0a,0x00,0x00,0x00};
#else
/* 两线,支持C D模式,prefer D模式 */
UINT8C  ACK_Disc_Mode[ ] = {0x05,0x0C,0x00,0x00};
UINT8C  ACK_DP_Stat_Pos_1[ ] = {0x1a,0x00,0x00,0x00};
#endif
UINT8C DPAttention_Table[ ] =                                                //VDM DP拔插状态
{0x06,0x81,0x01,0xff,0x8a,0x00,0x00,0x00
};
UINT8C DPAttention_Table_1[ ] =                                                //VDM DP拔插状态
{0x06,0x81,0x01,0xff,0x0a,0x00,0x00,0x00
};

接下来严格按照VDM的协商流程(参考VDM协商流程图),完成相关通讯。软件如下:

Recv2 = Union_Header->HeaderStruct.SpecRev;
Union_VDM_Hdr = (_Union_VDM_Hdr *)&PD_RX_BUF[2];switch(Union_VDM_Hdr->VDMHdrStruct.Command)
{
case 1:
MsgID++;
PD_PHY_STAT.SendingACK_Disc_Ident = 1;	
break;
case 2:
MsgID++;
PD_PHY_STAT.SendingACK_Disc_SVID = 1;	
break;
case 3:
MsgID++;
PD_PHY_STAT.SendingACK_Disc_Mode = 1;
break;
case 4:
MsgID++;
PD_PHY_STAT.SendingACK_Enter_Mode = 1;
break;case 16:
PD_PHY_STAT.SendingACK_DP_Stat_Pos_1 = 1;MsgID++;
break;
case 17:
PD_PHY_STAT.SendingACK_DP_Configure_Pos_1 = 1;
MsgID++;
break;		
}	

 至此CH543D的VDM操作就结束了,通过以上操作便可以实现单口Type-C转Display Port口和USB 2.0口,感兴趣的小伙伴可以在此基础上继续升级改造(例如USB 3.0、U盘、SD卡、TF卡、投影仪等)。附件是硬件、软件资料,小伙伴们可以按需下载。

教你轻松实现C转DP和USB2.0(开源资料) - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛


http://www.ppmy.cn/news/524546.html

相关文章

display详解

css中的display属性 display属性是我们在前端开发中常常使用的一个属性,其中,最常见的有: noneblockinlineinline-blockinherit 下面,我将按照顺序将上述几种属性做一个完整的讲解。 第一部分:display:none none这个…

DisplayPort--Link training之Channel Equalization (EQ)

目录 前言 EQ training介绍 EQ training流程 EQ训练注意事项 前言 Channel Equalization(EQ)training是为了信道均衡/符号锁定/通道间对齐(Channel Equalization / Symbol-Lock / Inter-lane Alignment)。 EQ训练之前&#…

Display Port 1.4 link Training 过程

最近遇到2个DP link training失败的问题,问题解决后本想写一篇Link Training的总结,发现自己可写的东西比较少,现将网络上比较好的笔记总结如下,供以后遇到问题的同学参考。 目录 DP link training 重要的资料来源 Ref Chapter…

Display port

Display Port Mainlink:单向主链接,高带宽,低latency(延迟)通道来传输同步数据如未压缩视频和音频数据; AUX CH:专门的控制管理总线,辅助传输通道,半双工,双向通道,一个主要的线路控制Main Link management和一个设备控制总线li…

RK3588平台开发系列讲解(DisplayPort篇)DP相关模式说明

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、DP Alt Mode二、DP Legacy Mode2.1、Controller2.2、PHY三、Split Mode沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍DP的相关模式。

DisplayPort 端口

现在很多显卡都提供了对 DisplayPort 端口的支持,我开始还不重视,但是发现这个东西大有来头,隐隐有超越hdmi的架势。 如果想了解更多,我们来看看视频传输接口的发展史。 显示器作为计算机的必要部分,大大的增强了计算…

DP1.4 (DisplayPort)相关测试

什么是DisplayPort接口? DisplayPort(简称DP)是一个由计算机及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准,主要用于视频源与显示器等设备的连接,并支持携带音频、U…

DisplayPort--Link training之Clock Recovery (CR)

前言 之前,在芯片原厂搞过这个,把知道的分享给大家(其实就是帮大家翻译下协议!!) 介绍 DisplayPort(DP-1.2)的Clock Recovery(CR)是TX和RX建立同步的第一道…