提到快充协议都会想到USB PD快充,实际市面上还有很多主流的快充协议,比如华为的FCP、SCP,三星的AFC,OPPO的VOOC,高通的QC,VIVO的Flash Charge等……,如此之多的快充协议该如何来辨别?相信很多电粉和相关的开发人员应该都知道PowerZ这款性能强悍的诱骗产品,支持QC2.0、QC3.0、VOOC、SCP、SSCP、PD等协议的触发。本期将使用CH543制作一个简易版的诱骗器Power Low。

以上是利用CH543设计的简易版电路原理图,可通过DM、DP、CC来实现主要的诱骗功能,通过DM、DP来触发QC、AFC、FCP等协议,通过CC触发PD协议。屏幕显示采用SPI驱动的TFT:ST7735S(占用片外和片内资源,后续将更换成I2C驱动的屏)。设计中还使用了Power Z一样的三档拨轮开关,用来选择档位和功能操作等。整体电路设计下来参考价格在15元左右,主要是TFT比较贵,不然可以将成本压缩在10元以内。
因为某些快充协议属于私有协议,处于未公开状态,第三方需要取得授权才可以使用,所以本次将围绕USB PD快充的诱骗触发来讲解。首先诱骗器的定位是Sink受电端,所以CC引脚上必须要有5.1K的下拉电阻,才能让Source供电端进行识别送电。系统默认请求5V电压,可通过三挡拨轮开关进行选择Fixed或者PPS,同时可以调节选择请求不同的电压。具体的实物效果如下:

很Power Low  Low  Low  Low  Low ……

以下为PD通讯协商过程,利用PD中断来解析Source发送的协议包,收到SourceCap包时会将具体内容进行缓存在PDO_BUF中:

