【CH32X035评估板】--USB PD SNK
<p> 沁恒CH32X035C8T6支持USB PD功能。本篇主要讲述作为电源消耗端的SNK,可以应用在需要快充的产品设备上。</p><p>一.硬件评估及USB PD协议了解</p>
<p> 1.由原理图可看到与USB Type-C电源相接有一颗HT7533电压转换LDO,查看其手册资料如下。可知USB PD SNK(电源消耗端) <span style="color:#0000ff;">电压应小于其输入上限电压,即小于28V</span>.</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图1:USB PD SNK硬件受限电压</div>
<p>2.关于USB PD协议</p>
<p> USB PD协议的工作原理是利用Type-C接口的<strong><span style="color:#8e44ad;">CC线</span></strong>(配置通道线,用于识别、控制)作为数据线来协商电压、电流以及供电方向,整个通信过程需要按照特定的数据包格式,并且存在相互认证的过程。下图是USB Type C引脚定义。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图2:USB Type C 引脚</div>
<p> USB PD协议通过特定格式的数据包进行通信,数据包的格式如下所示。</p>
<div style="text-align: center;"> </div>
<div style="text-align: center;"></div>
<div style="text-align: center;">图3:USB PD协议格式</div>
<p> 一个完整的USB PD数据包由前导码(Preamble),使用场景码(SOP*所有的PD传输流程),功能码(MessageHeader),数据码(Byte0-n)、校验码(CRC)以及结束码(EOP数据包结束标志)组成,如果数据部分为空,说明数据包仅作为控制指令使用,称为控制消息。有数据内容的称为数据消息,通常数据消息里包含了要变化的电压值和电流值等信息。整个USB PD数据包中,除了前导码不需要进行4b5b编码外,数据包的其他部分均需要进行4b5b编码,指定数据经过4b5b编码后,数据包中所有数据都需要使用BMC编码之后才能通过CC发送。</p>
<p> 关于USB PD协议详细文本可在USB官网找到【1】,这里做一个整体了解。</p>
<p> </p>
<p>二.代码准备与测验</p>
<p>1.代码梳理与准备</p>
<p> WCH官方SDK已经集成USBPD_SNK和USBPD_SRC,本篇使用前者demo 进行梳理调试使用并测验。</p>
<p>PD_Init()对USB PD进行硬件初始化配置(包括D+,D-,CC1,CC2),PD_PHY_Reset( )对PD SNK初始化和PD_Rx_Mode()配置USB PD接收模式。在main函数(如下图)有定时器初始化,对USB PD初始化配置及PD_Det_Proc连接数据接收处理与PD_Main_Proc协议状态流程处理及接收数据协议解析处理等。官方SDK给出了PD协议完整方案代码,我们结合应用在适配的地方做些小的修改达到需求目的。</p>
<pre>
<code>int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SystemCoreClockUpdate();
Delay_Init();
USART_Printf_Init(115200);
printf( "SystemClk:%d\r\n", SystemCoreClock );
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf( "PD SNK TEST\r\n" );
PD_Init( );
TIM1_Init( 999, 48-1);
while(1)
{
/* Get the calculated timing interval value */
TIM_ITConfig( TIM1, TIM_IT_Update , DISABLE );
Tmr_Ms_Dlt = Tim_Ms_Cnt - Tmr_Ms_Cnt_Last;
Tmr_Ms_Cnt_Last = Tim_Ms_Cnt;
TIM_ITConfig( TIM1, TIM_IT_Update , ENABLE );
PD_Ctl.Det_Timer += Tmr_Ms_Dlt;
if( PD_Ctl.Det_Timer > 4 )
{
PD_Ctl.Det_Timer = 0;
PD_Det_Proc( );
}
PD_Main_Proc( );
}
}</code></pre>
<p> USBPD_IRQHandler接收PD数据并做即时应答。PD_Detect( )为CC数据握手判断是否连接。在PD_Main_Proc里有一个很匹配应用的就是在确认连接后电压<span style="color:#0000ff;"><strong>请求函数PDO_Request,</strong></span>入参查资料初步了解是1--5V,2--9V,3--12V,4--15V,5--20V,供参考。在初始化及PD_Main_Proc用到了SrcCap_Ext_Tab,Status_Ext_Tab等协议数据配置。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图4:USB PD SNK电压请求</div>
<p>2.测试 </p>
<p> 选择充电头,可查看充电头上适配电压信息,最好能确认充电头有兼容USB PD协议。烧录好程序后,断电,充电头接USB Type C线到开发板,测量VBUS1与GND之间电压。按上配置测的结果如下图。(受限做此实验时手头只有一个杂牌充电器,后续看情况更新多测几组)</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图5:USB PD SNK电压测量</div>
<p> </p>
<p> 通过此次实践,对USB PD电力传输功能有了更进一步了解,此功能可用在快充等产品上,是一个很好的方案选择,值得推荐。</p>
<p> </p>
<p>【1】 USB PD协议</p>
<p> <a href="https://www.usb.org/document-library/usb-power-delivery" target="_blank">https://www.usb.org/document-library/usb-power-delivery</a></p>
<p> </p>
<p> </p>
<p> </p>
<p> 因所需硬件准备齐全,做些如下补充:</p>
<p> </p>
<p><strong><span style="color:#c0392b;">硬件准备</span></strong></p>
<p> <strong><span style="color:#0000ff;"><span style="background-color:#ffffcc;">做此开发板USB PD SNK测验,需要带USB Type C接口支持PD的充电头,另外也需要双USB Type C公头线。</span></span></strong>实物如下图。(用Type C转USB A口是不可以的)</p>
<div style="text-align: center;"></div>
<div style="text-align: center;"><span style="color:#0000ff;">USB Type-C PD 充电头</span></div>
<p> </p>
<div style="text-align: center;"></div>
<div style="text-align: center;"><span style="color:#0000ff;">双头USB Type-C线</span></div>
<p><strong><span style="color:#c0392b;"> 测验:</span></strong></p>
<p> PDO_Request( PDO_INDEX_2);时,测得输出电压9V,如下图</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">请求获得9V电压</div>
<p> PDO_Request( PDO_INDEX_3);时,测得输出电压12V,如下图</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">请求获得12V电压</div>
<p> </p>
<p> 经测验,开发板USB PD可请求调节电压,达到预期功能。</p>
<p> </p>
<div style="text-align: center;"> </div>
页:
[1]