12下一页
返回列表 发新帖我要提问本帖赏金: 5.00元(功能说明)

[充电器] 最新PowerXXX2.0来了,支持PD/PPS、BC1.2、QC2.0/3.0、等A口协议!开源开源开源

[复制链接]
19983|37
 楼主| Liuhl1998 发表于 2023-3-9 19:41 | 显示全部楼层 |阅读模式
本帖最后由 Liuhl1998 于 2023-3-22 10:54 编辑

鸽了这么久,PowerXXXX2.0终于来了!!话不多说,直接展示。
   新款PowerX支持BC1.2检测、QC2.0检测调压、QC3.0检测调压、PD2.0/3.0以及PPS检测调压,因为华为FCP和三星的AFC属于厂商私有协议,暂不公开。另外Apple2.4也被我屏蔽了,狗头保命!
  目前公开的版本仅支持BC1.2、QC2.0/3.0、PD2.0/3.0、PPS。


好了好了,不啰嗦了,效果演示图如下:
1:操作显示界面(左右选择需要请求的协议,确认进入)


2:BC1.2检测界面(成功会显示成功和BC1.2协议标志,如果失败会显示失败并且输出接口类型SDP、CDP)



3:QC2.0检测调压界面(会显示触发成功标志,以及需要调压的档位)



4:QC3.0检测调压界面(左右进行调压,显示功能和QC2.0差不多)



5:PD检测调压界面(成功会读取PD版本号、PD支持的档位信息:电压电流)



6:PPS调压检测界面(显示PPS支持的电压范围,请求的电压幅值、精准请求电压20mv)


显示界面如上,使用的是三档拨轮开关,屏幕TFT(占用空间太大了,PowerXXXX3.0版本就给换了)
以上是利用CH543设计的简易版电路原理图,可通过DM、DP、CC来实现主要的诱骗功能,通过DM、DP来触发QC、AFC、FCP等协议,通过CC触发PD协议。屏幕显示采用SPI驱动的TFT:ST7735S。设计中还使用了Power Z一样的三档拨轮开关,用来选择档位和功能操作等。整体电路设计下来参考价格在15元左右,主要是TFT比较贵。
原理图如下:




PCB如下:

!!!主程序代码:

  1. #include "System.H"


  2. void main() {
  3.   
  4.         System_Init();              //系统初始化操作界面

  5.         while(1)
  6.         {
  7.                 LCD_Fill(1,1,LCD_W-1,LCD_H-1,BLACK);
  8.                 switch(System_Select_Mode)
  9.                 {
  10.                         case System_Init_Mode:  //系统初始化操作界面
  11.                                 Init_Mian_Proc();
  12.                                 break;

  13.                         case System_BC_Mode:    //系统PD触发操作界面
  14.                           BC_Mian_Proc();
  15.                                 break;
  16.                         
  17.                         
  18.                         case System_QC2_Mode:    //系统PD触发操作界面
  19.                                 QC_Mian_Proc();
  20.                                 break;

  21.                         case System_QC3_Mode :    //系统QC触发操作界面
  22.                                 QC_Mian_Proc();
  23.                                 break;
  24.                         
  25.                         case System_Apple_Mode :    //系统APPle2.4触发操作界面
  26.                         //        Apple_Mian_Proc();
  27.                                 break;
  28.                         
  29.                         case System_PD_Mode :    //系统PD触发操作界面
  30.                     PD_Mian_Proc();
  31.                                 break;
  32.                         
  33.                         case System_AFC_Mode :    //系统AFC触发操作界面
  34.                 //                AFC_Mian_Proc();
  35.                                 break;
  36.                         
  37.                         case System_FCP_Mode :    //系统FCP触发操作界面
  38.                 //                FCP_Mian_Proc();
  39.                                 break;
  40.                         
  41.                         default:
  42.                                 System_Select_Mode = System_Init_Mode;
  43.                                 break;
  44.                 }
  45.         }
  46. }
  47.         


