ARTICLE DETAIL

资讯详情

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

CW32+CH340N打造四路USB转串口COM口状态可视化集线器

CW32+CH340N打造四路USB转串口COM口状态可视化集线器 如果你和我一样桌上常年躺着几块开发板、一个ST-Link、一个逻辑分析仪、几根USB转TTL那一定经历过这个场景插上一根USB线打开串口助手下拉框里冒出一串COM口但你盯着COM3、COM5、COM8看了半天就是想不起来哪个口对应哪块板子。运气好试两次能蒙对运气不好就把固件下载到了隔壁同事的板子上。这个“CW32COM端口号可视化集线器”就是专门解决这个痛点的东西。它的核心思路不复杂用一颗CW32单片机做控制和显示前面加一颗USB Hub芯片把电脑的一个USB口扩展成四个下行口每个下行口接一路CH340N USB转串口再把每一路的“端口占用状态”和“数据收发状态”实时显示在OLED屏幕上。这样你每次插上设备不用开设备管理器不用猜眼睛扫一眼就知道哪个口被打开过、哪一路正在跑数据。这篇文章从硬件角度把这个项目拆开讲方案架构为什么这么定、每一颗芯片选型和外围电路怎么算、PCB Layout有哪些注意点、调试过程中最容易翻车的地方在哪。适合想复刻这个集线器的人也适合对USB转串口电路、USB Hub设计、CW32开发感兴趣的朋友。1. 这个盒子到底是怎么工作的方案定位与整体架构1.1 多USB设备的COM口混乱是每个调试者的日常噩梦搞嵌入式开发的人桌上最常见的配置基本是一个调试器ST-Link/DAP-Link、一块或几块ARM/ESP开发板、一个USB转TTL模块、有时候还有一个USB转CAN或者逻辑分析仪。这些设备插到电脑上以后Windows会分别分配一个COM口。问题就出在这COM口编号是Windows按枚举顺序和注册表信息动态分配的跟你插哪个USB口、先插还是后插都有关系毫无规律。我实际工作中最头疼的还不是“找COM口”而是“串口被占用”。比如某一路串口被一个软件占用着你又拿另一块板子插上去结果下载工具找不到目标设备。搞到最后每次接新设备都要跑到设备管理器里一个个看、一个个试纯纯浪费时间。做这个集线器的初衷就是把这个过程变成“插上就能看见”。1.2 为什么是“CW32 USB Hub 多路CH340”而不是别的组合很多人可能会说Windows不是有设备管理器吗软件也能看到串口号何必做个硬件盒子设备管理器和各种串口工具软件确实能看COM口名称但它们有一个天然缺陷它们只能显示“系统里有几个COM口”不能告诉你“物理上这路COM口连的是哪块板子”。尤其当你在同一个USB Hub上挂了多个相同型号的USB转串口模块时软件列表里就是一串长得一模一样的“USB-SERIAL CH340 (COMx)”没有物理对应关系。这时候硬件方案的优势就出来了。做一个带显示功能的集线器把4路USB转TTL并排固定在一个盒子里每一路对应一个被OLED和LED实时监控的通道。哪一路在被上位机占用、哪一路有数据在跑一眼就知道。同时把4路串口固定在集线器上比每次临时插拔一条USB转TTL线要稳定得多接口接触也更可靠。至于为什么选CW32做主控几个原因CW32F030系列是ARM Cortex-M0内核主频48MHzFlash最大64KB3路UART、多路GPIO做这个项目的“状态采集OLED显示”绰绰有余。关键是它便宜、供货稳定资料也开放不像某些型号要签NDA才给全套手册。同类的STM32F030也能干这活但CW32在国产MCU里性价比确实能打。1.3 整机功能拆解硬件能显示什么不能显示什么这个盒子的整体数据流是这样的PC的USB口 → USB Hub芯片扩展成4个下行口 → 每个下行口接一颗CH340N USB转串口芯片 → CH340N的TXD/RXD接到外部目标设备。同时CH340N的TXD、RTS等信号被引到CW32的GPIO上CW32通过电平判断和外部中断统计得出每路的状态然后显示在OLED上。这里必须先把话说清楚避免很多人复刻时产生误解CW32作为USB设备侧的单片机是读不到Windows分配的COM口编号的。COM口号是主机操作系统在USB枚举后根据注册表规则动态分配的数值它只存在于操作系统层面。一颗USB转串口芯片根本不知道自己在Windows里叫COM几。所以“COM端口号可视化”这个目标纯靠单片机硬件层无法100%实现除非配合上位机脚本把COM编号映射回传。因此这个项目的硬件部分核心可视化内容是两件事每路USB转串口是否被上位机“打开/占用”——通过检测CH340N的DTR#/RTS#引脚电平变化来实现因为大部分串口助手在Open串口时会拉低这些控制线。每路USB转串口是否正在收发数据——通过CH340N的TXD/RXD数据线上是否存在电平跳变来判断有跳变就说明该通道有数据在流动。这样至少能回答两个关键问题“这条口插了没插”和“这条路通没通”。至于真正的“COM3是第几路”我后面会讲怎么用最轻量的上位机辅助实现但硬件层面做到上述两点已经能解决80%的调试痛点。2. 核心硬件电路详解每一路信号都算清楚2.1 USB Hub芯片选型与外围电路SL2.1A的接线细节USB Hub芯片是整个集线器的“分线器”。目前市面上用得最多的低成本USB 2.0 Hub芯片有三颗SL2.1A、HS8836A、FE1.1s。参数基本类似支持4个下行口、内置5V转3.3V的LDO、需要一个12MHz外部晶体、符合USB 2.0 Full-Speed规范。我这里用SL2.1A举例因为它的参考设计多、封装相对好焊。SL2.1A的外围电路非常简单主要包括上行口UP的D/D-直接接到USB座外部并一对ESD保护二极管比如USBLC6-2或便宜的LESD5D5.0CT再串一颗共模电感实际调试下来如果不加共模电感USB线稍微长一点就可能枚举失败。下行口DOWN1~DOWN4的D/D-分别接到4颗CH340N的UD/UD-。注意Hub下行口的D/D-方向是“Host端视角”CH340N的UD/UD-是“Device端视角”二者交叉对应但信号名称都是D/D-直接连就行。每个下行口的VBUS给CH340N供电建议每路加一个500mA自恢复保险丝PPTC防止外部目标设备短路把整个Hub拖死。我第一版没加保险丝有一次目标板电源短路5V线直接发烫还烧了一个Hub芯片。加PPTC之后短路顶多是那一路断电不影响其他三路。晶体建议用12MHz、负载电容18pF的贴片晶体两个引脚的负载电容按晶体手册选一般12~22pF都可以实际使用18pF最稳。晶体下面不要铺铜也不要走其他信号线。2.2 CH340N的用法内置晶振、交叉串口与电平匹配选CH340N而不是CH340G或者CH340C最大的理由是CH340N内置晶振不需要外部12MHz晶体SOP8小封装占板面积小。做4路集线器如果用CH340G一颗芯片就得配两个负载电容和一个晶体4路就是一大堆外围元件纯属给自己找麻烦。不过CH340N的引脚比较密SOP8是0.65mm脚距手工焊接需要点耐心后面章节我会专门讲焊接调试顺序。CH340N的串口信号命名要从PC视角理解这是新手最容易踩坑的地方CH340N的TXD引脚是CH340N向外发送数据的脚也就是连接到外部目标设备的RXD。CH340N的RXD引脚是CH340N接收外部设备数据的脚连接到外部目标设备的TXD。即CH340N.TXD → 目标板.RXDCH340N.RXD → 目标板.TXD二者交叉。这个交叉关系我第一版PCB画反了结果上电之后只能收不能发排查了半天才发现是TXD和RXD在图纸上标反了。这种问题用逻辑分析仪一下子就能看出来但纯靠万用表量电平很难发现因为空闲状态下TXD/RXD都是高电平。电源方面CH340N支持3.0V~5.5V供电IO电平跟随VCC。我强烈建议整板统一用3.3V给CH340N供电原因很简单CW32是3.3V器件如果CH340N用5V供电它的TXD输出高电平就是5V直接怼到CW32的GPIO上虽然M0内核的IO多数是5V容忍具体要看数据手册CW32F030是支持FT的但OLED、其他逻辑电路不一定受得了。统一3.3V供电后所有IO电平天然匹配不用额外加电平转换芯片省事很多。2.3 CW32F030主控周边设计电源、调试口与引脚分配主控我选的是CW32F030C8T6LQFP48封装64KB Flash、8KB RAM。有人可能会问这么一个简单功能用8脚的单片机不够吗不够。因为要同时接4路CH340的RTS#检测、4路CH340的TXD活动检测、OLED的I2C、3个按键、4个状态LED外加SWD调试口算下来GPIO需求在20个左右。LQFP48的F030C8T6有40个可用IO怎么分配都宽裕后续想扩展功能比如给每路加电平指示灯也不用抠引脚。CW32周边电路有几个要注意的点复位CW32F030的NRST引脚内部有上拉外部接一个0.1uF电容到地即可。如果电源质量不好建议再并一个几微法的电解电容防止上电瞬间复位不可靠。BOOT引脚CW32的BOOT0下拉到地不要悬空悬空可能导致上电进Bootloader。电源滤波每个VDD引脚就近放0.1uF电容这是基本功但CW32这类国产MCU的电源引脚比较少很多人会忽略导致ADC不稳或者Flash偶尔读写失败。调试口SWD保留出来PA13/PA14如果是SWD引脚建议串330欧电阻再接调试器防止调试器带电插拔把MCU打坏。2.4 电源树与电流预算一个USB口供电能不能扛得住这个项目的电源全部来自PC的一个USB口标准USB 2.0口最大输出500mAUSB 3.0口一般是900mA使用Hub外接供电则另说。很多人不看电流预算直接往上堆芯片最后发现插到老电脑的USB 2.0口上设备反复掉线。我们来算一笔账器件典型工作电流SL2.1A Hub芯片约30mACH340N × 4每颗约15~20mA合计约80mACW32F030C8T6约10~20mA外设全开OLEDSSD1306约15~25mA全亮状态LED × 4每颗约2mA合计约8mA其他损耗约10mA合计大约160~180mA。这个量级在USB 2.0的500mA预算之内还有接近三倍的余量理论上很安全。但要注意如果你同时给4路CH340挂满外部设备并且外部设备是直接从CH340的VCC引脚取电的比如有些目标板子用USB转TTL模块的3.3V供电那电流就要按外部负载重新算。我的建议是CH340N的VCC只给芯片自身供电不要把CH340N的3.3V引出去给目标板供电。目标板另外插电源或者从集线器外壳留一个独立的5V输出口。这样既保护PC USB口又能避免外部板子过流回灌损坏Hub。电源树设计上5V从USB座进来先经一颗1A的PPTC保险丝再到SL2.1A的VBUS输入SL2.1A内部LDO会生成3.3V给Hub逻辑和下行口的DP/DM上拉用。另外用一颗单独的LDO比如ME6211最大输出500mA压差小或AMS1117-3.3把5V降到3.3V给CW32、CH340N、OLED供电。注意不要偷懒直接把Hub芯片内部的3.3V拉出来给所有器件用因为SL2.1A的内置LDO电流能力有限实测只有约50~100mA外部器件多了会塌。3. COM口状态检测与OLED可视化逻辑3.1 一个关键认知MCU其实读不到“COM3”这个编号如果说这篇文章只能让人记住一个知识点我希望是这个USB转串口芯片作为一个USB Device根本不知道Windows给自己分配了哪个COM号。COM端口号是Windows在设备枚举时通过注册表里“USB\Vid_1A86Pid_7523”这个键下面记录的“Port#”来动态分配的它在主机侧、在注册表里不在设备侧、不在芯片里。所以任何声称“纯单片机硬件直接读出COM号”的方案都是不存在的。要实现真正的“COM3”显示必须有一条信息回传通道要么PC上的上位机软件读取注册表再把COM号通过UART发给CW32要么CW32模拟成一个HID设备让上位机通过HID通道把COM号返写回来。那两个方案都涉及上位机开发不是纯粹的硬件问题了。本文讲的“硬件可视化集线器”在不通上位机的情况下能做到的信息是这一路是否被打开DTR/RTS状态、这一路是否有数据活动TXD边沿检测。这些信息来自硬件本身稳定、实时、不依赖系统。3.2 用DTR/RTS和数据活动判断“被占用”和“有数据”很多串口助手软件比如XCOM、SSCOM、SecureCRT的某些配置在“打开串口”的瞬间会改变CH340的DTR#和RTS#引脚电平。串口处于默认状态时这两个脚一般是高电平软件打开串口后有的会拉低。基于这个现象CW32可以通过GPIO读取CH340N的DTR#或RTS#电平来判断“这个COM口是否被上位机占用”。但这个方案有个坑并不是所有软件打开串口都会拉低DTR/RTS。有些工具默认不操作这两个控制线或者用户自己关了DTR/RTS。为了增加可靠性我在设计上把检测做得更保守只要DTR#或RTS#中任意一根被拉低超过50ms就认为该路“被打开”。同时即使两个信号都没变化只要该路TXD上有数据边沿发生也认为该路“处于活跃状态”。TXD活动检测的硬件接法如下CH340N的TXD引脚除了连接到目标板RXD之外再走一根线到CW32的一个GPIO配置为外部中断下降沿触发。CH340N的TXD在空闲时是高电平每发送一个字节就会产生一组高低电平跳变最典型的就是起始位的下降沿。CW32每次检测到下降沿就刷新一次该路的活跃计数器。这个接法不需要额外电路因为CH340N的TXD是推挽输出直接并联到一个CMOS高阻输入引脚上没有问题但要注意不能把CH340N的TXD接到CW32的推挽输出脚上两个输出互怼会导致电流倒灌。3.3 OLED显示布局与刷新策略显示部分用0.96寸I2C接口的SSD1306 OLED128×64分辨率。这种OLED现在很便宜也就几块钱驱动芯片成熟资料多。显示布局我采用的是四行模式第一行标题“COM HUB v1.0”右侧显示系统运行时间或心跳符号。第二行通道1和通道2的状态比如“CH1: OPEN TX”和“CH2: ---”。第三行通道3和通道4的状态形式同上。第四行提示行显示当前是否有上位机连接如果CW32自己通过UART连电脑调试可以显示串口接收到的指令。SSD1306的I2C刷新率是个瓶颈I2C时钟100kHz前提下全屏刷新一张图大约需要150ms左右。如果每收到一个数据边沿就全屏刷新屏幕会闪成花屏。我的做法是只更新局部状态变化类比如某路从“空闲”变为“被打开”立即更新该路对应的那一小块显示区域。活跃计数类正在收发数据不实时刷新每个字节而是每200ms批量刷新一次把各路“是否有数据”汇总成一行更新。屏幕不需要长时间常亮可以做一个5秒无操作自动降低亮度这样既省电也能延长OLED寿命。3.4 指示灯和按键交互直觉化操作OLED显示信息密度有限我还在每一路CH340旁边放了一个单色LED作为快速状态灯。逻辑很简单LED常亮该路被上位机打开COM被占用。LED闪烁该路正在收发数据。LED熄灭该路空闲。这样哪怕不盯着屏幕很远瞄一眼指示灯就知道哪路在工作。按键方面我放了三颗一颗用来切换OLED显示方向正放/倒放方便盒子竖着或横着摆放一颗用来切换屏幕亮度等级还有一颗是复位键直接把CW32的NRST引出来。有人说复位键多余实际调试时非常有用尤其OLED驱动死机的时候不用拔电。4. PCB Layout和硬件调试实战记录4.1 USB差分走线与ESD防护12Mbps也没那么随便USB 2.0 Full-Speed是12Mbps虽然不像USB 3.0的5Gbps那样对阻抗匹配敏感到毫米级但也绝不能随便拉线。D/D-必须尽量等长、成对走线、少打过孔下面要有完整的地平面参考。我实际画板时用了双层板底层大面积铺地。D/D-走顶层线宽按8mil间距按6mil尽量短。虽然理论上有差分阻抗要求90欧但全速USB对阻抗的要求没有高速USB那么苛刻实测12Mbps在许多非精确匹配的双层板下也能正常工作。真正的杀手是D/D-绕了大圈、穿过分割地、或者附近有开关电源的噪声。我第一版就是因为D/D-从SL2.1A底下穿过去旁边正好是12MHz晶体导致Hub识别成功率只有60%。每个USB口都要加ESD保护至少上行口必须加。SL2.1A和CH340N的USB引脚抗静电能力有限而USB线缆是插来插去的带电插拔时很容易产生静电放电。推荐用USBLC6-2或者便宜的LESD5D5.0CT实在没有用一个BAT54S双二极管也能凑合。4.2 Layout布局顺序先把电源画稳再说信号画PCB的顺序我建议是电源 → 主控 → USB Hub → CH340N → 接插件 → 显示。电源走线要粗5V和3.3V主干至少1mm宽过孔多打几个。LDO输入输出的去耦电容要尽量靠近引脚最好是先过电容再进负载不要在电容后面绕一圈再回来。很多人画板喜欢把去耦电容放在芯片旁边但放得再近如果地回路绕远了也没用。USB Hub芯片的位置选在板子靠近USB座的一端4路CH340N朝下排列这样下行口的D/D-走线距离最短。CH340N的TXD/RXD/控制线到CW32的走线是低速信号没有太多讲究但尽量别和D/D-平行长距离走线减少串扰。OLED接口放在板子一角用4针排针引出VCC、GND、SCL、SDAI2C的SCL/SDA各加一颗4.7kΩ上拉电阻到3.3V。注意SSD1306模块很多自带I2C上拉如果你的OLED是那种带板的应该确认模块上是否已经焊了上拉电阻如果已经有板子上不要重复加上拉两颗并联会导致I2C上升沿变缓通信不稳定。4.3 焊接顺序与逐级上电调试法如果一次把全部元器件焊完再上电出了问题你根本不知道从哪查起。我的经验是分四步走先焊电源部分USB座、保险丝、LDO、去耦电容。上电后用万用表量3.3V是否正常确认无短路再往下走。再焊USB HubSL2.1A、12MHz晶体、上下行口、ESD。插到电脑上应该能在设备管理器里看到一个“USB 2.0 Hub”或者类似名字的新设备。这一步成功说明Hub的硬件和供电没问题下面的CH340才能被枚举。焊第一路CH340N只焊第1路的CH340N插上后设备管理器应出现“USB-SERIAL CH340 (COMx)”。如果没出现优先检查CH340N的电源、UD/UD-是否接反、芯片引脚是否连锡。依次焊剩下的CH340N和外围每焊一路都上电验证一次确认这一路出COM口了再焊下一路。虽然麻烦但能把问题控制在单个通道内。焊接CH340N这种SOP8小封装时我的习惯是先在PCB焊盘上均匀上锡再放芯片用热风枪280°C风速3档吹十几秒看到引脚上的锡融化润湿后移开。不要用烙铁硬推很容易把引脚推歪。焊完后用酒精清洗助焊剂再用放大镜检查有没有连锡尤其是UD/UD-这两个引脚一旦连锡USB就枚举失败。4.4 现场翻车记录一个枚举不稳案例的排查做完第二版样机后我遇到一个非常典型的问题Hub插到电脑上有时候能识别有时候不能识别到了以后4个COM口中偶尔缺一个。这个现象断断续续查了很久。排查过程是这样的先用万用表量各路3.3V正常量晶体两脚电压发现一个0.4V、一个0.2V左右似乎有振荡。但手里没有示波器只能靠排除法。后来把12MHz晶体换成新的问题依旧。最后定位到是USB座到SL2.1A之间的D/D-串联电阻问题。我第一版为了做ESD防护在D/D-上各串了一颗22欧电阻结果全速USB信号本身就比较“软”串了电阻之后更拉胯导致接收端眼图裕量不够。拆掉这两颗电阻再插电脑稳定多了。后来查SL2.1A参考设计才知道上行口D/D-一般是直连不加串阻最多加ESD管。串阻这个坑希望大家别踩。另外还有一个同样典型的坑Hub上行口的D和D-接反了。原理图和封装引脚脚位对不上上电后电脑完全没反应。USB是差分信号接反以后信号表现为共模主机识别不到。排查方法很简单量一下USB座D到Hub对应引脚的阻值通断关系一目了然。5. 常见问题速查与CW32实战心得5.1 问题速查表现象排查方向插上电脑完全没反应USB座D/D-是否接反Hub芯片电源是否正常晶体是否起振能识别Hub但一个COM口都没有检查CH340N的VCC、UD/UD-连接、引脚连锡有时候缺某个COM口对应CH340N的供电去耦是否到位D/D-走线是否过长COM口能识别但通信收发不正常查CH340N的TXD/RXD是否接反电平是否匹配目标板波特率是否一致OLED不亮或花屏I2C地址是0x3C还是0x3D模块供电是否3.3VSCL/SDA上拉电阻是否合适OLED亮但刷新卡顿I2C速度是否过低是否全屏刷新频繁某路LED常亮或常灭查DTR/RTS引脚连接或CW32 GPIO配置是否错误CW32程序不运行查BOOT0是否接地NRST是否被拉低SWD能否连接USB口供电发热严重是否有外部设备从CH340N取电检查PPTC是否失效板子有没有短路5.2 CH340N的序列号问题4个“同样”的COM口如何区分这个项目做出来以后你会发现一个尴尬的事实Windows设备管理器里4个CH340N显示的都是“USB-SERIAL CH340 (COM3/COM5/COM8/COM10)”名字完全一样你仍然不知道哪个COM号对应哪一路。原因前面说过CH340N默认没有唯一的USB序列号。Windows区分相同设备主要靠枚举顺序和USB端口位置。对于固定在集线器上的4路CH340它们分别连Hub的4个下行口Windows在注册表里是用“Port_#0001.Hub_#0002”这种键值来记录每个设备的位置的只是设备管理器不直接显示这个对应关系。硬件层面怎么辅助区分我做了三件事每路CH340的TXD/RTS/DTR信号引出到CW32时在OLED上固定显示“CH1~CH4”这样你知道物理顺序。在Windows设备管理器里手动把4个COM号改成自定义名称比如COM31~COM34或者根据你标签贴上“底板”“导航板”“雷达板”之类的备注。如果要做动态显示“第1路 COM3”就必须配合上位机脚本。最简单的办法是PC上跑一个串口小工具读取注册表里CH340设备的PortName值然后通过一路独立的UART比如CW32自己的UART调试口发一个类似“1:3,2:5,3:8,4:10”的指令给CW32CW32解析后显示到OLED上。这个上位机脚本用AutoHotkey或者C#写几十行就能搞定不复杂是“COM号真正可视化”的可行路径。5.3 CW32使用过程中的几点体会这几年用过不少M0内核的单片机包括STM32F0、NXP LPC82x、GD32E230CW32F030算是上手体验很顺畅的一颗。库函数的风格比较接近标准外设库不像一些国产芯片把寄存器包装得乱七八糟而且官方给的中文例程基本能直接跑。有几个细节提醒一下CW32的系统时钟初始化一定要自己确认好。默认上电可能是HSI 8MHz或者别的频率如果你直接按48MHz外设频率配置定时器波特率会偏差很大。CW32的GPIO翻转速度不是很快但做TXD下降沿检测足够。外部中断的手动清标志位很重要别忘了。如果下降沿中断检测不灵敏多半是漏清了标志位或者引脚没有配置为带上拉的输入。低功耗方面CW32F030做得不错但这个项目用不上低功耗反正插USB供电。烧录器用CMSIS-DAP或者J-Link都行SWD接口稳定。需要留意不要用太高SWD时钟有些国产调试器在48MHz主频下连接不稳定把SWD速度降到1MHz以下能解决绝大多数连接失败问题。就我个人而言做这个项目最大的收获不是把几个芯片连起来而是把“USB枚举”“COM口映射”“串口状态监控”这几个平时不太串在一起的概念彻底打通了。现在这个小盒子就焊在工位上插着4条不同用途的转接线oled屏上随时能看到哪路被占用、哪路在跑数据。那种每次插USB线都要去设备管理器翻一遍的日子算是彻底过去了。如果后续想继续玩可以把这个盒子扩展成RS485网关或者给每一路加上电平转换和供电控制可玩性相当高。
返回列表