市面上很多充电宝基于USB PD协议具备DRP功能(可以做Source/Sink)。拥有DRP功能的充电宝只需要一个Type-C口就能满足充电/放电的功能,在产品的实际生产中可降低成本的投入并且实际使用中能够符合安全规范。
DRP功能实际就是PD芯片在Source/Sink之间进行角色切换,将PD DRP功能应用到充电宝的使用中需要注意电源角色需要以Source功能为主,这样才能保证在给DRP设备(例:手机、电脑)充电的时候能够正确输出。
(注:充电宝的电源角色之所以需要以Source为主,是为了避免给DRP设备充电时反向索取电量。例如在给手机充电过程中,充电宝的电源角色没有做Source为主的处理时,会出现手机反过来给充电宝充电。)
如下图Source时间为:200ms,Sink时间为:100ms。

代码如下:

UINT8 DRP_Set_Source(void)
{UINT16 Count = 200;UINT8 Connect_Count = 0;CC1_CTRL = 0x84;CC2_CTRL = 0x84;printf("Set Source\r\n");while(Count > 1){ADC_CHAN = 0x00;ADC_CTRL |= bADC_START;while( (ADC_CTRL & bADC_IF) == 0 )  ;                                  /* 等待转换完成 */ADC_CTRL |= bADC_IF; //printf("Source CC =%d\n",(UINT16)ADC_DAT );                    /* 输出ADC采样值 */       /* 清标志 */if((UINT16)ADC_DAT < Power3_0AMax){Connect_Count++;if(Connect_Count >= 50){CCSel = 1;printf("CC1 Connect!\r\n");UPD_CTRL &= ~(bPD_CC_SEL);PowerRole = 1;return 1;}}else{ADC_CHAN =0x01;ADC_CTRL |= bADC_START;while( (ADC_CTRL & bADC_IF) == 0 )  ;                                  /* 等待转换完成 */ADC_CTRL |= bADC_IF;                                                /* 清标志 *///        printf("Source CC =%d\n",(UINT16)ADC_DAT );                    /* 输出ADC采样值 */        /* 清标志 */if((UINT16)ADC_DAT < Power3_0AMax){Connect_Count++;if(Connect_Count >= 50){CCSel = 2;printf("CC2 Connect! \r\n");UPD_CTRL |= bPD_CC_SEL;PowerRole = 1;return 1;}}    }mDelaymS(1);Count --;}return 0;
}UINT8 DRP_Set_Sink(void)
{UINT16 Count = 100;UINT8 Connect_Count = 0;CC1_CTRL = 0x82;CC2_CTRL = 0x82;printf("Set Sink\r\n");
//  mDelaymS(100);while(Count > 1){ADC_CHAN =0x00;ADC_CTRL |= bADC_START;while( (ADC_CTRL & bADC_IF) == 0 )  ;                                  /* 等待转换完成 */ADC_CTRL |= bADC_IF;                                                /* 清标志 */// printf("Sink CC =%d\n",(UINT16)ADC_DAT );                    /* 输出ADC采样值 */if((UINT16)ADC_DAT > DufaultPowerMax){Connect_Count++;if(Connect_Count >= 50){CCSel = 1;UPD_CTRL &= ~(bPD_CC_SEL);printf("CC1 Connect! \r\n");PowerRole = 0;return 1;}}else {ADC_CHAN =0x01;ADC_CTRL |= bADC_START;while( (ADC_CTRL & bADC_IF) == 0 )  ;                                  /* 等待转换完成 */ADC_CTRL |= bADC_IF;                                                /* 清标志 *///      printf("Sink CC =%d\n",(UINT16)ADC_DAT );                    /* 输出ADC采样值 */if((UINT16)ADC_DAT > DufaultPowerMax){Connect_Count++;if(Connect_Count >= 50){CCSel = 2;UPD_CTRL |= bPD_CC_SEL;printf("CC2  Connect!\r\n");PowerRole = 0;return 1;}}}mDelaymS(1);Count --;}return 0;
}

现在市面上存在的产品就三种:Source(供电端例如:充电器)、Sink(受电端例如:手电筒)、DRP(供电/受电端例如:手机电脑)。
本次将使用CH543 Demo板模拟充电宝的DRP功能,会分别和充电器(Source)、设备(Sink)、手机(DRP)进行PD通讯,模拟真实应用场景下的使用。
(1)充电宝在给设备Sink充电时电源角色将切换为Source,电流方向由充电宝流入受电设备。
(2)充电宝自身电量不足时需要接充电器Source充电,此时充电宝的电源角色将切换为Sink,电流方向由外部流入充电宝内部。
(3)充电宝的主要功能就是给设备Sink充电,所以在遇到和DRP(手机电脑)连接时应多次进行判断设备的电源角色为DRP,充电宝在遇到DRP时应果断将自身电源角色转变为Source向外部供电,避免反向充电吸收外部设备的电量。
以下为三种情况下的判断代码:

PD_Init:Src_Connect = 0;Sik_Connect = 0;Src_Connect = DRP_Set_Source();  //Source Sik_Connect = DRP_Set_Sink();   //SInk  // printf("Src_Connect = %d   Sik_Connect = %d \r\n",(UINT16)Src_Connect,(UINT16)Sik_Connect);if((Src_Connect == 0)&&(Sik_Connect == 0)){      goto PD_Init;   }
PD_Start:   if(Src_Connect == 1){//设置成SourceDRP_Set_Source();IE_USBPD = 1;PD_PHY_TX_SourCap();while(State){State = Check_Remove_Src();mDelaymS(200);}State = 1;printf("DEV Remove\r\n");goto PD_Init;}if((Src_Connect == 0)&&(Sik_Connect == 1)){Src_Connect = DRP_Set_Source();  //Source 400msif(Src_Connect == 0){//设置成SinkDRP_Set_Sink();PD_PHY_RX_INIT();IE_USBPD = 1;while(State){State = Check_Remove_Sik();mDelaymS(200);}State = 1;printf("DEV Remove\r\n");goto PD_Init;}  else{Sik_Connect = DRP_Set_Sink();if((Sik_Connect == 1)&&(Src_Connect == 1)){goto PD_Start;}}
}

之所以选用CH543是因为此款芯片内置上拉电流和下拉电阻,可以软件进行切换电源角色。另外ISINK引脚具有控制FB的功能,在充电宝电源角色做主机Source时可以通过ISINK进行电压调节,下图为CH543 Demo板。

1、    CH543 Demo与充电器(Source)进行通讯。
充电器(Source)未接入Type-C口时CH543 会在Source/Sink之间来回切换。当充电器(Source)接入Type-C口, CH543电源角色处于Sink阶段的时候,才会进行PD通讯补充自身的电量。
下图为CH543与充电器(Source)协议包图,前端CC电平周期翻转是充电器(Source)未接入时CH543的电源角色在进行Source/Sink切换。后端无电平翻转是充电器(Source)介入后进行的PD通讯过程。

2、CH543 Demo与受电端(Sink)进行通讯。
在没有设备(Sink)接入时CH543 会Source/Sink之间来回切换。当设备(Sink)和CH543连接时,CH543处于Source阶段会检测到Sink端接入,进行判断后会进行PD通讯,实现向外部设备供电的功能。

3、CH543 Demo与DRP设备进行通讯。
本次选用的DRP设备为手机,在手机没有接入时CH543 会Source/Sink之间来回切换。当手机和CH543连接时,CH543会检测到手机为DRP设备(CH543和手机都会在Source/Sink切换角色),然后CH543会强制转换电源角色为Source后进行PD通讯,给手机进行充电。(若不强制CH543切换成Source会存在手机反向给CH543充电的可能性,此时CH543电源角色将为Sink吸收手机电量)

本次只是基本探究充电宝的工作原理,并未做出相实物。通过上述三种验证下,基本清楚了充电宝在工作时的基本原理。有兴趣的可以在此基础上继续完善,DRP的代码处理可自行下载。

基于 USB PD DRP的充电宝原理解析相关推荐

  1. 【毕业设计】 基于单片机的移动共享充电宝设计与实现 - 物联网嵌入式 stm32 c51

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 5 关键代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目 基于单片机的移动充电宝设计与实现 大 ...

  2. 基于Java Web的共享充电宝管理系统

    近年来共享充电宝的发展十分迅速,无论是商场还是街边小巷的商户基本都会在店内配备共享充电宝供用户使用,方便了顾客解决手机电量的燃眉之急,也为商户带来了额外的流量.但现有的共享充电宝管理系统中普遍存在着操 ...

  3. 毕业设计 基于单片机的移动共享充电宝设计与实现

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 5 最后 1 简介 Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于单片机的移动充电宝设计与实现 大家可用于 课程设计 或 毕业设 ...

  4. USB PD v1.0快速充电通信原理

    1 原理 本篇文章讲的快速充电是指USB论坛所发布的USB Power Delivery快速充电规范(通过VBUS直流电平上耦合FSK信号来请求充电器调整输出电压和电流的过程),不同于本人发布的另一篇 ...

  5. java基于ssm+vue的共享充电宝管理系统 elementui

    随着时代的发展,人们的生活越来越离不开手机.但是因为技术水平等原因的限制,手机的电池并没有人们想象中的那么耐用.很多时候人们在外出的时候,很可能会遇到手机没电的情况发生.作为日常通讯的必备工具,如果没 ...

  6. 单例设计模式-静态内部类-基于类初始化的延迟加载解决方案及原理解析

    刚刚线程1看不到线程0的重排序,我们创建一个类,这个方案是使用静态内部类来解决,一会我们也会分析一下原理,我们创建一个静态内部类,静态内部类的代理模式,JVM在类的初始化阶段,也就是class被加载后 ...

  7. 基于深度学习的人脸识别技术原理解析与项目实战

    人脸识别是一种基于人的面部特征信息进行身份认证的生物特征识别技术,识别流程分为如下几个步骤: 创建人脸库 确定好需要通过人脸识别技术来鉴别身份的人的总数N:收集和整理对应的包含人 脸的图片,图片满足以 ...

  8. 罗马仕 php30充电,同时支持PD及QC的平价充电宝 罗马仕 WA10 10000mAh

    同时支持PD及QC的平价充电宝 罗马仕 WA10 10000mAh 2018-12-04 22:34:00 7点赞 17收藏 14评论 购买原因 因为新买笔记本的Type-C口只支持PD充电协议,而手 ...

  9. 无线设置 用户_小米推出立式无线充电宝,无线充秒变充电宝最功率达30W

    2019年小米发布了支持无线充电的小米9手机,随后同步更新了一系列无线充电配件,包括了集成了无线输出功能的小米无线充电宝,还有多款桌面立式无线充,他们都各司其职.2020年9月小米商城上架了一款全新的 ...

最新文章

  1. c语言乘法口诀倒三角,乘法口诀表,C语言实现
  2. CF1478A - Nezzar and Colorful Ball(数学)
  3. 关“视觉神经系统是怎么形成的?”的思考
  4. linux php mysql安装包下载_在linux下手动安装 apache, php, mysql--终极版
  5. 在chrome-console中进行xpath/css/js定位
  6. TransformerEncoder
  7. 结构光相移法-多频外差原理+实践(上)
  8. 【工具推荐】PDF和其他格式的相关的转换
  9. 开源代码审计工具备忘
  10. 把网站部署到IIS后访问不了,报错IIS管理器无法验证此内置账户是否有访问权
  11. 微pe怎么装linux系统,微PE工具箱增加安装Linux系统菜单
  12. 13-JS中的面向对象
  13. vmware服务器文件备份,三种VMware数据备份和恢复方法
  14. java 百度ocr识别身份证,营业执照流程
  15. Android7.0上拍照与选择照片Crash问题
  16. Markdown 插入图片 基于base64编码
  17. c语言变量大全,C语言变量
  18. statuml怎么添加用户_starUML用户使用手册
  19. opencv双目测距(BM 与SGBM匹配)
  20. Lucene 7.5.0 索引文件之nvdnvm

热门文章

  1. 软件测试网上课程设计,软件测试 软件测试 《软件测试》课程设计.docx
  2. 多多自走棋改动_多多自走棋版本前瞻 巫师上线后 羁绊改动集锦
  3. 有哪些数据恢复软件?13个好用的数据恢复工具分享
  4. 转 全国高校信息数据库,全国高校排序数据库
  5. iconv-lite,JS字符串编解码工具
  6. 【车载】ESP/ESC/DSC车身稳定系统
  7. 到底什么是类脑计算?
  8. arange()用于生成一维数组 reshape()将一维数组转换为多维数组
  9. 俄罗斯公司开发者提交开源代码被拒,Linux 内核维护者: 我们不愿意接受
  10. 博士毕业感悟:我从来不曾优秀过,也从未曾放弃过!