!!!BC1.2触发函数:
  1. UINT8 BC1_2Check(void)
  2. {

  3.   bit BC_Check_Flag = 0;
  4.         UINT8 CheckCount =0;
  5.         
  6.   USB_DP_OUT_0v6();
  7.         CheckCount = 40;
  8.         while(CheckCount)
  9.         {
  10.                 if(Check_ADC(bDM_Aisle) >= 372)
  11.                 {
  12.                   BC_Check_Flag = 1;
  13.                 }else{
  14.                   BC_Check_Flag = 0;
  15.                 }
  16.                 CheckCount--;
  17.                 mDelaymS(1);
  18.         }
  19.         if(BC_Check_Flag) //DCP,CDP
  20.         {
  21.                 USB_DM_OUT_0v6();
  22.                 CheckCount = 40;
  23.                 while(CheckCount)
  24.                 {
  25.                         if(Check_ADC(bDP_Aisle) >= 372)
  26.                         {
  27.                           BC_Check_Flag = 1;
  28.                         }else{
  29.                           BC_Check_Flag = 0;
  30.                         }
  31.                         CheckCount--;
  32.                         mDelaymS(1);
  33.           }
  34.                 if(BC_Check_Flag) //DCP
  35.                 {
  36.                   USB_DP_OUT_0v6();
  37.                         CheckCount = 135;
  38.                         while(CheckCount>=1)
  39.                         {
  40.                                         if(Check_ADC(bDM_Aisle) <= 372){return 4;}
  41.                                         CheckCount -= 1;
  42.                                   mDelaymS(10);
  43.                         }        
  44.                 }else{
  45.                                 printf("This is CDP\r\n");
  46.                           return 2;
  47.                  }
  48.         }else{
  49.                  printf("This is SDP\r\n");
  50.                  return 1;
  51.          }
  52.          printf("BC1.2\r\n");
  53.          return 3;
  54. }




!!!QC触发函数:
  1. #define  SET_DM_Push_Pull()  {P3_MOD_OC &= ~bDM; P3_DIR_PU |= bDM;}
  2. #define  SET_DP_Push_Pull()  {P3_MOD_OC &= ~bDP; P3_DIR_PU |= bDP;}
  3. #define  SET_DM_Float_in()   {P3_MOD_OC &= ~bDM; P3_DIR_PU &= ~bDM;}
  4. #define  SET_DP_Float_in()   {P3_MOD_OC &= ~bDP; P3_DIR_PU &= ~bDP;}
  5. #define  SET_DMDP_Float_in() {SET_DM_Float_in(); SET_DP_Float_in();}
  6. #define  USB_DP_OUT_0v6()   { USB_PULL &= ~bUDP_PDE; USB_PULL |= bUDM_PDE; P3_ANA_PIN |= (MASK_USB_OUT_VOL & 0x01);}
  7. #define  USB_DM_OUT_0v6()   { USB_PULL |= bUDP_PDE; USB_PULL &= ~bUDM_PDE; P3_ANA_PIN |= (MASK_USB_OUT_VOL & 0x01);}
  8. #define  USB_DP_OUT_0v0()   { USB_PULL |= bUDP_PDE; USB_PULL &= ~bUDM_PDE; P3_ANA_PIN &= ~(MASK_USB_OUT_VOL);}
  9. #define  USB_DM_OUT_0v0()   { USB_PULL &= ~bUDP_PDE; USB_PULL |= bUDM_PDE; P3_ANA_PIN &= ~(MASK_USB_OUT_VOL);}
  10. #define  USB_DP_OUT_3v3()   { SET_DP_Push_Pull();        SET_DM_Float_in();DP = 1;}
  11. #define  USB_DM_OUT_3v3()   { SET_DM_Push_Pull();        SET_DP_Float_in();DM = 1;}

  12. #define USB_DMDP_OUT_0v0()  {  SET_DP_Push_Pull();SET_DM_Push_Pull();DP = 0;DM = 0;}

  13. #define QC_Get_Request5V()   { SET_DMDP_Float_in(); USB_DM_OUT_0v0(); USB_DP_OUT_0v6();}
  14. #define QC_Get_Request9V()   { SET_DMDP_Float_in(); USB_DM_OUT_0v6(); USB_DP_OUT_3v3();}
  15. #define QC_Get_Request12V()  { SET_DMDP_Float_in(); USB_PULL |= bUDP_PDE; USB_PULL |= bUDM_PDE; P3_ANA_PIN |= (MASK_USB_OUT_VOL & 0x01);}
  16. #define QC_Get_Request20V()  {  SET_DP_Push_Pull();SET_DM_Push_Pull();DP = 1;DM = 1;}

  17. #define QC3_Init()         { SET_DMDP_Float_in(); USB_DP_OUT_0v6(); USB_DM_OUT_3v3();}   
  18. #define QC3_Plus_Volt()    { SET_DP_Push_Pull();DP = 1;mDelaymS(10); QC3_Init();}
  19. #define QC3_SUB_Volt()     { QC_Get_Request12V(); mDelaymS(10); QC3_Init();}