/*******************************************************************************
* Function Name  : PD_PHY_ISR(void)
* Description    : PD中断处理函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void PD_PHY_ISR(void) interrupt INT_NO_USBPD using 1
{
/*接收到复位信息中断*/if ( PIF_RX_RST ) {PD_PHY_HRST_ISR();      //收到HRSTPD_PHY_RX_INIT();}
/*数据包接受完成中断*/if ( PIF_RX_ACT ){PIF_RX_ACT = 0;if ( (UPD_INT_FG & MASK_PD_STAT) == PD_RX_SOP0 ) {         //收到HRST或SOP数据Union_Header = (_Union_Header *)PD_RX_BUF;          //强制转化           if ( PD_PHY_STAT.WaitingGoodCRC ) {                   //是否在等待GoodCRCif(Union_Header->HeaderStruct.MsgType == GoodCRC){  //判断收到的消息是否为GOODCRCPD_PHY_STAT.WaitingGoodCRC = 0;         PD_PHY_Clear_Flag();                              //清除标志函数PD_PROT_ISR();                       }}else {        switch(Union_Header->HeaderStruct.MsgType){                       case SourceCap:    memcpy(PDO_BUF,PD_RX_BUF,sizeof(PD_RX_BUF)); Versions = Union_Header->HeaderStruct.SpecRev;SourceCapNDO = Union_Header->HeaderStruct.NDO;RecvPDOFlag = 1;              //修改RecvPDOFlag = 1 开启解析PDO,为0则关闭,若开启后本次回复GOODCRC时间会适当延长,此处默认开启PD_PHY_STAT.SendingRequest = 1;break;case Accept:                break;case Reject:break;case PS_RDY:RecvPS_RDYFlag = 1;break;    case GetSinkCap:MsgID++;PD_PHY_STAT.SendingSinkCap = 1;   break;         case SourceCap_VDM: MsgID++;PD_PHY_STAT.SendingNotSup = 1;break;    default :break; }mDelayuS(10);PD_PHY_STAT.SendingGoodCRC = 1;  //置发送GoodCRC标志位PD_PHY_TX_GoodCRC();                 //回复GoodCRC }   }else PD_PHY_RX_INIT();
}
/*数据包发送完成中断 */if ( PIF_TX_END ) {       PIF_TX_END = 0;if(CCSel == 1){  //发送完成关闭低压CC1_CTRL &= ~bCC_LVO; }else if(CCSel == 2){CC2_CTRL &= ~bCC_LVO;   }if ( PD_PHY_STAT.SendingGoodCRC ==1 ) {                       PD_PHY_STAT.SendingGoodCRC = 0;PD_PROT_ISR(); //GoodCRC发送完成,向Prot转交数据}else {           /*开始接收GoodCRC*/PD_PHY_STAT.WaitingGoodCRC = 1; Timer_Counter = Save_Counter;PD_PHY_RX_INIT(); }}
}

本段用来解析Source支持PD协议的具体档位,发生在一次PD协商结束时,此时RecvPS_RDYFlag = 1,解析上述缓存在PDO_BUF中的SourceCap包,并显示在屏幕(后续会精简优化代码):


/*******************************************************************************
* Function Name  : Analysis_PDO(void)
* Description    : 解析PDO、PPS函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Analysis_PDO(void)
{UINT8 Temp;UINT16 PDO_Value = 0;if(RecvPDOFlag == 1){LCD_Fill(0,0,159,12,CYAN);LCD_DrawLine(0,0,159,0,CYAN);LCD_DrawLine(0,0,0,127,CYAN);LCD_DrawLine(159,0,159,127,CYAN);LCD_DrawLine(0,127,159,127,CYAN);if(Versions == 2) //判断PD版本{LCD_ShowString(3,0,"Power Delivery 3.0",BLACK,CYAN,12,0);}else{LCD_ShowString(3,0,"Power Delivery 2.0",BLACK,CYAN,12,0);}Union_Header = (_Union_Header *)PDO_BUF;  //解析SourceCapfor(Temp=0;Temp<SourceCapNDO;Temp++)//pdo的档位{Union_SrcCap = (_Union_SrcCap*)(&PDO_BUF[2+(Temp*4)]);if((Union_SrcCap->SrcCapStruct.DataH8>>6)== 0x00)  //表示固定档{PDO_Value =((((Union_SrcCap->SrcCapStruct.VoltH4<<6)+( Union_SrcCap->SrcCapStruct.VoltL6))*50)/100);if( PDO_Value/10 >= 10) //电压{LCD_ShowFloatNum1(108-7*6,(Temp+1)*12,(float)PDO_Value/10,4,CYAN,BLACK,12);}else{LCD_ShowFloatNum1(108-6*6,(Temp+1)*12,(float)PDO_Value/10,3,CYAN,BLACK,12);}PDO_Value=((((Union_SrcCap->SrcCapStruct.CurrentH2<<8)+( Union_SrcCap->SrcCapStruct.CurrentL8))*10)/10); //电流LCD_ShowFloatNum1(120,(Temp+1)*12,(float)PDO_Value/100,3,CYAN,BLACK,12);LCD_ShowString(108,(Temp+1)*12,"@",CYAN,BLACK,12,0);LCD_ShowString(3,(Temp+1)*12,"< > Fix",CYAN,BLACK,12,0);LCD_ShowIntNum(10,(Temp+1)*12,Temp+1,1,CYAN,BLACK,12);LCD_ShowString(108-2*6,(Temp+1)*12,"V",CYAN,BLACK,12,0);LCD_ShowString(145,(Temp+1)*12,"A",CYAN,BLACK,12,0);}else if((Union_SrcCap->SrcCapStruct.DataH8>>6)== 0x03){//表示PPSUnion_PPS_SrcCap = (_Union_PPS_SrcCap*)(&PDO_BUF[2+(Temp*4)]);  //转换为PPS                         PDO_Value = (Union_PPS_SrcCap->SRC_Cap_PPS_Struct.VoltMin);  if(PDO_Value/10 >= 10){LCD_ShowFloatNum1(111-10*6,(Temp+1)*12,(float)PDO_Value/10,4,CYAN,BLACK,12);}else{LCD_ShowFloatNum1(111-9*6,(Temp+1)*12,(float)PDO_Value/10,3,CYAN,BLACK,12);}PDO_Value = ((Union_PPS_SrcCap->SRC_Cap_PPS_Struct.VoltMaxH1<<7) + (Union_PPS_SrcCap->SRC_Cap_PPS_Struct.VoltMaxL7));LCD_ShowString(75,(Temp+1)*12,"-",CYAN,BLACK,12,0);if(PDO_Value/10 >= 10){LCD_ShowFloatNum1(108-4*6,(Temp+1)*12,(float)PDO_Value/10,4,CYAN,BLACK,12);}else{LCD_ShowFloatNum1(108-3*6,(Temp+1)*12,(float)PDO_Value/10,3,CYAN,BLACK,12);}PDO_Value = ((Union_PPS_SrcCap->SRC_Cap_PPS_Struct.Current)*50)/10;LCD_ShowFloatNum1(120,(Temp+1)*12,(float)PDO_Value/100,3,CYAN,BLACK,12);LCD_ShowString(3,(Temp+1)*12,"< > PPS",CYAN,BLACK,12,0);LCD_ShowIntNum(10,(Temp+1)*12,Temp+1,1,CYAN,BLACK,12);LCD_ShowString(108,(Temp+1)*12,"V",CYAN,BLACK,12,0);LCD_ShowString(145,(Temp+1)*12,"A",CYAN,BLACK,12,0); }}LCD_ShowString(44,(Temp+2)*12-6,"Fixed",BLACK,CYAN,12,0);LCD_ShowString(92,(Temp+2)*12-6,"PPS",CYAN,BLACK,12,0);RecvPDOFlag = 0;}
}

因A口协议属于未公开状态,本次将不进行讲解。有兴趣的小伙伴可以多了解一下,附送一张QC2.0的协议规范。
 
 

后续会上传附件,在此处公开资料代码和PCB等,开源。多协议电源诱骗触发器Power Low(可多快充协议PD、QC等) - 电源论坛_电源技术论坛 - 21ic电子技术开发论坛https://bbs.21ic.com/icview-3232588-1-1.html

PD等多协议快充诱骗触发器SINK(“Power Z 弟弟 Power Low”)DIY相关推荐

  1. USB数据通讯 + PD等多协议快充(全协议:QC、AFC、FCP、VOOC……)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.USB Type-C的优势 二.Type-C 使用的疑难点和解决方案 总结 前言 随着USB PD3.1的发布,PD快 ...

  2. USB PD 等多协议快充方案

    概述 CH236单芯片集成USB PD等多种协议,支持PD3.0/2.0.PPS.BC1.2等快充协议,支持 AC/DC或DC/DC恒压和恒流输出模式反馈调节,高集成度,外围精简.集成VBUS检测与放 ...

  3. USB Type-C PD受电,取电,诱骗,诱电,SINK多协议快充芯片

     概述:    CH224单芯片集成USB PD等多种快充协议,支持PD3.0/2.0,BC1.2 等升压快充协议,自动检测VCONN及模拟E-Mark 芯片,最高支持100W 功率,内置PD通讯模块 ...

  4. PD QC快充诱骗取电方案:输出9V12V15V20V

    手机快充充电器或充电宝,在没有与手机通讯时,快充充电器相当于普通的充电器只输出5V电压,要想得到充电器的9V/12V等电压,可以使用快充取电电路. 或者也可以使用电子元件来搭建诱骗电路,但是和专用的取 ...

  5. 如何诱骗快充充电器输出?PD、QC快充协议受电诱骗方案XSP06电路分享

    现在苹果iPhone已经全部采用PD协议快充充电器,比如18W.20W,而且因为PD协议的便捷和功率大等优势,许多的国产厂商也逐渐开始采用这种协议,那么如何让我们的产品端(例如需要9V工作的产品)来跟 ...

  6. 光绘文件 c语言 解析,基于NXP TEA19051的Type-C 60W多协议快充方案设计(含gerber+方案阐述 )...

    近两年来,手机等电子产品发展迅猛,充电协议呈现多样化的趋势,在 USB PD 尚未完成大一统之前,多协议.多接口的充电配件依然是刚需.世平集团推出基于 NXP TEA19051 的 60W 多协议快充 ...

  7. USB-C PD多协议快充取电协议芯片,专为小家电市场打造

    前言 USB PD是目前较为主流的快充协议,随着USB PD3.1的发布,输送功率最高可达240W.随着USB Type-C接口的普及,大多数电子产品开始使用Type-C接口进行电力传输,提及Type ...

  8. PD协议芯片TYPE C接口支持快充诱骗

    是一颗符合PD.QC2.0.QC3.0.AFC.FCP协议的电源受电端(诱骗)协议芯片,从充电器(如PD或QC协议充电器)上诱骗出合适的电压给产品供电.可广泛应用于各个领域的各种产品,如无线充电.小家 ...

  9. 快充诱骗芯片电路应用浅谈

    随着PD协议的逐渐普及,已经有越来越多的产品开始使用Type-C的接口,增加对PD协议的兼容,例如Type-C接口的手机,支持快充的移动电源,还有各种小家电等产品. 因为Type-C支持正反插,而且还 ...

最新文章

  1. 想转行学python过来人提醒大家几点
  2. 万亿新基建,AI“芯”机遇在哪?| CCF-GAIR 2020
  3. 丁磊旗下首个IPO的AI业务!网易有道年入7个亿,清华96计算机系为主力,沈向洋任董事...
  4. Codeforces 768E:Game of Stones
  5. 神经网络的耦合作用与规范场
  6. 测试教程网.unittest教程.7. 各种断言方法
  7. 【线程呓语】与线程相关的一些概念
  8. Makefile的学习
  9. 153. 寻找旋转排序数组中的最小值 golang
  10. Windows:chm 文件打开出现“已取消到该网页的导航”的解决方案
  11. viso stido 在图上写字
  12. Python爬虫入门五之URLError异常处理
  13. sudo: must be setuid root错误解决方法.
  14. Spring 注解 @Controller,@Service,@Repository,@Component,重定向 与 服务端跳转
  15. python偏最小二乘法公式,python3 偏最小二乘法实现
  16. 学了Java可以做什么工作
  17. 计算机拒绝访问移动硬盘,移动硬盘无法访问拒绝访问,教你移动硬盘无法访问拒绝访问怎么办...
  18. Aho-Corasick(AC自动机)
  19. 【成功实现】python对tif图片的读取与保存
  20. Docker学习-Network网络

热门文章

  1. 删除所有用户数据!永久关闭
  2. Flink从入门到入土(详细教程)
  3. Python之文件的读写
  4. fatal error LNK1104:
  5. 干货 :7招帮你打造完美数据科学GitHub作品集!
  6. 蓝鲸智云统一开发环境搭建指南
  7. 软件测试BUG(缺陷)等级分类
  8. 经济日报pdf批量下载整合
  9. Python练习——L1-051 打折 (5分)
  10. 关于C#怎样跨磁盘移动文件夹(比如C盘文件夹复制到D盘)