虽然写了好几篇CH32X035的测评了,但是CH32X035给我的印象主要卖点还是USB PD快充协议。 不管是作为SNK还是作为SRC,官方都给出了demo例程,为第一次接触USB PD开发的提供了便利。
DEMO工程中的PD_Process.c和PD_Process.h是协议的核心内容。 通过编译SNK例程进行烧写后,接入uasrt1可以看到SystemClk和ChipID的打印信息,并且启动PD SNK TEST。
通过type-C接入电源适配器可以看到SRC Connect的打印信息。 我的是: SystemClk:48000000 ChipID:03510601 PD SNK TEST CC1 SRC Connect 根据需要要改一下打印的串口波特率,默认的不记得了,我改成的是115200,要跟PC端打印软件一致就好。
在PD_Process.h中的 #define PDO_INDEX_1 1 #define PDO_INDEX_2 2 #define PDO_INDEX_3 3 #define PDO_INDEX_4 4 #define PDO_INDEX_5 5 可以修改请求电压,可以根据实际供电需求来选择。并且通过打印的串口1可以显示请求的电流和电压参数。 void PDO_Request( UINT8 pdo_index )
{
UINT16 Current,Voltage;
UINT8 status;
if ((pdo_index > PDO_Len) || (pdo_index == 0))
{
while(1)
{
printf("pdo_index error!\r\n");
Delay_Ms(500);
}
}
else
{
memcpy( &PD_Rx_Buf[ 2 ], &Adapter_SrcCap[ 4*(pdo_index-1) + 1 ], 4 );
PD_PDO_Analyse( 1, &PD_Rx_Buf[ 2 ], &Current, &Voltage );
printf("Request:\r\nCurrent:%d mA\r\nVoltage:%d mV\r\n",Current,Voltage);
PD_Load_Header( 0x00, DEF_TYPE_REQUEST );
PD_Rx_Buf[ 5 ] = 0x03;
PD_Rx_Buf[ 5 ] |= pdo_index<<4;
PD_Rx_Buf[ 3 ] = PD_Rx_Buf[ 3 ] & 0x03;
PD_Rx_Buf[ 3 ] |= ( PD_Rx_Buf[ 2 ] << 2 );
PD_Rx_Buf[ 4 ] = PD_Rx_Buf[ 3 ];
PD_Rx_Buf[ 4 ] <<= 2;
PD_Rx_Buf[ 4 ] = PD_Rx_Buf[ 4 ] & 0x0C;
PD_Rx_Buf[ 4 ] |= ( PD_Rx_Buf[ 2 ] >> 6 );
}
status = PD_Send_Handle( &PD_Rx_Buf[ 2 ], 4 );
if( status == DEF_PD_TX_OK )
{
PD_Ctl.PD_State = STA_RX_ACCEPT_WAIT;
}
else
{
PD_Ctl.PD_State = STA_TX_SOFTRST;
}
PD_Ctl.PD_Comm_Timer = 0;
PD_Ctl.Flag.Bit.PD_Comm_Succ = 1;
}
对于会遇到有快充协议需求的产品开发,个人觉得CH32X035是个不错的选择,毕竟通过例程开发起来比较简单。
|