!!!PD触发函数:

  1. /*******************************************************************************
  2. * Function Name  : PD_PHY_ISR(void)
  3. * Description    : PD中断处理函数
  4. * Input          : None
  5. * Output         : None
  6. * Return         : None
  7. *******************************************************************************/
  8. void PD_PHY_ISR(void) interrupt INT_NO_USBPD
  9. {
  10.         
  11.          /*接收到复位信息中断*/
  12.         if(PIF_RX_RST){
  13.                 PIF_RX_RST = 0;
  14.                 PD_PHY_HRST_ISR();
  15.         }
  16.         /*数据包接受完成中断*/
  17.         if(PIF_RX_ACT )
  18.         {
  19.           PIF_RX_ACT = 0;
  20.          if((UPD_INT_FG & MASK_PD_STAT) == PD_RX_SOP0)
  21.          {
  22.                 Union_Header = (_Union_Header *)PD_RX_BUF;
  23.                  if (PD_PHY_STAT.WaitingGoodCRC)
  24.                  {                        
  25.                         if(Union_Header->HeaderStruct.MsgType == GoodCRC)//判断收到的消息是否为GOODCRC
  26.                         {  
  27.                                 PD_PHY_STAT.WaitingGoodCRC = 0;                  
  28.                                 PD_PHY_Clear_Flag();                              
  29.                                 PD_PROT_ISR();                                             
  30.                         }
  31.                  }else{               
  32.                         
  33.                         Data_Versions = Union_Header->HeaderStruct.SpecRev;    //获取PD版本号
  34.                         switch(Union_Header->HeaderStruct.MsgType)
  35.                         {                                                
  36.                                 case SourceCap:        
  37.                                            Bit_Recv_SrcCap = 1;
  38.                                      Data_MsgID++;
  39.                                                  PD_PHY_STAT.SendingRequest = 1;
  40.              memcpy(PD_SrcCap_BUF,PD_RX_BUF,sizeof(PD_RX_BUF));
  41.                                      Bit_Recv_PSRDY = 0;
  42.                                                  break;
  43.                                 case Accept:                                
  44.                                                  break;
  45.                                 case Reject:
  46.                                                  Data_MsgID++;
  47.                                                  PD_PHY_STAT.SendingRequest = 1;
  48.                                                  break;
  49.                                 case PS_RDY:
  50.                                             Bit_Recv_PSRDY = 1;
  51.                                                  break;         
  52.                                 case GetSinkCap:
  53.                                                  Data_MsgID++;
  54.                                                  PD_PHY_STAT.SendingSinkCap = 1;
  55.                                                  break;                 
  56.                                 case SrcCap_VDM:
  57.                                                  Data_MsgID++;
  58.                                                  PD_PHY_STAT.SendingNAK = 1;
  59.                                                  break;
  60.                         }
  61.                         mDelayuS(15);
  62.                         PD_PHY_STAT.SendingGoodCRC = 1;        //置发送GoodCRC标志位
  63.                         PD_PHY_TX_GoodCRC();                                    //回复GoodCRC        
  64.                 }        
  65.         }else{
  66.                 PD_PHY_RX_INIT();
  67.         }
  68. }
  69. /*数据包发送完成中断 */
  70.         if(PIF_TX_END)
  71.         {               
  72.           PIF_TX_END = 0;
  73.                         CC1_CTRL &= ~bCC_LVO;                 /*CC2数据包发送完成 */
  74.                         CC2_CTRL &= ~bCC_LVO;
  75.           if(PD_PHY_STAT.SendingGoodCRC){
  76.       PD_PHY_STAT.SendingGoodCRC = 0;
  77.                         PD_PROT_ISR();
  78.                 }else{
  79.                         PD_PHY_STAT.WaitingGoodCRC = 1;        
  80.                         Timer_Counter = Save_Counter;
  81.                         PD_PHY_RX_INIT();        
  82.                 }
  83.         }
  84. }

!!!PPS触发处理函数:

  1. void PD_Request_PPS(UINT8 GearTemp,UINT16 PD_PPS_Value)
  2. {
  3.         
  4.                 UPD_T_SOP = UPD_SOP0;
  5.                 UPD_T_LEN = 6;
  6.                 Data_MsgID++;
  7.                 if(Data_MsgID>7){        Data_MsgID =0;}
  8.                 PD_TX_BUF[5] =((GearTemp<<4) | 0x01);
  9.                 PD_TX_BUF[4] =(PD_PPS_Value >> 7);
  10.                 PD_TX_BUF[3] = ((PD_PPS_Value<<1) & 0xFE);
  11.                 PD_TX_BUF[2] = PD_SrcCap_BUF[2+((GearTemp - 1)*4)];
  12.                 PD_TX_BUF[1] = (0x10 | (Data_MsgID << 1));
  13.                 PD_TX_BUF[0] =(0x02 | (Data_Versions<<6));
  14.                 PD_PHY_TX_INIT();
  15. }



好了好了,今天全是硬菜,大家先好好消化一下!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

沈千曦 打赏了 5.00 元 2024-02-19
理由:求Power X3.0

评论

【闲鱼】https://m.tb.cn/h.UwxZZDr?tk=oTQqdp7ytTv CZ3457 「我在闲鱼发布了【Debug工作室】」 点击链接直接打开  发表于 2023-5-31 16:42
 楼主| Liuhl1998 发表于 2023-3-24 11:48 | 显示全部楼层

