ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Type-C接口单片机项目实战:CC1/CC2引脚接法与PCB设计避坑指南

Type-C接口单片机项目实战:CC1/CC2引脚接法与PCB设计避坑指南 1. 为什么我劝你先别急着画PCB前阵子帮学弟改一块STM32F103C8T6的最小系统板他兴冲冲地跟我说要把原来的Micro-USB换成Type-C板子都画好了结果打样回来一插电脑电脑那边一点反应都没有VBUS有5V但设备就是枚举不出来。我拿万用表一量CC1和CC2两个引脚都是悬空的他压根没接。这事儿太典型了我见过太多人栽在这个坑里——以为Type-C就是Micro-USB的物理换壳把VBUS、GND、D、D-四根线对上就完事了结果CC引脚一空主机根本不知道你插进来了。Type-C接口用在单片机项目上核心关键词就三个Type-C、引脚、CC1。它跟老式USB接口最大的区别不在于能正反插而在于它引入了一套完整的通道配置Channel Configuration机制。这套机制靠的就是CC1和CC2这两根线。你如果只是把Type-C当成一个“形状更好看的Micro-USB”来用那大概率会翻车。这篇文章就是写给那些准备给51单片机、STC单片机、STM32或者树莓派4B这类开发板换Type-C接口的朋友不管你是画PCB还是用转接板先把这6个核心引脚VBUS、GND、D、D-、CC1、CC2的接法搞明白能帮你省下至少一次打样的钱和一周的调试时间。我下面会从Type-C的引脚定义讲起把CC1和CC2的作用掰开揉碎然后给出几种不同场景下的电路图接法包括纯供电、USB 2.0数据通信、以及带PD诱骗的玩法。最后还会分享几个我实际踩过的坑比如CC电阻选错导致充电头不输出、D D-走线太长导致枚举失败之类的。内容比较长但都是实打实的经验建议先收藏。2. Type-C引脚定义与核心引脚功能拆解2.1 24Pin母座的完整引脚分布先上一张标准的Type-C母座引脚定义表这是所有接法的基础。市面上常见的Type-C母座有16Pin和24Pin两种对于单片机项目来说16Pin的够用了但24Pin的也不贵而且引脚更全我一般推荐直接用24Pin的免得后面想加功能又要换封装。引脚编号名称功能说明单片机项目是否必接A1GND地必接A2TX1高速发送正一般不接A3TX1-高速发送负一般不接A4VBUS5V电源必接A5CC1通道配置1必接关键A6DUSB 2.0数据正按需A7D-USB 2.0数据负按需A8SBU1边带使用1一般不接A9VBUS5V电源必接A10RX2-高速接收负一般不接A11RX2高速接收正一般不接A12GND地必接B1GND地必接B2TX2高速发送正一般不接B3TX2-高速发送负一般不接B4VBUS5V电源必接B5CC2通道配置2必接关键B6DUSB 2.0数据正按需B7D-USB 2.0数据负按需B8SBU2边带使用2一般不接B9VBUS5V电源必接B10RX1-高速接收负一般不接B11RX1高速接收正一般不接B12GND地必接注意看VBUS和GND各有4个引脚D和D-各有2个引脚A6/A7和B6/B7CC1和CC2各只有1个。这种冗余设计是为了支持正反插——不管你插哪一面VBUS、GND、D、D-都能对上但CC1和CC2的位置是固定的插正面时主机识别的是CC1插反面时识别的是CC2。这就是为什么CC1和CC2必须分别处理不能简单短接在一起。2.2 CC1和CC2到底在干什么很多人搞不懂CC引脚的作用我打个比方老式USB接口就像两个人见面直接握手干活而Type-C接口多了一个“门卫”角色CC引脚就是这个门卫。当你把Type-C线插进电脑或充电头时主机会先通过CC引脚问一句“你是谁你需要多少电你能干什么”设备端通过CC引脚上的电阻或芯片来回答这些问题。具体来说CC引脚承担了以下几个职责连接检测主机端DFP下行端口在CC引脚上有上拉电阻典型值56kΩ或22kΩ设备端UFP上行端口在CC引脚上有下拉电阻典型值5.1kΩ。当两者连接时CC电压被拉低主机就知道有设备插入了。正反插识别主机通过检测CC1和CC2中哪一个有下拉来判断插入方向然后切换对应的D D-通道。电流能力协商对于USB 2.0 Type-C默认电流是500mA或900mA for USB 3.0如果设备端在CC引脚上加了不同的下拉电阻可以请求更大的电流。比如5.1kΩ对应默认USB电流而更小的电阻可以请求1.5A或3A。PD协议通信如果要做USB PD快充CC引脚上会跑BMC编码的通信信号这时候就不能简单用电阻了得用专用的PD协议芯片。对于绝大多数单片机项目来说我们只需要用到前两个功能也就是连接检测和正反插识别。这时候设备端只需要在CC1和CC2上各接一个5.1kΩ的下拉电阻到地就行了。就这么简单对就这么简单。但如果你不接主机就认为没有设备插入VBUS可能压根不会输出或者输出了也不枚举。2.3 为什么CC1和CC2不能短接我见过有人为了省事把CC1和CC2直接短接在一起然后共用一颗5.1kΩ电阻。这种做法在某些情况下能凑合用但存在隐患。因为当Type-C线反插时主机检测的是CC2而你的CC1和CC2是短接的主机可能会误判插入方向导致D D-通道切换错误数据通信就会失败。更严重的是如果主机端在CC1和CC2上都有上拉电阻短接后两个上拉电阻并联电压会被拉高可能导致主机无法正确识别设备。正确的做法是CC1和CC2各接一颗独立的5.1kΩ电阻到地互不干扰。这两颗电阻的精度建议用1%的5%的也能用但1%的更稳。我实测下来用5%的电阻有时候会遇到某些充电头识别不稳定换成1%的就没事了。3. 不同场景下的Type-C接口电路接法3.1 纯供电场景只取5V不要数据这是最简单的场景比如你做一个LED灯带控制器只需要从Type-C口取5V电源不需要跟电脑通信。这时候接法如下VBUSA4、A9、B4、B9全部接到你的5V电源网络GNDA1、A12、B1、B12全部接到地CC1A5接一颗5.1kΩ电阻到地CC2B5接一颗5.1kΩ电阻到地D、D-、SBU、TX、RX全部悬空注意有些便宜的Type-C充电头或充电宝如果不检测到CC下拉电阻VBUS压根不会输出。我手头就有一个某品牌的65W氮化镓充电头插上没接CC电阻的转接板一点电都没有接上5.1kΩ电阻立马输出5V。所以哪怕你只要电CC电阻也不能省。如果你需要更大的电流比如驱动电机或者大功率LED可以在CC1和CC2上接更小的电阻来请求更大电流。根据USB Type-C规范设备端下拉电阻与可用电流的对应关系如下下拉电阻值请求电流5V时适用场景5.1kΩ默认USB电流500mA/900mA普通单片机、传感器22kΩ1.5A电机驱动、大功率LED10kΩ3A大功率设备不过要注意这个电流协商需要主机端支持。如果主机端只是一个普通的USB 2.0口它可能只能提供500mA你接再小的电阻也没用。另外有些充电头对非标准电阻值不认我试过用10kΩ请求3A结果充电头只给了1A换成22kΩ反而给了1.5A。所以实际用的时候建议先用5.1kΩ保证能识别再根据实际需求调整。3.2 USB 2.0数据通信场景单片机与电脑通信这是最常见的场景比如你用STM32或者51单片机通过USB跟电脑通信下载程序或者传数据。接法如下VBUS、GND同上CC1接5.1kΩ到地CC2接5.1kΩ到地DA6和B6短接在一起接到单片机的USB D如果是STM32接PA12D-A7和B7短接在一起接到单片机的USB D-如果是STM32接PA11这里有个关键点D和D-的A面和B面要分别短接。因为Type-C正反插时主机内部会自动切换D D-通道但设备端不知道主机切的是哪一面所以设备端要把两面的D D-都接上让主机自己去选。如果你只接了A面的D D-那反插的时候可能就不通信了。对于STM32F103C8T6这类自带USB外设的单片机D需要接一个1.5kΩ的上拉电阻到3.3V用来告诉主机这是一个全速USB设备。这个上拉电阻有些型号内部有有些没有具体要看数据手册。STM32F103C8T6的USB D上拉是内部可配置的但如果你用STC单片机或者51单片机做软件USB那就得外部加。实操心得D和D-的走线尽量等长差分阻抗控制在90Ω左右。如果走线太长或者不等长USB枚举可能会失败。我试过D D-走线长度差超过5mm结果电脑能识别设备但传数据老出错。后来把走线改短改等长问题就没了。对于全速USB12Mbps走线长度最好控制在10cm以内。3.3 带PD诱骗的场景让充电头输出更高电压如果你想从Type-C口取9V、12V甚至20V那就需要用到PD诱骗芯片比如CH224K、FS312或者IP2721。这时候CC1和CC2就不能只接电阻了要接到诱骗芯片的CC引脚上。以CH224K为例它的典型电路是这样的CH224K的CC1引脚接Type-C的CC1CH224K的CC2引脚接Type-C的CC2CH224K的VBUS引脚接Type-C的VBUSCH224K的GND接地CH224K的CFG引脚通过电阻配置请求的电压CH224K的CFG引脚配置电阻与请求电压的对应关系CFG电阻值请求电压悬空5V24kΩ9V56kΩ12V100kΩ15V220kΩ20V这个方案我用过好几次配合支持PD的充电头确实能诱骗出20V。但要注意诱骗出来的电压是直接加在VBUS上的你的后级电路要能承受这个电压。比如你诱骗出20V但你的单片机是3.3V的那就得再加一级降压电路比如用L7812CV降到12V再用AMS1117降到3.3V。千万别直接把20V怼到单片机VCC上我见过有人这么干结果芯片直接冒烟。另外PD诱骗芯片的CC引脚上通常需要加ESD保护二极管比如ULN2803之类的阵列或者专用的ESD芯片。我试过不加保护插拔几次后诱骗芯片就挂了后来加了ESD保护就没再出过问题。4. 实操过程从原理图到PCB的完整流程4.1 原理图设计要点画原理图的时候我习惯把Type-C母座单独做成一个模块引脚定义标注清楚。以Altium Designer为例我会创建一个24Pin的Type-C母座符号然后把VBUS、GND、CC1、CC2、D、D-这几个关键引脚拉出来其他高速引脚可以隐藏或者放到一边。CC1和CC2的下拉电阻我一般用5.1kΩ 1%的封装用0402或者0603都行。电阻一端接CC引脚另一端接地。注意这两个电阻要分别接不要共用。D和D-的短接点我一般放在靠近Type-C母座的位置短接线尽量短。如果空间允许可以在D D-上各串一颗共模电感比如DLW21HN900SQ2能有效抑制共模干扰。不过对于全速USB不串也能用看你的EMC要求。VBUS上我一般会加一颗TVS二极管比如SMAJ5.0A用来防浪涌。虽然Type-C的VBUS本身有保护但多一层保护总没错。GND的话我一般会把所有GND引脚都接到同一个地平面不要分开走线。4.2 PCB布局与走线注意事项PCB布局的时候Type-C母座尽量放在板边方便插拔。CC1和CC2的下拉电阻要靠近母座放置走线尽量短避免引入干扰。D和D-的走线要等长差分阻抗控制在90Ω。如果板子层数够D D-最好走内层上下包地。VBUS的走线要够宽至少20mil因为要过500mA甚至更大的电流。如果请求3A那走线宽度至少40mil或者用铺铜。GND的话尽量用完整地平面不要分割。踩坑记录有一次我画板子的时候把CC1和CC2的电阻放在了板子另一面走线绕了很远。结果插上电脑设备时识别时不识别。后来用示波器看CC引脚波形发现有很大的振铃。把电阻移到母座旁边走线缩短后问题就解决了。所以CC引脚的走线一定要短最好控制在5mm以内。还有一个细节Type-C母座的金属外壳要接地。有些母座的外壳引脚是独立的要单独接到地平面。如果不接插拔的时候静电可能会打到内部引脚上导致芯片损坏。我一般会把外壳引脚用一颗0Ω电阻或者磁珠接到地兼顾EMC和静电防护。4.3 焊接与调试步骤板子打样回来之后先别急着焊单片机先焊Type-C母座和CC电阻然后插上电脑或者充电头用万用表量VBUS有没有5V。如果没有先检查CC电阻有没有焊错、虚焊。我遇到过好几次是CC电阻虚焊补焊一下就好了。VBUS正常之后再焊USB上拉电阻如果是STM32检查内部上拉是否使能然后插电脑看设备管理器有没有识别到USB设备。如果识别到了但有黄色感叹号可能是驱动问题。如果压根没识别先量D D-有没有短路或断路再量D上拉电阻有没有焊好。最后焊单片机和其他外设烧录程序测试通信。如果通信不稳定先检查D D-走线再检查电源纹波。我试过用AMS1117给STM32供电结果USB通信老断后来在AMS1117输出端加了一颗100uF电解电容和一颗0.1uF陶瓷电容问题就解决了。所以电源滤波很重要别省这几个电容。5. 常见问题与排查技巧实录5.1 插上电脑没反应VBUS有5V但不枚举这是最常见的问题排查顺序如下先量CC1和CC2对地电阻应该是5.1kΩ左右。如果量出来是0或者无穷大说明电阻没焊好或者焊错了。再量D和D-对地电阻正常应该有几十kΩ到几百kΩ。如果短路到地说明D D-接反了或者芯片挂了。检查D上拉电阻如果是全速设备STM32F103C8T6需要使能内部上拉或者外部加1.5kΩ上拉。检查USB时钟配置STM32的USB外设需要48MHz时钟如果时钟不对USB压根不工作。换一根Type-C线试试有些便宜的线只有充电功能没有数据线。5.2 正插能用反插不能用这个问题基本可以确定是D D-只接了一面。检查A6/A7和B6/B7有没有都接到单片机的D D-上。如果只接了A面反插的时候主机切换到B面设备端没接自然就不通信了。还有一种可能是CC1和CC2只接了一个电阻。正插时主机检测CC1有电阻识别成功反插时主机检测CC2没电阻识别失败。所以CC1和CC2都要接电阻。5.3 充电头不输出5V有些充电头特别是氮化镓充电头需要检测到CC下拉电阻才输出。如果你只接了VBUS和GND没接CC电阻充电头就认为没有设备插入VBUS输出为0。解决办法就是在CC1和CC2上各接一颗5.1kΩ电阻到地。还有一种可能是充电头支持PD协议但你的CC电阻值不对。有些充电头只认5.1kΩ你接22kΩ它就不输出。所以先用5.1kΩ试不行再换。5.4 通信不稳定传大数据老出错这个问题通常是信号完整性问题。排查方向D D-走线是否等长长度差最好控制在5mm以内。D D-是否靠近高频信号线比如时钟线、PWM线。如果靠得太近容易串扰。电源是否干净VBUS上有没有加滤波电容我一般会在VBUS和GND之间加一颗10uF和一颗0.1uF电容。地平面是否完整如果地平面被分割回流路径变长信号质量会变差。5.5 常见问题速查表现象可能原因排查方法解决方案插上没反应CC电阻未接或虚焊量CC对地电阻补焊或更换5.1kΩ电阻VBUS无输出充电头需要CC检测量CC电阻加5.1kΩ下拉电阻正插能用反插不能D D-只接一面检查A6/A7和B6/B7两面都接到单片机枚举失败D上拉缺失量D对3.3V电阻加1.5kΩ上拉或使能内部上拉通信不稳定走线不等长或干扰示波器看眼图改短走线、加共模电感芯片发热VBUS电压过高量VBUS电压检查PD诱骗配置加降压电路6. 几个容易忽略的细节与个人经验6.1 关于CC电阻的精度和温漂CC电阻虽然只是用来做连接检测但它的精度直接影响主机对设备的识别。我用过5%精度的电阻在某些充电头上会出现识别不稳定的情况换成1%精度的就好了。另外电阻的温漂也要考虑特别是如果板子工作在高温环境温漂大的电阻可能会导致CC电压偏移主机误判。我一般用厚膜电阻温漂在100ppm/℃以内够用了。6.2 关于Type-C母座的选择市面上的Type-C母座质量参差不齐我踩过几次坑。有些便宜的母座引脚镀层很薄插拔几十次就氧化了导致接触不良。还有些母座的外壳和引脚之间的绝缘电阻不够容易漏电。我一般选品牌货比如正凌、连展或者TE的虽然贵一点但稳定。另外母座的固定脚要焊牢不然插拔的时候容易把焊盘扯掉。我见过有人用502胶水粘母座结果胶水渗到引脚上直接短路了。6.3 关于VBUS的滤波VBUS上一定要加滤波电容我一般用一颗10uF的钽电容或者MLCC再加一颗0.1uF的陶瓷电容。钽电容的ESR低滤波效果好但要注意耐压至少10V以上。MLCC的话注意直流偏压效应比如一颗10uF的0805 MLCC在5V偏压下实际容量可能只有5uF。所以如果空间允许我建议用两颗10uF并联或者用一颗22uF的。6.4 关于D D-的ESD保护USB接口是静电敏感区域插拔的时候很容易引入静电。我一般会在D D-上各加一颗ESD保护二极管比如USBLC6-2SC6它能同时保护D D-和VBUS。如果不加芯片的USB引脚可能会被静电打坏。我试过不加保护结果STM32的USB引脚挂了换芯片才好。所以这个钱不能省。6.5 关于PCB打样前的检查画完板子之后我一般会做以下几项检查用万用表蜂鸣档量CC1和CC2对地电阻确认是5.1kΩ。量D和D-对地电阻确认没有短路。量VBUS和GND之间电阻确认没有短路。检查Type-C母座的封装是否正确特别是引脚编号有没有搞反。检查丝印确保CC1和CC2标注清楚方便焊接。这几项检查花不了几分钟但能避免很多低级错误。我有一次就是封装画反了结果打样回来母座焊不上去只能飞线特别难看。6.6 关于成本控制如果你只是做几个样板Type-C母座和CC电阻的成本可以忽略不计。但如果你要量产就要考虑成本了。16Pin的母座比24Pin的便宜不少如果你不需要高速数据16Pin的够用了。CC电阻的话5.1kΩ 1%的0402电阻批量采购也就几厘钱一颗。PD诱骗芯片的话CH224K大概几毛钱FS312稍微贵一点。整体来说换Type-C接口增加的成本很低但用户体验提升很大我觉得很值。最后再分享一个小技巧如果你手头没有5.1kΩ的电阻可以用两颗10kΩ并联得到5kΩ虽然不太标准但大多数情况下也能用。我应急的时候这么干过识别没问题。但正式产品还是用5.1kΩ 1%的别省这个钱。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进