ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CH552G免晶振单片机最小系统设计与USB应用实践

CH552G免晶振单片机最小系统设计与USB应用实践 1. 为什么把CH552G当“免晶振单片机”用最近在折腾USB小工具翻遍手头的MCU发现一个挺有意思的现象STM32F103C8T6用的人多但你要让它跑USB还得配一个8MHz的外部晶振加上两个负载电容再考虑晶振布局和走线一个最小系统板画出来光晶振那一坨就占了不少面积。后来我换了颗CH552G整个板子缩小到原来的三分之一元器件数量也少了一大截最关键的是——这颗芯片居然不需要外部晶振就能跑USB。CH552G是沁恒出的一款增强型E8051内核单片机最吸引我的几个点内置24MHz RC振荡器出厂校准后在25℃环境下精度能到±0.5%左右如果跑USB模式并且开启自动校准可以根据USB主机发送的SOF信号实时校准内部时钟精度可以进一步提高到±0.25%。这意味着你完全可以不焊晶振直接让芯片跑USB协议枚举成功率很高。对于那些对成本敏感、板子尺寸要求苛刻的项目这个特性基本上就是刚需。另外它内部还集成了USB控制器和收发器D/D-直接引出来就能接USB座子不用额外挂USB转串口芯片。和STC89C52这种老古董比它有1KB的xRAM和256B的RAM16KB的Flash用来写USB HID设备、USB转串口这类固件绰绰有余。价格上散买一两块钱一颗比STM32F103C8T6动辄五六块的成本低得多。适合谁用呢我总结了几类场景做USB小外设键盘、鼠标、手柄、自定义HID设备、做USB转串口工具、做低成本USB下载器、或者只是想在项目里快速集成一个USB接口而不想为晶振布线和时钟问题操心的人。硬件工程师拿它做小批量产品业余爱好者拿它做DIY都非常顺手。2. 最小系统的完整电路设计与原理2.1 CH552G最小系统的组成常规意义上的“单片机最小系统”至少包括电源、复位、时钟、下载电路这四块。CH552G把时钟做进了芯片内部所以最小系统可以精简成电源去耦、复位电路、USB接口电路、以及可选的下载控制电路。下面是每个模块的详细设计思路。先说电源。CH552G工作电压范围标称是2.3V到5.5V但如果你想用USB功能必须老老实实给它供3.3V。为什么因为芯片内部的USB收发器是3.3V供电的VUSB引脚和内部稳压器都是围绕3.3V设计的。直接拿5V怼VCCUSB功能大概率不正常芯片还可能过热。所以我的做法是在板子上放一个AMS1117-3.3或ME6211之类的LDO输入端接5VUSB VBUS输出3.3V给VCC。如果你有现成的3.3V电源轨跳过LDO直接供电也可以只要保证纹波别太大。再说复位电路。CH552G的RST引脚是低电平复位我习惯用10kΩ电阻上拉到VCC再并联一个100nF电容到地这样上电时RC延时能保证复位信号稳定。这个电路虽然简单但千万别省。我见过有人直接把RST引脚悬空结果芯片上电时序不对偶尔出现进不了BootLoader的情况排查起来非常头疼。时钟电路这块因为芯片内置RC振荡器你只需要在固件里通过配置字选择合适的时钟源和频率。CH552G内部有24MHz、16MHz、8MHz等几档可选。我用得最多的是24MHz模式配USB功能刚刚好——12Mbps全速USB位时钟直接从24MHz分频出来很干净。USB接口电路是整个方案的核心。CH552G的D和D-是P3.1和P3.0引脚的复用功能直接连到USB座的对应引脚就行。注意一点CH552G内部已经集成了D引脚的1.5kΩ上拉电阻不需要像STM32那样在外面额外焊电阻。你唯一要处理的是Ucap引脚这是芯片内部USB稳压器的输出需要接一个1μF到2.2μF的陶瓷电容到地。这个电容比较关键如果容值偏小或者电容质量差USB枚举时可能出现供电不稳、识别不到设备的怪毛病。下载电路也很简洁。CH552G支持USB下载和串口下载两种方式。USB下载是最省事的先把RST引脚拉低再放开让芯片进入BootLoader模式然后用沁恒的WCHISPTool工具通过USB线直接烧录。串口下载则需要把P3.2或BOOT引脚在复位时配置为特定电平通过UART引脚下载这种方式适合没有USB环境的老设备。我实际用下来USB下载体验最好不需要额外买下载器一根USB线全搞定。2.2 电源与去耦的细节处理玩单片机的人都知道“芯片不工作先量电源电源干净了再看信号”。CH552G对电源质量并不是极度敏感但有几个细节值得注意。第一个是VCC引脚的去耦电容。我习惯在VCC和GND之间放一个10μF的钽电容或陶瓷电容做储能然后紧挨着芯片VCC引脚放一个100nF的MLCC做高频去耦。两个电容各司其职10μF管低频波动100nF管高频噪声。去耦电容离芯片引脚越近越好最好控制在3mm以内走线尽量短粗。第二个是Ucap引脚。这个引脚是USB收发器内部稳压器的输出数据手册明确要求接1μF电容到地。我实测过如果省掉这个电容USB设备枚举十次有七八次会失败而且每次失败的阶段还不一样有时候是设备描述符读不出来有时候是D上拉信号不稳定。老老实实焊一个1μF的X7R陶瓷电容位置紧贴Ucap引脚。第三个是地平面。对于这个极简方案双面PCB板我建议底层尽量铺地铜并且把过孔均匀分布在芯片周围这样做既能减小地回路电感又能给USB信号提供清晰的回流路径。如果你做两层板顶层走信号底层整片铺地效果就非常理想了。2.3 ISP模式与一键下载控制这里展开说一下CH552G的ISP下载模式因为这是很多新手容易懵的地方。CH552G出厂时BootLoader就已经烧录在芯片内部了你通过USB方式烧录用户程序时需要让芯片上电后进入BootLoader而不是直接跑用户程序。进入ISP模式的操作序列是先断开芯片供电按住下载按钮将RST引脚拉低然后插入USB线或者先插USB线再短接RST到地再断开芯片检测到RST引脚出现特定时序后停留在BootLoader区域等待主机下发固件。如果你觉得手动复位太麻烦可以在原理图上增加一个三极管或MOS管来自动控制RST。比如用一颗NPN三极管基极接USB转串口的DTR信号集电极接RST发射极接地。沁恒的WCHISPTool支持通过DTR/RTS信号自动控制复位进入ISP模式这样你就能实现类似Arduino的一键下载体验。我实际搭过这个电路烧录成功率和手动复位几乎一样高强烈建议批量生产时加上。3. PCB布局实操要点与避坑指南3.1 整体布局思路与最小尺寸CH552G的封装是SOP16或TSSOP20看具体型号后缀我常用的是TSSOP20封装的CH552G引脚间距1.27mm手工焊接比较友好体积也不算大。整个最小系统板如果做得紧凑大概可以控制在15mm×25mm以内甚至更小。我的布局习惯是以USB座为“锚点”因为USB座是物理接口位置固定其他器件围绕它旋转对齐。USB座放板边D和D-走线从USB座出来之后优先朝CH552G的对应引脚方向走中间不要拐弯太多尽量短。然后芯片紧挨着USB座放VCC去耦电容和Ucap电容贴着芯片对应引脚放。一个容易犯的错误是把LED指示灯放得离芯片太近甚至挤到了USB差分线的走线通道上。我的建议是LED和限流电阻可以放板子另一侧或者放到板边较远位置别让它干扰USB信号走线的连续性和地平面的完整性。3.2 USB差分走线与包地处理很多人在设计USB电路时对差分走线要求很高实际上对于全速USB 12Mbps来说要求并没有想象中那么苛刻。CH552G的全速USB信号上升沿大约在几纳秒量级虽然不算极快但还是建议按差分线对待。差分线的核心原则是“等长、等距、同层、避开噪声源”。USB座到芯片引脚的这段线尽量做到D和D-长度一致避免时钟偏斜导致眼图劣化。间距方面常规做法是让差分线间距等于线宽比如8mil线宽8mil间距组内耦合比较好抗共模干扰能力也强。如果板子空间实在紧张可以稍微放宽到10mil间距无伤大雅。包地是什么就是把USB差分线的两侧和上下层用地铜包裹起来形成一个屏蔽结构。具体操作是差分线两侧各留一段大于等于线宽的地铜带并在走线沿途打地过孔把顶层和低层的地连接起来。这样外部干扰很难耦合进USB信号线信号完整性会好很多。对于CH552G这种集成度高的芯片包地不是必须的但如果你的板子周围有电机、继电器、开关电源这类强干扰源做了包地心里踏实得多。3.3 晶振不存在的布局红利由于CH552G不需要外部晶振我们至少省掉了三样东西晶振本体、两个负载电容、以及晶振周围预留的禁布区。你可别小看这三样东西常规的8MHz晶振加上匹配电容在PCB上大概要占6mm×8mm的面积而且在晶振下方和周围通常要禁止铺铜腾空一片区域防止寄生电容影响起振。免晶振设计直接把这块面积全部省出来你甚至可以在这个位置放连接器或者更大的滤波电容布局灵活度瞬间提升。我做这块最小系统板的时候因为板子角落多了一块空间干脆放了一个Micro USB转杜邦线的排针方便调试时接逻辑分析仪和串口模块这要是放在晶振方案里板子还得再大一圈。3.4 铺铜、过孔与焊接便利性PCB布局另一个值得注意的点是铺铜方式。如果你的板子主要器件都在顶层底层可以直接整片铺地但要注意在焊接面底层的焊盘附近最好用热焊盘或十字花连接避免大面积铜直接把焊盘的热量吸走导致焊接温度不够、虚焊。我在早期版本踩过这个坑底层铺铜铺得太“实”回流焊时AMS1117的地引脚死活不吃锡后来改成十字花连接才解决。过孔方面我建议在USB差分线两侧每隔3-5mm打一个地过孔孔径0.3mm外径0.6mm这种小孔不影响走线密度又能保证顶层地铜和底层地铜连接顺畅。此外在芯片的地引脚附近也打两三个过孔减少地弹效应尤其是USB信号切换时电流突变如果地阻抗偏高D/D-的参考电平就可能抖动导致枚举不稳定。3.5 一个可以直接抄的布局顺序第一步固定USB座确定板边到USB座的距离保证插拔顺手。第二步放CH552G让D/D-引脚朝向USB座缩短走线。第三步放Ucap电容紧贴芯片对应引脚走线越短越好。第四步放VCC去耦电容先放100nF贴芯片再放10μF稍远。第五步放复位电路10kΩ上拉电阻和100nF电容随意但别绕到USB差分线中间去。第六步放LDO输入输出电容紧贴LDO的输入输出引脚。第七步放LED和限流电阻安排到板边。第八步底层铺地打地过孔检查USB差分线是否被其他走线跨越。4. 常见问题与排查技巧实录4.1 芯片发热USB识别不到这个现象我遇到过两次原因都出在电源上。第一次是VCC直接接到了5V芯片没烧但发热很厉害USB怎么枚举都不成功。后来查了数据手册才发现USB模式必须用3.3V赶紧把电源改成LDO输出问题解决。第二次是LDO布局太远USB收发器拉电流时电压跌落严重USB信号眼图闭合设备无法识别。解决方案是缩短LDO到芯片的走线加粗电源线并在芯片VCC引脚再补一颗100nF电容。排查思路先量芯片VCC电压是否为3.3V再看芯片温度是否异常排除硬件短路风险最后用示波器观察USB D/D-是否有数据波形。如果D有波形但D-没有多半是芯片没进入USB模式检查Ucap电容和VUSB引脚。4.2 下载程序时进不了BootLoaderCH552G进入ISP模式需要RST引脚出现低电平脉冲。如果你的板子没有做下载按钮可以在VCC和GND之间接一个轻触开关一端接RST另一端接GND上电后按一下这个开关再松开芯片就进入ISP模式了。我自己用下来这个方案简单粗暴但是有个问题如果按键抖动或者按的时间太短芯片可能没检测到复位脉冲导致下载失败。更好的方案是用软件的DTR/RTS自动复位电路也就是前面提到的三极管方案。如果自动复位还是失败检查三极管基极电阻是否太大驱动电流不够会导致集电极无法完全导通RST引脚没有被彻底拉低。建议基极电阻用1kΩ到4.7kΩ别用10kΩ以上。4.3 USB枚举失败设备描述符请求失败这类问题基本集中在Ucap电容和USB走线。Ucap电容如果没焊或者虚焊芯片内部稳压器输出纹波会很大USB主机端的枚举时序就会乱掉。用万用表量Ucap引脚对地电压正常应该在1.8V到2.0V左右如果偏离太大基本就是电容问题。另一种情况是D/D-走线太长或者被其他高频信号干扰导致USB信号质量不佳。我建议D/D-走线控制在10cm以内越短越好并且两侧做好包地。如果走线必须穿越其他信号尽量用多层板让USB布线单独走在内层或顶层地平面做隔离。4.4 程序跑飞复位不断LED闪烁异常排除电源因素后大概率是看门狗或时钟配置问题。CH552G的看门狗默认开启如果你在程序里没有定期喂狗芯片就会一直复位。解决办法是在初始化代码里关闭看门狗或者在主循环中及时喂狗。另外如果你配置了内部RC振荡器但是配置字写错了可能导致芯片运行频率异常表现为LED闪烁频率和预期差很多。排查方法接上调试器或逻辑分析仪观察RST引脚波形。如果RST持续出现低电平脉冲说明复位循环在触发多半是看门狗或外部复位干扰。如果RST稳定在高电平芯片在运行但行为异常就去查固件里的时钟配置和GPIO初始化。5. 从最小系统板到具体应用一个最小系统板设计出来如果不能快速验证固件就没有意义。我把这块板子打样回来后第一个固件是经典的“Blink”用来确认芯片能跑、能下载、电源稳定。然后我快速写了两个实用工程一个是USB转串口模块一个是USB HID键盘两个工程都能在WCHISPTool里一键下载整个过程非常丝滑。5.1 USB转串口一个立刻能用的工程CH552G的两路UART可以配置为标准串口通过USB枚举为虚拟串口设备。在电脑上装好WCH的驱动插上USB线就能看到新增一个COM口。我在实际项目里用它连接ESP8266模块调试AT指令效果比市面上的CH340模块好不少因为芯片直接内置USB少了一层桥接芯片的功耗和延迟。配置要点在初始化代码里调用USB库的初始化函数配置串口波特率然后在主循环里做数据转发——把USB接收到的数据写到UART TX把UART RX接收到的数据上传到USB端点。CH552G的数据手册里附带了完整的转发例程直接改改引脚定义就能用。5.2 USB HID键盘免驱的快捷操作器另一个常用场景是DIY一个自定义HID键盘用来触发快捷键、宏命令等。CH552G枚举为USB HID设备不需要安装驱动Windows、macOS、Linux都能直接识别。我做过一个三键宏键盘每按一下发一整套组合键办公效率提升明显。在这个工程里最需要注意的是HID报告描述符的编写。描述符写错了主机可能识别不到设备或者按键无响应。建议参考官方HID键盘例程不要自己从零编写描述符里面的Usage Page、Usage ID之类字段很容易出错。5.3 与STM32F103C8T6方案的对比如果手头有STM32F103C8T6最小系统板也可以做类似的事情但整体BOM和布局复杂度完全不同。STM32F103C8T6要跑USB必须外接8MHz晶振因为它的USB外设是依赖PLL倍频出来的48MHz时钟的没有外部晶振做参考内部RC振荡器精度不够USB枚举成功率会明显下降。就算你给STM32加上了晶振还需要处理VBUS检测、D上拉电阻部分最小系统板已经内置等一堆外围电路。而CH552G的方案一颗芯片加几个电容电阻直接从PCB上把晶振相关的成本、面积、故障点全部消灭掉。在USB小工具这个细分场景里我认为CH552G是目前性价比很高的选择。6. 最后想说的几点心得做了好几版CH552G最小系统板之后我最大的感受是“少即是多”。省掉晶振不只是一个元器件的取舍它改变的是整个设计流程你不用纠结晶振引脚负载电容该选多少、晶振走线要不要包地、晶振底下要不要挖空铜皮这些在传统MCU设计里非常耗时的问题在CH552G上统统不存在。整个PCB布局的重心可以全部放在电源干净和USB信号完整上设计压力小了一大截。如果你准备自己做板子我建议第一版先按最标准的方式做——LDO供电、10kΩ复位上拉、1μF的Ucap电容、100nF去耦、USB差分线包地。不要一上来就追求极限尺寸把板子画得密密麻麻不利于排查问题。跑通一个Blink和USB枚举之后再慢慢压缩尺寸、砍电容、优化布局这个迭代过程会对你理解USB电路设计帮助很大。另外说句实在话CH552G的资料和例程相对丰富但网上关于它最小系统的系统讲解还是偏少很多细节是踩坑踩出来的。我这篇把原理图和PCB布局的关键点都讲透了希望能帮你少走几步弯路如果你也在这个芯片上做出什么有意思的USB小工具欢迎来交流。
返回列表