dirty 发表于 2024-1-20 23:09

【CH32X035评估板】--USB PD SNK

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;沁恒CH32X035C8T6支持USB PD功能。本篇主要讲述作为电源消耗端的SNK,可以应用在需要快充的产品设备上。</p>

<p>一.硬件评估及USB PD协议了解</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.由原理图可看到与USB Type-C电源相接有一颗HT7533电压转换LDO,查看其手册资料如下。可知USB PD SNK(电源消耗端)&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB PD协议通过特定格式的数据包进行通信,数据包的格式如下所示。</p>

<div style="text-align: center;">&nbsp;</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图3:USB PD协议格式</div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个完整的USB PD数据包由前导码(Preamble),使用场景码(SOP*所有的PD传输流程),功能码(MessageHeader),数据码(Byte0-n)、校验码(CRC)以及结束码(EOP数据包结束标志)组成,如果数据部分为空,说明数据包仅作为控制指令使用,称为控制消息。有数据内容的称为数据消息,通常数据消息里包含了要变化的电压值和电流值等信息。整个USB PD数据包中,除了前导码不需要进行4b5b编码外,数据包的其他部分均需要进行4b5b编码,指定数据经过4b5b编码后,数据包中所有数据都需要使用BMC编码之后才能通过CC发送。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于USB PD协议详细文本可在USB官网找到【1】,这里做一个整体了解。</p>

<p>&nbsp;</p>

<p>二.代码准备与测验</p>

<p>1.代码梳理与准备</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 &gt; 4 )
      {
            PD_Ctl.Det_Timer = 0;
            PD_Det_Proc( );
      }
      PD_Main_Proc( );
    }
}</code></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.测试&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择充电头,可查看充电头上适配电压信息,最好能确认充电头有兼容USB PD协议。烧录好程序后,断电,充电头接USB Type C线到开发板,测量VBUS1与GND之间电压。按上配置测的结果如下图。(受限做此实验时手头只有一个杂牌充电器,后续看情况更新多测几组)</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图5:USB&nbsp; PD SNK电压测量</div>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过此次实践,对USB PD电力传输功能有了更进一步了解,此功能可用在快充等产品上,是一个很好的方案选择,值得推荐。</p>

<p>&nbsp;</p>

<p>【1】 USB PD协议</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</p>

<p>&nbsp;</p>

dirty 发表于 2024-1-24 21:02

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;因所需硬件准备齐全,做些如下补充:</p>

<p>&nbsp;</p>

<p><strong><span style="color:#c0392b;">硬件准备</span></strong></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;</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;">&nbsp;测验:</span></strong></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO_Request( PDO_INDEX_2);时,测得输出电压9V,如下图</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">请求获得9V电压</div>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO_Request( PDO_INDEX_3);时,测得输出电压12V,如下图</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">请求获得12V电压</div>

<p>&nbsp; &nbsp; &nbsp; &nbsp;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经测验,开发板USB PD可请求调节电压,达到预期功能。</p>

<p>&nbsp;</p>

<div style="text-align: center;">&nbsp;</div>
页: [1]
查看完整版本: 【CH32X035评估板】--USB PD SNK