评论

大佬,能发一份AFC,FCP,scp资料学习下吗?谢谢了,773923033@qq.com  发表于 2023-11-28 11:11
HSI 发表于 2023-3-26 13:32 | 显示全部楼层

跪求FCP SCP受电端协议 有偿13416344724
小小雅 发表于 2023-4-1 18:43 来自手机 | 显示全部楼层
如果用其他芯片,比如stc32可以不?不用ch543芯片
zfm005 发表于 2023-4-6 09:10 | 显示全部楼层
给楼主点赞,板子打回来了,申请样片测试OK,遗憾就是没有AFC,FCP,能不能私信发一份317585160@qq.com。另外请教个问题,为什么我重新编译的hex文件不工作,用你的hex文件就可以。
小小雅 发表于 2023-4-8 21:41 来自手机 | 显示全部楼层
楼主,上传一份完整的程序呗,自己编译后,出现好多警告
 楼主| Liuhl1998 发表于 2023-4-11 13:56 | 显示全部楼层
小小雅 发表于 2023-4-1 18:43
如果用其他芯片,比如stc32可以不?不用ch543芯片

只要带PD PHY 就行,实际功能全是软件编写
 楼主| Liuhl1998 发表于 2023-4-11 13:57 | 显示全部楼层
小小雅 发表于 2023-4-8 21:41
楼主,上传一份完整的程序呗,自己编译后,出现好多警告

我把一部分封库了哎,我可以给HEX 文件,你看行不?
 楼主| Liuhl1998 发表于 2023-4-11 13:57 | 显示全部楼层
zfm005 发表于 2023-4-6 09:10
给楼主点赞,板子打回来了,申请样片测试OK,遗憾就是没有AFC,FCP,能不能私信发一份。另外请教个问题,为 ...

咦   你是不是没有正确添加器件库哎? 
小小雅 发表于 2023-4-11 16:36 | 显示全部楼层
Liuhl1998 发表于 2023-4-11 13:57
咦   你是不是没有正确添加器件库哎? 

应该不存在器件库不正确呀,我就下载后直接解压,然后用keil5编译的,报警告

评论

我里面有一个文件封库了,是不是没添加进去呢?  发表于 2023-4-11 16:48
小小雅 发表于 2023-4-11 18:25 | 显示全部楼层
本帖最后由 小小雅 于 2023-4-11 20:35 编辑

全是这些警告,只声明了,实际不存在这些函数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

留下联系方式  发表于 2023-4-12 09:27
巷子里的童年 发表于 2023-4-18 14:53 | 显示全部楼层
求一份完整代码,不封库的版本,有偿,17602154426
 楼主| Liuhl1998 发表于 2023-4-27 14:51 | 显示全部楼层
准备重新设计优化代码空间,将AFC,FCP,APLLE2.4都开发出来(封装库的形式),顶一顶,给点动力!
 楼主| Liuhl1998 发表于 2023-4-27 14:52 | 显示全部楼层
HSI 发表于 2023-3-26 13:32
跪求FCP SCP受电端协议 有偿13416344724

准备重新设计优化代码空间,将AFC,FCP,APLLE2.4都开发出来(封装库的形式),顶一顶,给点动力!
小小雅 发表于 2023-4-30 12:42 来自手机 | 显示全部楼层
支持大佬,大佬早点更新
 楼主| Liuhl1998 发表于 2023-5-11 13:54 | 显示全部楼层
最近觉得这个版本又不顺眼了   
准备开整3.0.并尽量将AFC和FCP也给加上
预计五月底-六月中上新
各位看官请稍等片刻~

评论

【闲鱼】https://m.tb.cn/h.UwxZZDr?tk=oTQqdp7ytTv CZ3457 「我在闲鱼发布了【Debug工作室】」 点击链接直接打开  发表于 2023-5-31 16:43
lalala1234561 发表于 2023-5-19 11:16 | 显示全部楼层
楼主楼主,system的c文件可以分享一下嘛,编译时找不到系统的初始化函数
yuzhiguo1515 发表于 2023-8-4 08:24 | 显示全部楼层
学习学习,学习学习。
 楼主| Liuhl1998 发表于 2023-9-2 10:07 | 显示全部楼层
lalala1234561 发表于 2023-5-19 11:16
楼主楼主,system的c文件可以分享一下嘛,编译时找不到系统的初始化函数

封库了,别忘记加载
dw772 发表于 2023-10-6 22:22 | 显示全部楼层
谢谢楼主的分享,如果可以的话可以分享一下PD协议的基础资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

109

帖子

33

粉丝
快速回复 在线客服 返回列表 返回顶部