
做硬件的朋友都清楚CAN总线这个接口协议不复杂、物理层也算“皮实”给人一种随便画块板子接两根线就能跑的感觉。可一旦把CAN接口的PCB Layout摊到Altium Designer里认真做一遍终端电阻放哪、差分线怎么走、什么时候必须算阻抗、叠层该怎么叠处处是门道。很多板子画完能跑但放到量产或过EMC时偶发通信失败、误码率偏高、辐射超标追根溯源往往就是布局布线时埋下的坑。这篇文章我以一块实际项目里的CAN接口板为例完整走一遍从原理图准备、叠层设置、阻抗匹配计算到Altium Designer里差分对布线的全过程。重点把“阻抗匹配”这件事讲透什么时候必须做、如何手算和用AD计算验证、最终怎么落地到具体线宽线距上。适合刚接触PCB Layout的新手也适合画过不少板子但想系统补一下CAN接口设计细节的工程师。1. 动手之前先把CAN的“脾气”摸清楚1.1 差分信号与120Ω终端为什么CAN长这样CAN的物理层是典型的差分电压传输。CAN_H与CAN_L两根线配合工作显性位时CAN_H拉高、CAN_L拉低差分电压大约2V隐性位时两根线都维持在2.5V附近差分电压接近0。由于信息承载在两根线的电压差值上外界的共模干扰会同时作用于两根线相减之后被抵消所以CAN的抗干扰能力天生就强。这也是为什么现场总线环境那么恶劣CAN依然能稳定工作的根源。也因此CAN总线两端必须各接一个120Ω终端电阻这是ISO 11898规范里的明确要求。为什么恰好是120Ω因为标准双绞线在常规线径、绞距和敷设条件下的特征阻抗大约就是120Ω。两端电阻并联之后信号从总线上任一点看进去双向阻抗等效为60Ω这样做能让信号传输到总线端点时被电阻吸收掉而不是原路反射回来产生振铃。少了末端电阻总线拉长、波特率拉高之后误码几乎必然出现。很多第一次画CAN板子的人会犯一个理解性错误认为120Ω终端电阻在原理图里随便放哪儿都行。实际上它匹配的是“电缆”的特征阻抗物理位置上应该靠近连接器让电阻和线缆之间不残留过长的PCB走线否则那段走线本身就成了一小段阻抗不连续区。1.2 什么时候要考虑“走线特征阻抗”接下来要区分清楚两件事上面说的120Ω终端电阻匹配的是外部总线线缆的特征阻抗而PCB Layout里面常说的“阻抗匹配”匹配的是板上那条差分走线本身的特征阻抗。这两个概念经常被混在一起讲但它们在不同场景下起作用。CAN的最高通讯速率是1Mbps从频率角度看并不算高PCB走线长度通常也就几厘米到十几厘米很多情况下不做严格的差分阻抗控制也能跑。但有一点需要清醒认识CAN收发器的电平跳变沿非常陡很多芯片的上升时间只有几十纳秒甚至更短这意味着信号的高次谐波能量远高于1MHz一次跳变会在走线上激起振铃和辐射。所以当你遇到下面这些情况就必须把CAN_H/CAN_L当成一对正经差分线来设计收发器芯片离接口连接器比较远板内走线超过10cmCAN信号需要经过背板、排线或跨板连接器传到另一块板系统要过正规的EMC测试或者布置在强干扰环境中板卡同时有多个CAN通道差分线之间的串扰必须受控。在这些场景下做走线特征阻抗控制再到终端电阻、滤波器件、参考平面一起配合才能保证设计稳定。这也是本文后面花大篇幅讲阻抗计算的原因。2. 原理图阶段埋下的伏笔AD里的差分对与关键器件2.1 收发器选型与外围BOM原理图阶段如果没把差分关系定义清楚到了PCB阶段再临时补会很绕。比较好的做法是在画原理图时就把CAN收发器、终端匹配、保护器件一次规划到位。收发器这块经典的TJA1050、TJA1040、SN65HVD230都还在大量使用实际项目里我更推荐带显性超时和低功耗模式的型号比如TJA1042或SN65HVD232引脚兼容性好外围也简单。选型时注意三点工作电压是3.3V还是5V是否集成终端电阻以及总线引脚上的ESD能力。收发器数据手册里会给出显性、隐性电平的Voltage参数这些是后面测试判断“地偏移”问题时的重要参考。外围器件我习惯在原理图中预留这几种靠近收发器VCC引脚的去耦电容0.1μF加10μF的组合、总线引脚对地的TVS管、总线串联共模电感以及可选的120Ω终端电阻用0Ω电阻或跳线做装配选项方便调试时切换终端匹配状态。在原理图里就把它们画好标注清楚“near connector”“near transceiver”的布局备注PCB阶段就不用拍脑袋。2.2 在AD中正确建立差分对Altium Designer对差分对的支持很成熟属于“原理图定义好、PCB自动识别”的工作流。第一步是给网络命名。AD靠网络名的后缀自动生成差分对推荐用_P和_N区分正负极性例如CANH_P、CANH_N也可用_H/_L但_P/_N最通用。第二步在原理图编辑器里执行 Place Directives Differential Pair把差分对标识符放到这两条网络引出线上。注意标识符要覆盖到网络名不要只放在引脚端。之后编译工程在 Messages 面板里能看到AD已经识别出一对名为 CANH 的差分对。第三步是在PCB编辑器里检查。打开 Design Classes切到 Differential Pair Classes确认自动生成的差分对类出现在里面。如果原理图阶段漏放了差分对指令也可以在PCB界面手动添加网络对但效率低能自动就自动。2.3 把120Ω终端电阻的归宿想清楚在原理图阶段就要决定终端电阻到底画不画进板子。如果这块板是总线中间的节点不画保持总线在外部线缆上首尾端接如果它本身就是总线末端的设备画而且电阻位置要标在靠近连接器处。还有一种常见做法是“半固定终端”用两个60Ω电阻串联后跨接在CAN_H与CAN_L之间中间点通过一个4.7nF左右的电容接地。这个分裂终端方案对共模噪声有一定滤除作用在EMC要求高的场合很好用。我一般在原理图上把电容设计成0402或0603封装装配时根据实际测试决定贴不贴。这些看似琐碎的决策都会直接影响后面PCB布局的走线路径和元件位置原理图阶段花几分钟标注清楚胜过PCB阶段返工。3. 阻抗匹配详解从叠层到差分阻抗3.1 阻抗匹配到底在“匹配”什么阻抗匹配的本质是让信号在传播路径上看到的瞬时阻抗尽量一致。信号沿走线传播时如果某一点阻抗突变一部分能量会反射回去剩下的继续前进造成波形振铃、过冲和边缘劣化。反射系数由突变处两边阻抗差决定差距越大反射越剧烈。对CAN这种带缓变沿的信号反射造成的后果不一定是立刻出错但会积累成误码、总线错误帧甚至让节点进入BUS-OFF。所以匹配的目标是让“收发器引脚 → PCB走线 → 连接器 → 外部线缆”这条完整链路里每个区段的特征阻抗相对稳定尤其是PCB走线段不要成为明显的异质区。这里要摆正心态CAN不用像射频电路那样较真到0.1dB反射差分阻抗落在90Ω到110Ω范围已经属于靠谱设计。标准值100Ω是设计目标实际板厂加工后控制在±10%即可。3.2 层叠方案选择1.6mm四层板怎么叠做阻抗匹配绕不开叠层设计。两层板虽然成本低但阻抗控制极其依赖底层是否有完整的地平面一旦信号穿过分割区参考平面断裂阻抗控制直接前功尽弃。所以我做CAN接口板只要空间和预算允许优先用四层板典型叠层如下顶层L1信号层放CAN差分线及其他高速信号第二层L2完整GND平面第三层L3电源平面底层L4信号层辅助走线这种Top-GND-Power-Bottom的叠层让顶层信号与第二层GND之间形成紧密耦合的介质层参考平面完整阻抗可预测。常见板厚1.6mm顶层到GND层的介质厚度大约0.15mm到0.2mm6mil到8mil具体由半固化片叠层决定。对CAN这种低速但边沿陡的信号1.6mm四层板完全足够不需要像DDR那样上更薄的介质。3.3 用AD自带的阻抗计算器定线宽线距Altium Designer的层叠管理器内置了阻抗计算功能操作路径是 Design Layer Stack Manager。在层叠界面里你可以设定每一层的材料、铜厚和介质厚度然后为某个信号层创建阻抗剖面。具体步骤大概是在Layer Stack Manager左侧选中信号层Top。点击Impedance Profile按钮进入阻抗剖面配置界面。添加一个Differential Pair配置输入目标差分阻抗100Ω。输入叠层参数介质材料FR4、介电常数4.2、介质厚度0.2mm、铜厚1oz约0.035mm。AD会根据内置计算模型给出推荐的线宽和线距。我实测下来在上述参数下AD给出的初始值通常在“线宽6~8mil、线距6~8mil”附近不同版本稍有差异。要注意AD的计算模型基于理想均匀介质忽略了绿油覆盖、玻纤布编织效应等实际因素所以它给的值是很好的初始参考但不能当最终交付依据。3.4 手算差分阻抗的工程估算不会手算的工程师不是一个靠谱的Layout工程师。虽然工具有效但理解公式背后的逻辑才能在工具结果异常时发现问题。对于四层板表层走线先算单端微带线阻抗常用近似公式为[ Z_0 \frac{87}{\sqrt{\varepsilon_r 1.41}} \cdot \ln\left(\frac{5.98 h}{0.8 w t}\right) ]其中 ( h ) 是信号层到参考平面的介质厚度( w ) 是线宽( t ) 是铜箔厚度单位都用mil( \varepsilon_r ) 是介质相对介电常数。然后由单端阻抗估算差分阻抗[ Z_{diff} \approx 2 \cdot Z_0 \cdot \left(1 - 0.48 e^{-0.96 \frac{s}{h}}\right) ]其中 ( s ) 是同一差分对内的线间距。这个公式是工程近似胜在快速直观。我常用的初始计算示例FR4板材 ( \varepsilon_r 4.2 )顶层到参考层高度 ( h 8\text{mil} )1oz铜厚 ( t 1.4\text{mil} )线宽 ( w 10\text{mil} )。单端阻抗算出来约为[ Z_0 \frac{87}{\sqrt{4.21.41}} \cdot \ln\left(\frac{5.98 \times 8}{0.8 \times 10 1.4}\right) \approx 36.7 \cdot \ln(5.09) \approx 59.8\Omega ]当线距 ( s 8\text{mil} ) 时差分阻抗[ Z_{diff} \approx 2 \times 59.8 \times (1 - 0.48 e^{-0.96}) \approx 98.4\Omega ]非常接近100Ω目标。这就是很好的起点。但要注意FR4实际介电常数常高于4.2可能在4.4~4.8之间最终会略微降低阻抗所以要把计算结果发给板厂复核他们最终给出的叠层参数和阻抗报告才是准的。3.5 和板厂对线宽线距时的沟通清单这块内容是我个人经验里特别想强调的。板厂做阻抗控制时不是只按你的线宽线距施工他们会用自己的叠层结构去反推。每一家板材库存、半固化片厚度都不同所以同一个线宽在不同板厂做出来的阻抗会有差异。和板厂沟通时我一般把信息一次性给全目标差分阻抗100Ω ±10%叠层要求总板厚1.6mmTop层到GND层介质厚度尽量控制在8mil附近铜厚表层1oz内层1oz板材常规FR4如生益S1141、介电常数按4.2计算差分线所在层顶层板厂通常会在工程确认单里回复他们算好的叠层和阻抗如果偏差较大我会调整布线规则而非强行要求板厂改用我指定的线宽毕竟板材是他们的渠道他们最清楚实际工艺窗口。4. 实操Layout从摆件到布线4.1 布局逻辑连接器、保护器件、收发器、隔离器原理图阶段规划好的器件在PCB上摆件时要按照“信号流向”排顺序。CAN信号从板外进来先经过连接器再经过TVS和共模电感然后到收发器的CANH/CANL引脚最后从收发器的TXD/RXD引脚连到MCU。这个流向不能在布局时打乱尤其不能让MCU和连接器之间隔着收发器却绕一大圈。实际摆件时我习惯先把连接器放在板边TVS和共模电感紧挨着连接器间距控制在2~3mm以内让外部信号一进来就立刻被保护器件接管避免在保护器件之前留下过长的“裸奔”走线。收发器放在共模电感之后尽量靠近连接器这一侧使得CANH/CANL从收发器出来后经过共模电感再到连接器的走线短而直接。如果MCU到收发器的TXD/RXD距离比较远走线超过几厘米也建议在MCU端增加串阻比如33Ω用来抑制信号过冲。这个串阻在原理图阶段要预留。4.1节补充一个小节电源与去耦布局收发器的电源去耦电容是最容易被忽略的。“画了就行”和“真正有效”差别非常大。0.1μF电容要放在收发器VCC引脚旁边过孔直接落到电容焊盘再到GND平面不要先走一段细细的线再经过孔否则高频噪声滤不干净。10μF的体电容可以放稍远一点但也要保证电源路径先经过它再到0.1μF形成两级去耦。很多CAN通讯偶发错误查到底其实是收发器电源纹波过大。布局时把电容和芯片的环路面积缩小比任何软件滤波都管用。4.2 差分对布的细节等长、等距、不跨分割在AD里给差分对布线推荐直接用交互式差分对布线工具路径是 Route Interactive Differential Pair Routing或者快捷键 DR然后点一下其中一条网络软件就会自动成对拉线。拉线过程中Tab键可以调出属性面板修改线宽和间距ShiftW可以快速切换预设宽度。差分对布线有几条硬性原则整对线尽量保持平行、等距间距不要忽宽忽窄等长是最低要求对于100Ω差分对长度差控制在5mil以内是理想值CAN速率下10mil以内也能接受。用 Rule 里的 Matched Lengths 规则设置长度差约束布线完成后再用 Tools Length Tuning 做蛇形补偿绝对不要跨越参考平面分割。如果第二层GND被电源或别的信号切开一条缝差分线跨越这条缝时回流路径被迫绕行阻抗突变和共模辐射同时出现。四层板里只要L2铺的是完整GND这个问题天然规避差分对内部线距由规则控制不需要刻意在一对内做“3W”那样的大间距。100Ω差分对的线距通常在线宽的1.5到2倍之间由阻抗计算决定每对CAN差分线之间要保持足够隔离距离组间距离至少做到20mil以上如果能到3倍于对内间距更好避免两对线互相串扰。我见过比较典型的错误是好不容易把一对CAN线画得横平竖直结果中间为了绕过电阻在某个地方把线距从8mil突然拉到20mil人为制造了一个阻抗突变点。完美的做法是宁可绕远一点也要保持整对线从起点到终点的截面几何一致。4.3 过孔、焊盘与参考平面的坑差分线如果必须换层过孔会引入寄生电容和阻抗不连续所以能不过孔就不过孔。实在要过孔有两个办法降风险一是成对打孔两个孔尽量靠近位置对称二是在过孔附近追加地过孔给回流信号提供较短的垂直路径。焊盘也是一个容易被忽略的阻抗突变点。收发器的SOP-8引脚焊盘比较宽和窄差分线之间过渡非常突兀。条件允许时从焊盘出线先走一小段与焊盘等宽的引线再逐渐收窄到目标线宽不要一上来就直角变成细线。连接器处的GND缝合也很关键。外部线缆的屏蔽层和GND相连时连接器周围多打几种地过孔形成“地栅栏”能把共模电流就近泄放到平面减少从连接器耦合进板内的噪声。5. 测试验证与常见问题5.1 用示波器测量CAN波形的电平与地偏移板子贴好、焊接完、下载好程序之后第一件事不是看能不能通讯而是用示波器量波形。CAN波形测量有固定套路示波器接两只10x探头CH1接CAN_HCH2接CAN_L地线夹都接到板子的GND触发方式设为单次或正常触发触发电平设在2V左右给总线发一组周期性数据帧观察显性和隐性电位的绝对水平和差分值。合格的波形应该是隐性时CAN_H和CAN_L都稳稳在2.5V附近显性时CAN_H抬升到约3.5V、CAN_L下降到约1.5V。如果CAN_H对地量出来是3VCAN_L只下到2V差分电压虽然正确但共模抬高这就是地偏移的典型表现。地偏移问题最直接的排查方法就是分别测两根线对本地GND的电压而不是只测差分波形。很多人在调试时习惯直接把CH1的参考地夹到CAN_L上去看差分这种做法虽然方便看总线差分电平却隐藏了共模偏移的信息。建议先测单端对地确定没有偏移再切到差分模式观察时序细节。测波形时探头本身也有匹配要求。普通1x探头输入电容大在信号沿较陡的CAN波形上会带来明显负载效应测出来的振铃和过冲幅度可能不真实。尽量用10x探头带宽200MHz就绰绰有余。探头地线尽量用短弹簧地针不要拖一根长地线夹否则环路电感会和探头电容一起形成谐振看到一堆假振铃。5.2 常见故障症状、原因与排查速查表把常见的CAN接口故障整理成一张速查表尤其适合调试时对照故障症状可能原因排查方法完全无法通讯示波器无波形收发器供电异常、TXD/RXD接反先查VCC再查MCU到收发器的TXD/RXD通路一段距离上通讯正常拉长线缆就错误缺少终端电阻、终端位置不对确认两端120Ω都在靠近连接器放置通讯偶发STUFF错误或CRC错误信号振铃严重、布线跨分割检查收发器到连接器走线是否短直参考平面是否完整CAN_H对GND静态电压明显偏离2.5V地偏移过大检查板间共地考虑加隔离收发器高波特率无法同步采样点设置不合理调整CAN控制器采样点到80%附近节点报BUS-OFF发送错误计数超限常由终端不良和地偏移引发结合错误帧检查物理层链路确认终端和共地有些时候看着像是驱动配置不对的偶发错误其实物理层的终端电阻错位或者地偏移早就在酝酿。这也是为什么我坚持在原理图阶段预留可切换的终端匹配选项用0Ω电阻或跳线帽控制是否接入120Ω调试现场改起来极其方便。5.3 关于BUS-OFF的一个特别提醒CAN控制器在发送错误计数器累积到255次后会自动进入BUS-OFF状态脱离总线。应用程序里的处理方式一般是等128个总线空闲信号后自动恢复。但很多人只盯着软件去查错误计数忽略了物理层才是元凶。实际项目里BUS-OFF最常被触发的场景是总线两端的终端电阻没有可靠连接同时总线上的线缆比较长、转速又拉到高位。信号反射叠加在显性电平上导致接收端的采样窗口里电平判错。收发器明明没问题MCU配置也没问题就是物理层那点反射在作怪。排查顺序永远先查终端再查地偏移最后才去看寄存器。6. 最后分享一点项目后的心得这板子做完之后我最大的体会是CAN接口的PCB Layout真正的难点不在于软件操作而在于对阻抗匹配和信号完整性的理解是否到位。很多工程师把“120Ω终端电阻”当成一个任务画上去却不知道这个电阻本质上是在和线缆特征阻抗做匹配更没想过PCB走线段也会成为反射源。道理懂了之后很多设计决策就不再是“依葫芦画瓢”而是有明确依据的判断。如果在AD里画板时遇到拿不准的情况我的建议是先把差分对规则设置好再用层叠管理器里的阻抗计算器跑一遍初值最后把叠层信息发给板厂确认。这套流程熟练之后一块CAN接口板从原理图到布线完成半天时间足够了。但前提是每一处线宽、间距、过孔位置的背后你都知道它在电气上起什么作用。