86 lines
2.5 KiB
Plaintext
86 lines
2.5 KiB
Plaintext
冠达快充板(SOURCE)通讯协议
|
||
|
||
2025.9.25
|
||
|
||
SOURCE的ID为2,波特率200K,TTL
|
||
|
||
1.读取数据
|
||
发送:
|
||
0B 00 02 20 volh voll curh curl nc nc CRC8
|
||
//长度+nc+id+指令+2字节当前电源电压(mV)+2字节当前电源电流(mA)+2个预留字节+CRC8校验
|
||
回复:
|
||
15 00 02 20 VH VL setvh setvl setch setcl NC NC verh verl NC NC NC NC NC NC CRC8
|
||
//长度+nc+ID+指令+2字节读取的电压(0.01V)+2字节source设置电压(mV)+2字节source设置电流(mA)+2字节预留+2字节版本号+6字节预留+CRC8校验
|
||
|
||
|
||
2.读取source的PD协议数据(当前为PDO,PPS,PD3.1,AVS协议时有效,不需要一直读,暂未实现)
|
||
发送:05 00 02 13 2A
|
||
回复:
|
||
XX 00 02 13 //长度(根据实际计算)+NC+ID+指令
|
||
00 00 VMINH VMINL VMAXH VMAXL CURH/PORH CURL/PORL NC NC NC NC NC NC
|
||
//源类型(1字节,00为PDO,03为APDO) + PPS类型(1字节,源类型为3时有效,00为SPR PPS,01为EPR AVS,02为SPR AVS) + 最小电压(2字节,mV) + 最大电压(2字节,mA) + 最大电流/功率(2字节,mA/W,EPR_AVS时为功率) + 预留(6字节,当协议类型为02时有效,意义与前6字节一致)
|
||
00 00 VMINH VMINL VMAXH VMAXL CURH/PORH CURL/PORL NC NC NC NC NC NC
|
||
......
|
||
CRC8
|
||
|
||
|
||
3.设置CC线电平
|
||
发送:
|
||
06 00 02 16 00 2A //长度+nc+id+指令+电平等级(0xff为根据当前电流自动设置,否则为手动设定,设置方法待定)+CRC8校验
|
||
回复:
|
||
05 00 02 16 2A //长度+nc+id+指令+CRC8校验
|
||
|
||
|
||
4.设置支持的快充协议
|
||
(PDO和PD3.1固定档位最大电压和最小电压设为一样)
|
||
发送:
|
||
XX 00 02 D0 //长度(根据实际计算)+NC+ID+指令
|
||
00 //协议(1字节)
|
||
00 00 VMINH VMINL VMAXH VMAXL CURH CURL NC NC NC NC NC NC
|
||
//源类型(1字节,PD协议有效,00为PDO,03为APDO) + PPS类型(1字节,PD协议有效,源类型为3时有效,00为SPR PPS,01为EPR AVS,02为SPR AVS) + 最小电压(2字节,mV) + 最大电压(2字节,mA) + 最大电流(2字节,mA) + 预留(6字节,当协议类型为02时有效,意义与前6字节一致)
|
||
00 00 VMINH VMINL VMAXH VMAXL CURH/PORH CURL/PORL NC NC NC NC NC NC
|
||
......
|
||
CRC8
|
||
回复:
|
||
05 00 02 D0 CRC8
|
||
|
||
协议字节含义如下:
|
||
00 无快充
|
||
01 VIFC(暂不支持)
|
||
02 FCP
|
||
03 SCP
|
||
04 预留
|
||
05 预留
|
||
06 RFC(暂不支持)
|
||
07 QC3.0
|
||
08 QC2.0
|
||
09 AFC
|
||
0A PDO/PPS
|
||
0B 预留
|
||
0C UFCS
|
||
0D PD3.1/AVS
|
||
0E VOOC(暂不支持)
|
||
|
||
|
||
CRC8校验算法如下:
|
||
|
||
u8 get_crc(u8 *dat,u8 k)
|
||
{
|
||
u8 i,res;
|
||
res=0x55;
|
||
for(i=0;i<k;i++){ res=crc8(res,dat[i]);}
|
||
return res;
|
||
}
|
||
|
||
u8 crc8(u8 res,u8 dat)
|
||
{
|
||
u8 i,t;
|
||
for(i=0;i<8;i++)
|
||
{
|
||
t=dat^res;
|
||
if((t&0x01)==0x01){res=res^0x18;res>>=1;res|=0x80;}//
|
||
else{res>>=1;}
|
||
dat>>=1;
|
||
}
|
||
return res;
|
||
} |