干嵌入式的人,尤其是做过车载、工业控制和机器人项目的,对 CAN 总线肯定不陌生。只要节点里 MCU 没集成收发器,就得在外围放一颗 CAN Transceiver。最近在帮一个客户项目做 CAN FD 升级,把原来 250 kbps 的总线提到 4 Mbps 数据段,顺手把这块“3.3-V/5-V 4-Mbps CAN Transceiver”的选型和外围设计重新捋了一遍。这个标题信息量很大:它同时告诉你供电域、速率上限和应用定位。今天就用双电源高速 CAN 收发器的视角,把从芯片原理、外围电路到 CAN FD 位时序配置的完整链路讲清楚。
下面内容不绑定某一家具体型号,而是围绕“3.3V/5V 供电、4Mbps 数据速率”这类收发器的共性设计展开,寄存器配置部分以通用 CAN 控制器外设为例,方便你迁移到自己用的 MCU 上。
1. 收发器在整个 CAN 链路里到底干的是什么活
1.1 为什么控制器不能直接挂到总线上
很多人第一次看 CAN 节点原理图都有个疑问:MCU 内部明明有 CAN 控制器,为什么还要再加一颗收发器?直接拿 TX、RX 引脚去接 CANH、CANL 不行吗?答案是不行,差了最关键的一层物理信号转换。
CAN 控制器出来的是普通的单端逻辑电平,也就是 0~3.3V 或 0~5V 的数字信号,它只有一种参考地。而总线上的 CANH 和 CANL 是两根线,靠它们之间的差分电压来表达显性和隐性状态。这个差分信号需要足够的驱动能力,还要能扛住总线上的共模干扰、线束短路、静电放电这些恶劣工况。单片机 IO 口的那点驱动能力和耐压,根本不够看。
收发器就是这个链路里的“物理层翻译官”。它做三件事:
- 把控制器 TXD 脚输出的逻辑 0(显性请求)转换成 CANH 拉高、CANL 拉低的差分电压;
- 把 TXD 脚输出的逻辑 1(隐性)释放总线,让终端电阻把两根线拉回同一电位;
- 把总线上收到的差分信号还原成 RXD 脚上的逻辑电平,交回给控制器。
没有这层转换,CAN 的差分抗干扰特性、多节点仲裁机制全部无从谈起。你甚至可以这样理解:控制器负责“想说什么”,收发器负责“用总线听得懂的方式说出去”。
1.2 4 Mbps 这个数字是怎么来的:经典 CAN 和 CAN FD 的分水岭
标题里的 4 Mbps 不是随便写的。经典 CAN 协议把速率上限定在 1 Mbps,这是 ISO 11898-1 对标准帧格式的约束。当年设计的时候,1 Mbps 足够覆盖动力总成、车身控制这类场景。后来 ADAS、远程升级、高速诊断这些功能出现,1 Mbps 就不够用了,于是出现了 CAN FD(CAN with Flexible Data-rate)。
CAN FD 最大的变化是允许“仲裁段”和“数据段”用不同速率:仲裁段保持经典 CAN 速率(比如 500 kbps 或 1 Mbps),用来和老节点兼容、保证多节点仲裁可靠;数据段则可以飙到 2 Mbps、4 Mbps 甚至 8 Mbps,因为数据段不需要参与仲裁,每个节点独占总线,速率可以提高。标题里的 4 Mbps,指的就是这个数据段速率。
这里必须说清楚:4 Mbps 对物理层芯片的要求比 1 Mbps 高一个量级。经典 CAN 的位时间最低是 1 µs,收发器传播延迟稍大一点也能容忍;但 4 Mbps 时一个位只有 250 ns,收发器的环路延迟、上升下降沿不对称、输出压摆率都会直接影响信号质量。选型的时候如果只看“支持 CAN FD”就下单,很容易埋雷。
2. 把关键参数当成选型红线来读,而不是随便扫一眼
2.1 双电压域:3.3V 和 5V 到底给谁供电
看到“3.3-V/5-V”这个写法,第一反应往往是“这颗芯片能支持两种供电电压”。但更准确的理解是:收发器内部有两条不同的供电/逻辑路径,3.3V 和 5V 分别服务于不同环节。
在比较常见的双电源收发器方案里,总线侧驱动级用 5V 或者更高一点的电源,这样才能保证 CANH/CANL 输出符合 ISO 11898-2 的差分电压要求(显性时典型 2V 左右);而 MCU 侧的接口逻辑用 VIO 引脚单独供电,VIO 可以接 3.3V,也可以接 5V,取决于主控的 IO 电平。这就是为什么这类芯片经常标“3.3-V/5-V”。
另一种含义是整颗芯片可以工作在 3.3V 或 5V 单电源下,但这时候总线电平特性会有差异。3.3V 供电的收发器也能输出和 5V 供电差不多的差分电压,因为内部有电荷泵或者特殊的输出级电路,但这会让静态功耗、共模范围等参数变化。所以选型时不能只看“能不能 3.3V 供电”,还得看 VCC 电压变化范围内,CANH、CANL 的显性输出电平是否还满足目标总线的要求。
我建议你画一个简单的电源树:
| 电源轨 | 用途 | 典型值 |
|---|---|---|
| VCC(总线侧) | 收发器输出级,决定 CANH/CANL 幅值 | 5V |
| VIO(逻辑侧) | RXD/TXD 接口电平,匹配 MCU IO | 3.3V |
| 主控 VDD | MCU 内核与外设 | 3.3V |
如果收发器没有独立 VIO,而是靠 VCC 同时驱动逻辑,那就要格外小心 3.3V 主控和 5V VCC 之间的电平兼容,这个放到第 4 章展开。
2.2 速率相关的隐性指标:传播延迟、对称性和压摆率
数据手册里容易迷惑人的是那一大堆时间参数。对 4 Mbps 应用,真正影响能不能跑起来的是下面几个:
- 环路延迟(Loop Delay):信号从 TXD 进去,经过收发器、总线、再回到 RXD 的全部延迟。CAN 控制器做位时序同步时,会把收发器延迟算进传播段(PROP_SEG)。4 Mbps 下位时间 250 ns,如果收发器环路延迟超过 150 ns,留给传播段的余量就非常紧张。选型时直接看传播延迟参数,最好选 t_PROP(TXD 到总线)+ t_PROP(总线到 RXD)总和小于位时间 25% 的型号。
- 上升沿和下降沿对称性:CAN 收发器的显性到隐性跳变和隐性到显性跳变如果不对称,会导致位宽度畸变,尤其是在连续多个显性位之后。数据手册里通常用 t_DR(dominant to recessive)和 t_RD(recessive to dominant)表示,两者差值越小越好。
- 压摆率(Slew Rate):高速模式下收发器必须保证足够的压摆率,否则在 4 Mbps 的位时间内信号到不了有效电平,接收端采样会出错。但压摆率也不是越快越好,太陡的边沿会带来额外的 EMC 辐射。所以很多收发器提供不同工作模式,比如“高速模式”和“斜率控制模式”,用 STB 脚或 RS 脚上的电阻来控制。
实测下来,我碰到过不少“看着参数支持 5 Mbps,实际 4 Mbps 数据段误码率很高”的芯片,最后查下来都是上升下降沿不对称超标。这种问题在示波器上看单端波形不明显,要用差分探头看 CANH-CANL 的眼图,或者直接抓总线上的显性位宽度。
3. 最小系统搭建:外围元器件不是随便摆的
3.1 终端电阻:什么时候加、怎么加、加在哪
CAN 总线最经典的坑就是终端电阻。ISO 11898-2 规定高速 CAN 总线特性阻抗为 120Ω,所以网络的物理两端要各接一个 120Ω 终端电阻。所谓“物理两端”,是线束距离最远的两个节点,不是指每个节点都接。
有人为了省事,在每个节点上各放一个 120Ω,结果总线等效阻抗变成 60Ω,信号反射反而更严重。正确做法是:如果只有两个节点,那就是各自一端接一个 120Ω;如果节点超过两个,终端电阻只能放在总线的两头,中间节点一律不接。
这里补充一个容易被忽略的点:4 Mbps 的 CAN FD 对终端电阻的要求比低速时严格得多。250 kbps 时代,终端电阻不匹配可能只是波形有点难看;到了 4 Mbps,120Ω 终端的精度直接影响反射幅度,建议用 1% 精度的电阻。
还有一种做法是分裂终端:用两个 60Ω 电阻串联,中间点通过一个 4.7nF 电容接地。这样做的目的是给共模噪声提供一个低阻抗泄放路径,对 EMC 有好处。缺点是电阻数量翻倍,PCB 上要多占一点位置。如果你在跑高速 CAN FD,且现场电磁环境复杂,我会优先推荐分裂终端。
3.2 ESD 保护与共模电感的取舍
CAN 收发器本身都有一定的 ESD 防护能力,数据手册里通常会写“±8 kV HBM”之类的参数。但 HBM 是人体模型,实际线束上遇到的静电、浪涌比这个苛刻得多,尤其是汽车电子这种要走连接器、线缆的场景。可靠的工程做法是在连接器旁边额外加 TVS 管。
TVS 的选型有几个要点:
- 工作电压要高于总线的共模范围,同时不能让它在正常显性/隐性电平时漏电严重;
- 钳位电压要低于收发器 CANH/CANL 的绝对最大额定值;
- 结电容尽量低,否则在 4 Mbps 下会给信号沿增加额外延迟和畸变。
比如常见的 PESD1CAN、SM712 这类专为 CAN 设计的 TVS,就是考虑了这些因素。直接拿普通信号 TVS 替代不是不行,但要仔细看结电容。
共模电感则是另一个经常被问的东西。它在 CANH 和 CANL 两根线上同时绕制,对差分信号阻抗很小,对共模噪声阻抗很大,可以抑制共模干扰向外辐射。加了共模电感后,要注意它的额定电流和直流电阻,还有高频特性。如果共模电感选得不好,反而会把高速信号的高频分量吃掉,造成眼图闭合。我的经验是:对 4 Mbps 这类高速应用,共模电感选阻抗曲线在 10~100 MHz 平坦的型号,且尽量靠近连接器放置。
3.3 电源去耦与参考地设计
收发器虽然看起来功耗不大,但它在显性输出瞬间要提供不小的电流,这个电流尖峰如果没有低阻抗的本地去耦电容,会把电源电压拉出毛刺,进而影响 RXD/TXD 逻辑电平的稳定性。
在 VCC 引脚旁边放一个 100 nF 的陶瓷电容是底线,建议再并一颗 1µF~10µF,具体看收发器最大输出电流和电源路径的走线长度。电容要放在 VCC 引脚到地孔之间,走线尽量短。VIO 引脚如果有独立供电,同样要放去耦电容。
参考地的问题在跨板连接时很容易翻车。当两个 CAN 节点距离较远,或者分别由不同电源供电时,两个节点之间会存在地电位差。CAN 总线标准允许的共模电压范围大概是 -2V~+7V(部分器件更宽),如果地电位差超过这个范围,即使差分信号本身正确,接收端也无法正确解码。
几米以内的短距离、共地良好的场景通常没问题;长线、跨机柜、不同电源域之间互联时,就得考虑共模范围和隔离方案。
4. 3.3V 主控接 5V 总线,逻辑电平怎么处理最稳
4.1 VIO 引脚:最省事也最容易被忽略的思路
如果你的 3.3V MCU 配的收发器是带 VIO 引脚的双电源型号,那逻辑电平转换是芯片内部完成的。VIO 接 3.3V,RXD 输出高电平就是 3.3V,MCU 直接读没问题;TXD 输入侧按 3.3V 电平判断,MCU 直接写也没问题。而总线侧的 VCC 依然接 5V,保证 CANH/CANL 输出符合标准。
这类收发器的数据手册会明确写 VIO 的供电范围和 VIH/VIL 阈值。只要 VIO 和主控 IO 电压一致,基本不需要额外电路。我见过一个反面案例:有人没接 VIO,或者 VIO 悬空,导致收发器逻辑侧完全不在工作状态,总线上一堆错误帧。接这种芯片第一个动作就是确认 VIO 有了正确供电。
4.2 没有 VIO 时的电平转换方案
如果收发器没有独立的 VIO 引脚,或者你手里的库存是不带 VIO 的旧型号,那 3.3V 主控和 5V 总线收发器之间就得自己做电平适配。这里有几个常用方案,按可靠性排序:
首选:单缓冲器/电平转换芯片。用 74LVC1T45、TXS0102 这类专用电平转换芯片,把 TXD 和 RXD 两根线分别处理。麻烦点在于方向控制,CAN 的 TXD 和 RXD 是单向的,比 I2C 那种双向好处理很多,每个方向用固定方向的缓冲器就行。成本增加一点,但可靠性和时序最可控。
次选:开漏+上拉。TXD 和 RXD 都用开漏输出,上拉到主控侧的 3.3V。这样不管对端是 5V 还是 3.3V,只要开漏管耐压够,逻辑高电平都是 3.3V,不存在 5V 倒灌问题。缺点是需要外加上拉电阻,且高电平跳变速度受上拉电阻和寄生电容影响,4 Mbps 下要仔细算上升时间。
不推荐:直接串联电阻分压。有人用电阻分压把 5V 的 RXD 输出降到 3.3V,再把 3.3V 的 TXD 直接送进 5V 器件。这在低速下能工作,但在 4 Mbps 下会破坏信号边沿,而且 5V 器件输入侧对 3.3V 高电平的识别存在阈值风险。能不用尽量别用。
4.3 3.3V 收发器输出的总线电平到底兼容吗
还有一个常见误区:既然标题写着 “3.3-V/5-V”,是不是 3.3V 供电时,总线信号就比 5V 供电时小?这要看具体芯片内部结构。有些 3.3V 供电的 CAN 收发器(比如最早流行的一批 3.3V CAN 芯片)确实输出差分电压会略低,但对 ISO 11898-2 的接收阈值来说,仍然能够被识别。
关键问题是共模范围和总线故障保护。3.3V 供电时,内部驱动级的耐压余量通常比 5V 供电时小,遇到总线对电源短路、对地短路时,更容易触发保护或者损坏。所以如果系统电源允许,总线侧尽量用 5V;如果受限于单电源系统只能用 3.3V,就得确认收发器的故障保护电压范围和显性输出电压参数都能覆盖你的线束工况。
5. 4Mbps CAN FD 的位时序配置和采样点校正
5.1 位时间组成和 250 ns 的时间预算
CAN 总线上的每个位都由四段组成:同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段 1(PHASE_SEG1)、相位缓冲段 2(PHASE_SEG2)。通信波特率的倒数就是这四段加起来的位时间。比如仲裁段 1 Mbps,位时间是 1000 ns;数据段 4 Mbps,位时间就是 250 ns。
CAN FD 控制器通常允许对仲裁段和数据段分别配置位时序。数据段的位时间短,配置的时间量子(Time Quantum,TQ)数量就不能太多,否则每个 TQ 的长度不够用。举个例子,如果外设时钟是 40 MHz,一个 TQ 是 25 ns,4 Mbps 时一个位只有 10 个 TQ;如果采样点想设在 80%,那就是 8 个 TQ 处采样。
这 250 ns 里,要留给信号传播的预算有多少?信号从发送节点控制器出来,经过发送端收发器、总线传输、接收端收发器,再到接收节点控制器,这个环路延迟会被控制器用来确定采样位置。如果环路延迟占掉太多位时间,采样点就很容易落到数据翻转区,产生位错误。
5.2 一个实际的寄存器配置走读
以常见的 CAN-FD 外设为例,假设仲裁段 1 Mbps,数据段 4 Mbps,外设时钟 40 MHz,目标采样点:仲裁段取 80%,数据段取 80%。
先算仲裁段位时序:位时间 1000 ns,TQ = 25 ns,一共 40 个 TQ。SYNC_SEG 固定 1 TQ,剩余 39 个 TQ 分给传播段、Phase Seg1 和 Phase Seg2。采样点在 80%,意味着采样点前面的 TQ 数量是 32(包括 SYNC_SEG)。如果分配 PROP_SEG + PHASE_SEG1 = 31 TQ,PHASE_SEG2 = 8 TQ,采样点 = (1+31)/(1+31+8) = 80%。
再看数据段位时序:位时间 250 ns,还是 25 ns 一个 TQ,总共 10 个 TQ。采样点 80%,那么采样点前 8 个 TQ,PHASE_SEG2 = 2 TQ。具体寄存器字段通常是:
| 参数 | 仲裁段 | 数据段 |
|---|---|---|
| 位时间 | 40 TQ | 10 TQ |
| SYNC_SEG | 1 | 1 |
| PROP_SEG | 3 | 1 |
| PHASE_SEG1 | 28 | 6 |
| PHASE_SEG2 | 8 | 2 |
| 采样点 | 80% | 80% |
注意这不是唯一的标准答案,不同 MCU 的 CAN 外设对传播段和相位缓冲段的合并方式不一样,但计算思路是一致的。如果外设时钟是 80 MHz,TQ 变成 12.5 ns,数据段 250 ns 就能分到 20 个 TQ,配置余量会大很多。所以跑高速 CAN FD,外设时钟频率越高越好调。
5.3 采样点位置对误码率的影响
采样点决定接收器在一个位时间内什么时候对总线电平做出判断。理想情况下,采样点应该落在位时间的 70%~80% 附近,靠近位的末端,这样能最大程度容忍传输延迟和信号边沿的偏差。
仲裁段和数据段对采样点的要求略有不同。仲裁段涉及多个节点的位仲裁,节点之间要严格同步,采样点靠后一点(80%~87.5%)有利于容忍时钟偏差。数据段是单节点独占发送,没有仲裁需求,采样点可以放 75%~80% 之间,给相位缓冲段留出调整余量。
实际调试时,直接用示波器抓总线波形,对比当前采样点设置下的误码率是个好办法。如果总线长度较长,或者终端匹配不理想,波形会产生振铃,采样点稍微挪一点可能从“频繁错误帧”变成“完全稳定”。这个参数要现场调,不能照抄参考设计。
6. 实测中的常见问题与排查顺序
6.1 错误帧反复出现,先看这几个地方
把节点接到总线上,打开 CAN 分析仪,结果满屏错误帧。这种情况我先按下面顺序排查,命中率很高:
只接了一个节点?如果总线上只有你自己的节点,且控制器没开环回模式,那每个显性位之后都需要接收方回复 ACK。没人回复,发送节点就会在 ACK 槽报错,表现为连续错误帧。这是新手上路最容易犯的测试错误。解决方法是把收发器的 STB 引脚置于正常模式、使能控制器的自动应答,或者至少再挂一个分析仪充当第二个节点。
终端电阻数量和位置对不对。手摸一下发烫的电阻——如果节点里两个 120Ω 都装了,而且总线另一头也装了,很容易出现信号反射。拆掉多余的终端,只留总线两端各一个。
TXD/RXD 接反了。收发器的 TXD 接控制器 TX 引脚,RXD 接控制器 RX 引脚。反了的话,控制器发出的数据被自己收回来,逻辑完全错乱,但示波器上总线波形看起来可能还挺正常。
确认收发器模式的 STB/EN 脚电平。有些收发器上电默认进入待机或静音模式,此时发送通道关闭,节点能收不能发。如果 STB 脚悬空或者被上拉住,也会导致 ACK 无法发出。
6.2 Bus Off 的恢复机制,别等它自己恢复
CAN 控制器内部有发送错误计数器和接收错误计数器。当发送错误计数超过 255,节点会进入 Bus Off 状态,与总线彻底隔离。经典 CAN 要求节点在总线空闲时积累 128 次 11 个隐性位的总线空闲才能重新加入。有些控制器支持 Bus Off 恢复时间可配,可以缩短恢复时间,但在高速 CAN FD 场景,我更建议先把错误根源找出来,而不是依赖快速恢复。
Bus Off 一旦出现,先看错误计数器的递增规律。如果每次发送都立刻递增,问题大概率在物理层;如果是间歇性递增,则要怀疑抗干扰能力或终端匹配。用 CAN 分析仪记录 Bus Off 发生前后的总线波形,往往能看到错误帧出现的位置和类型,比瞎猜高效得多。
6.3 高频信号完整性:过冲和振铃的处置
4 Mbps 情况下,信号边沿变得很短,PCB 走线和线束的分布参数影响会被放大。常见的现象是 CANH 和 CANL 之间出现明显的振铃,甚至过冲超过总线额定电压。
处理手段按优先级排:
- 确认终端匹配,这是第一位的;
- 缩短收发器到连接器的走线,尽量用双绞线;
- 在 CANH/CANL 靠近连接器处各串一个小电阻(比如 10Ω~22Ω),减缓边沿、抑制反射;
- 如果振铃来自外部干扰,再考虑共模电感或磁珠。
这里有个取舍:串阻会降低信号摆率,可能导致 4 Mbps 下的边沿太慢。所以串阻值要现场调,我一般从 10Ω 起步,用示波器确认没有再往上加。
另外,PCB 走线尽量不要在中间层来回换层,换层处的过孔阻抗不连续,会对信号完整性造成额外影响。CAN 收发器布线不算复杂,但规矩做足,后面能省很多调试时间。
我在实际项目里测过不少收发器,有一条比较深的体会:4 Mbps 不是把波特率寄存器一改就完事,物理层的外围设计和协议层的位时序配置是配合着来的。先把电源、终端、ESD 这些基础做扎实,再回头调采样点,往往一通百通。真正难缠的往往不是某个大块头的问题,而是那个被你顺手忽略的 120Ω 电阻放错了位置。