车载总线核心:CAN与CAN-FD协议从物理层到工程实战

发布时间:2026/10/13 8:49:15
车载总线核心:CAN与CAN-FD协议从物理层到工程实战 车载总线这个题目我本来想过直接从协议帧结构开讲但后来发现很多人卡住的点恰恰不在帧格式而在“为什么CAN要这么设计”。我做了多年车载嵌入式从用STC8模拟总线抓波形到在量产项目里排查偶发通信故障再到把老平台从经典CAN迁到CAN-FD一路踩坑无数。这篇就从“沙子到车辙”系列的中途节点出发完整拆一遍CAN/CAN-FD物理层的差分电平、终端电阻协议层的非破坏性仲裁、位填充、采样点以及FD到底改了什么、混合组网怎么玩、项目里最常见的故障怎么定位。内容适合刚接触汽车总线的人也适合做了几年却总觉得“差点意思”的同行。1. CAN 到底在解决什么问题1.1 从线束爆炸到总线革命早期汽车电子没那么复杂一个传感器一根线一个执行器一根线信号是点对点直连的。到了九十年代发动机电喷、ABS、安全气囊、自动变速箱陆续上车每个控制器之间都要交换数据线束开始成指数级膨胀。某款当年的车型线束总长度超过几公里重量几十公斤这还只是乘用车。线束多了带来三个致命问题成本高、装配难、故障点多——任何一个插头松动、任何一根线磨破都可能让某个功能失效。这时候行业需要一个“神经系统”一根线缆上挂很多节点大家都往上面发数据谁都能收到所有人发的信息。这个想法在当时并不新鲜串行总线早就有了但难点在实时性和鲁棒性。汽车环境里的电磁干扰很凶点火线圈、电机、继电器随便抖一下就是几百伏的噪声脉冲普通的UART在这种环境里根本没法用。CANController Area Network控制器局域网络就是在这个背景下由博世在八十年代提出并最终标准化的。它的核心思路可以浓缩成两句话物理上用一对差分线抵抗共模干扰协议上用带优先级的广播式报文实现多主通信。这两件事听上去简单但把细节做到极致之后成就了汽车工业史上生命力最长的总线标准之一。1.2 “多主广播 逐位仲裁”为什么是正确解在动手看协议之前先建立一个大局观CAN不是主从结构任何一个节点都可以随时往总线上发送报文总线本身是广播式的——一个节点发所有节点都收。听上去乱但正是这种模式让系统的实时性变得非常自然一个传感器检测到碰撞信号它不需要等主控轮询而是立刻自己抢总线发报文。那多个节点同时抢总线怎么办CAN的答案是“非破坏性仲裁”所有节点同时发送自己的标识符一边发一边回读总线状态谁发现总线上的电平比自己发送的电平更“优先”谁就立即退出剩下那个节点自动赢得总线。整个过程不需要控制器介入硬件自动完成也不会破坏已发送的位所以叫作“非破坏性”。这个机制有个漂亮的副产品报文的优先级由标识符ID的数值大小决定ID越小优先级越高。工程设计上安全相关的报文比如制动、气囊相关信号都会安排很小的ID娱乐系统的大流量背景报文则用大ID优先级差异天然形成调度秩序不需要额外的调度算法。2. 物理层双绞线上的电平博弈2.1 差分信号、显性与隐性到底是怎么回事CAN的物理层通常是一对双绞线标记为CAN_H和CAN_L。它不用单端电压代表0和1而是用两根线之间的电压差。这种差分结构最大的好处是抗共模干扰外界的电磁干扰往往同时叠加在两根线上相减之后干扰就被抵消掉了。CAN总线上定义了两个逻辑状态。一个是隐性位recessive对应逻辑1此时CAN_H和CAN_L都由收发器驱动到约2.5V差分电压接近0V。另一个是显性位dominant对应逻辑0此时CAN_H被拉到约3.5VCAN_L被拉到约1.5V差分电压约2V。关键的特性是隐性位是“释放”出来的显性位是“主动驱动”出来的。所以当一个节点发隐性位、另一个节点发显性位时总线上的最终结果是显性位——这也正是逐位仲裁能成立的基础显性位能“盖过”隐性位。注意这里说的“显性覆盖隐性”是整个CAN协议的物理基石。仲裁、错误帧、应答ACK全都依赖这个特性。如果你在做硬件设计时把收发器的真值表搞反了或者选错了收发器类型后面所有功能都会出问题。收发器transceiver是物理层的核心器件。控制器MCU内部或外挂的CAN控制器只处理逻辑电平真正把逻辑电平转化成差分信号、并提供总线驱动能力的是收发器。车载上最常见的是一类高速CAN收发器支持到1Mbps以上还有一类低功耗/容错收发器速率较低但抗干扰和故障容错更强常用于车身控制。2.2 终端电阻为什么非120欧不可CAN要求在总线物理两端各并联一个终端电阻标准值是120Ω。很多新手不理解UART不需要终端电阻RS-485虽然要但经常用一个120Ω了事CAN为什么特别强调“两端各一个”原因在于信号反射。CAN的通信速率和线缆长度决定了信号在线上传输时存在传播延迟。当信号到达线缆末端时如果末端阻抗不等于线缆的特性阻抗一部分能量就会被反射回来反射波和入射波叠加后会在总线上产生振铃轻则降低噪声裕量重则直接导致采样错误。双绞线特别是汽车用的总线电缆的特性阻抗大约在120Ω所以在两端各并一个120Ω电阻从线缆看进去的总阻抗也是120Ω反射被吸收掉。这里有个常见的误区两个节点短距离点对点时很多工程师只在一边放一个120Ω另一边空着。这在低速、短线上可能碰巧能跑但一旦总线长度拉长或者速率提高波形就会劣化得很明显。我实测过一个案子整车下线时CAN通信偶发性超时排查半天发现是某个节点内部把终端电阻做了开关控制软件初始化顺序有问题导致一端没接入总线两端阻抗失配波形上的过冲和振铃触发了位错误。后来把终端电阻改为常驻、不做任何开关控制问题彻底消失。实操心得用示波器测CAN波形时如果看到隐性电平到显性电平的跳变沿有明显过冲、振铃甚至波形中间有平台抖动基本可以断定终端电阻配置有问题。标准做法是先确认总线最远两端都有120Ω然后用万用表在任意节点处量CAN_H和CAN_L之间的直流电阻正常情况下应该约60Ω两个120Ω并联。如果你量出来是120Ω说明只接了一端肯定会出问题。2.3 拓扑、线缆与常见接线错误CAN的标准拓扑是总线型一条主干线所有节点通过很短的支线stub挂上去。在高速率下比如500kbps以上支线长度要严格控制。经验法则是支线越短越好一般建议不超过0.3米最多也不要超过0.5米。为什么因为每条支线都是一个阻抗不连续点信号在支线末端会反射支线越长反射回到主干线的时刻越晚越可能落在采样点附近造成位错误。在极端的树形拓扑里反射问题会非常棘手必要时只能降速。线缆选择上经典CAN的标准电缆是特性阻抗约120Ω的双绞线常用的是0.5平方毫米左右的屏蔽双绞线。屏蔽层一般单端接地防止形成地环路。实际项目中CAN线经常和电源线、信号线走同一线束这就要求CAN线必须是双绞的——绞合本身就能大幅抑制磁场耦合如果用了两根平行线代替长距离下误码率会明显上升。物理层还有一个容易被忽视的点CAN收发器的共模电压范围。总线上的所有节点必须有一个共同的参考地否则CAN_H和CAN_L的绝对电压会随不同节点的地电位差而漂移。共模电压超出收发器允许范围通常±12V甚至更宽但实际余量有限波形就会失真。所以跨板、跨域通信时要确保各个模块的地是可靠的而不是靠CAN线来“借地”。3. 协议层仲裁、报文与同步3.1 逐位仲裁的工程智慧前面说了仲裁是靠“显性盖过隐性”实现的这里展开讲具体的运作过程。假设节点A要发ID为0x305的报文节点B要发ID为0x309的报文它们同一时刻开始发送。从ID的最高位开始每一位发送方都要同时监听总线电平。以二进制表示0x305低于0x309那么在某个位位置上A发送0、B发送1A推的显性电平会把B推的隐性电平盖掉。B回读到总线电平和自己想发的电平不一致知道自己输了仲裁立刻停止发送转入接收状态。A继续把剩余报文发完全程没被打断。仲裁过程中节点输掉仲裁的那一位实际上起到的是一个“比较器”的作用。这个机制对标识符的编码有一点要求如果两个报文ID完全相同、又同时开始发送那么它们会一路比到数据场哪一位出现不同就输掉仲裁如果数据也完全相同则会产生错误帧或由后续机制处理。所以工程上要求每个节点发送的报文ID在全网唯一。注意仲裁只在报文起始阶段发生一旦某个节点在完成仲裁后赢得总线后续数据发送期间不会有别的节点来打断它。也就是说CAN的实时性与节点数量关系不大真正影响最坏延迟的是高优先级报文的发送频率和总线负载率。3.2 从SOF到EOF一帧报文拆开看经典CAN一帧标准数据帧由这些字段组成帧起始SOF1位显性标志一帧开始仲裁场标准帧是11位标识符扩展帧是29位标识符外加RTR位区分数据帧和远程帧控制场IDE位、保留位、4位DLC数据长度码DLC范围0到8对应数据场长度数据场0到8字节CRC场15位CRC校验值加一个隐性CRC分隔位应答场ACK2位发送节点在这段释放总线所有接收节点在ACK位发送显性电平作为应答随后是隐性分隔位帧结束EOF7位隐性帧间空间IFS至少3位隐性用于区分相邻帧。看着字段多其实算一算开销就能理解CAN的实时性。以500kbps为例一个含8字节数据的标准帧去掉位填充后大约是110个位实际加上位填充约130位传输时间约260微秒。在这个时间内全车所有节点都能收到这8字节数据并决定自己是否需要处理。这种“一点发送、多点同时接收”的特性让CAN在分布式控制中非常高效。扩展帧29位ID在标准帧基础上把仲裁场变长其余结构基本一致。工程上同一网络里标准帧和扩展帧可以共存因为IDE位能区分两者但要注意仲裁时标准帧的优先级规则与扩展帧的SRR位的特殊处理容易让人困惑不建议混用同一ID域的两种帧格式设计时最好直接统一。3.3 位填充保证时钟同步的细节这张帧结构表里没体现的一个机制是位填充bit stuffing。CAN规定发送方在连续输出5个相同电平的位之后必须自动插入一个相反电平的填充位。接收方在接收过程中看到连续5个相同位后会预期下一个位是反电平的填充位并自动把它去掉。位填充有两个作用。第一是保证足够多的电平跳变让接收方能够持续同步位定时。CAN总线没有独立的时钟线所有节点都是靠本地时钟加上对方的电平边沿来保持同步的如果长时间没有跳变本地时钟偏差就会积累到无法容忍。第二是为错误检测提供手段如果接收方收到超过5个连续相同位而没有填充位说明总线异常立刻报“填充错误”。填充位的代价是带宽损失。数据越随机平均每5位多塞1位最坏情况下每4位就有一个填充位但统计上一般增加不到20%的开销。到了CAN-FD数据阶段对方便继续使用位填充但CRC计算方式做了调整以兼顾填充位带来的不确定性这个后面详细说。3.4 采样点与位时序CAN总线上没有统一的外部时钟每个节点的控制器都从自己的时钟源产生位时序。为了正确采样到总线电平每个位时间被划分成若干时间份time quantum典型结构是同步段SYNC_SEG、传播段PROP_SEG、相位缓冲段1PHASE_SEG1、相位缓冲段2PHASE_SEG2。理想采样点位于PHASE_SEG1和PHASE_SEG2的交界处。采样点位置是参数配置里最关键的。如果采样点太靠前信号还没稳定你就采了容易采到建立过程中的毛刺如果太靠后又容易被传播延迟和反射影响。行业惯例是采样点设在位时间的70%到80%很多TCP/IP风格的前辈经验是“75%到80%最稳”。具体配置取决于控制器时钟频率和目标波特率假设晶振20MHz、目标500kbps、位时间设为20个time quantum那么每个time quantum就是50nsSYNC_SEG固定1个PROP_SEG 3个PHASE_SEG1 6个PHASE_SEG2 10个采样点正好在(136)/2070%。实操心得同一个网络里所有节点必须使用相同的波特率和尽量接近的采样点否则在总线负载高、帧密集出现时采样点差异会累积成帧错误。我自己做项目时会专门列一张表把每个节点的波特率相关寄存器配置值核对一遍因为很多MCU库函数填的参数是“预分频时间段”而不是直接填采样点稍有不慎就出现“明明波特率一样但通信不稳”的怪现象。4. CAN-FD一次面向未来的升级4.1 经典CAN的两个硬伤经典CAN再优秀到了2010年代也开始吃力。第一个硬伤是带宽上限标准里速率最高1Mbps扣掉位填充和协议开销有效吞吐大概只有500到700kbps。做OTA升级时一个固件包几十兆字节用500kbps传要传好几分钟车主体验极差。第二个硬伤是单帧载荷太小最多8字节一个稍微复杂的信号集合比如一条油门请求带标定参数时间戳校验就要拆成好几帧还要处理跨帧一致性软件复杂度高也更难保证实时性。CAN-FDCAN with Flexible Data-rate就是在这样的背景下出现的。它保留了CAN的仲裁、错误处理、物理层基本思想但对数据阶段做了两处关键升级数据场最大64字节数据阶段位速率可以远高于仲裁阶段最高在理想总线条件下可达5Mbps甚至8Mbps。这两项叠加让单帧有效吞吐提升了一个数量级。4.2 FDF、BRS与全新DLC编码帧格式改了什么CAN-FD在经典CAN帧的控制场里引入了两个标志位。一个是FDF位FD Format它把报文标记为FD格式另一个是BRS位Bit Rate Switch它决定数据场期间是否切换到更高速率。一个典型FD帧的时序是从SOF到BRS位之前都使用仲裁阶段速率通常和经典CAN一致比如500kbpsBRS位之后发送方切换到来得更快的“数据阶段速率”比如2Mbps或5Mbps在CRC场结束回溯到仲裁速率之前再切回来。这个“可变速率”设计非常聪明仲裁机制依赖所有节点同时监听和逐位比较所以仲裁阶段必须用全网一致的低速而数据场是单方占有、其他节点只读所以可以把速率提上去。代价是数据阶段的时钟容差要求变高。经典CAN在1Mbps时对振荡器精度要求大概是0.5%左右CAN-FD的数据阶段到5Mbps时允许的时钟偏差就被压缩到很小通常需要0.1%量级甚至更严所以很多设计会放弃MCU内部RC振荡器改用外部晶振或带锁相环的时钟源。DLC编码也变了。经典CAN的4位DLC只能表示0到8CAN-FD把它扩展为三位一组的方式表示更长的长度9对应12字节、10对应16字节、11对应20、12对应24、13对应32、14对应48、15对应64。设计上还是4位但9到15的含义从“非法保留”变成了“扩展长度”所以FD报文里DLC字段的翻译逻辑必须和经典CAN区分开。4.3 兼容性与混用策略不是想混就混很多人问CAN-FD节点和经典CAN节点能同时挂在一条总线上吗答案很明确不行至少不能都“听懂”对方。CAN-FD控制器能完整接收、发送经典CAN报文这是向后兼容但经典CAN控制器收不了FD帧——它看到FDF位为隐性经典CAN中该保留位应为显性时会判定格式错误并触发错误帧。所以一条线上只要有经典CAN节点存在网络上就绝对不能出现FD帧。实际项目里更常见的做法是整车骨干网比如动力域控制器之间升级为CAN-FD而低速车身网继续用经典CAN两个网络之间用网关隔离。网关负责把FD报文里的信号映射到经典CAN报文里同时要处理速率和载荷不匹配的问题。这个模式下要注意如果FD帧里数据超过8字节网关往经典CAN转发时必须拆分并要设计好拆分包的重组策略和超时丢弃策略。另一层面CAN-FD混用还有个“速率A/B面”问题所谓FD模式仲裁速率和数据速率可能不同如果两个FD节点都支持FD但A节点数据速率设为2Mbps、B节点设为5Mbps那么即使它们都能识别FD帧BRS切换后照样通信失败。所以在CAN-FD组网初期每一轮“波特率参数表”里都要同时写清仲裁速率和数据速率两个值缺一个就是事故隐患。我所在的项目曾因为某供应商的ECU默认数据速率是2Mbps而主网规划是5Mbps联调现场抓了整整一周波形最后从参数表逐行比对才揪出来。4.4 到底什么时候值得上CAN-FD从成本和复杂度考虑不是所有网段都需要CAN-FD。我的判断依据是三条线一是报文长度如果一个节点需要周期性发送超过8字节的紧凑数据直接用FD帧一次发完最合理二是升级流量存在OTA或批量标定需求的网段上FD能省大量等待时间三是实时性预算如果某个控制环路的报文必须在1ms内完成收发而经典CAN在低负载下也勉强够就别折腾了。但FD也引入新风险数据阶段速率上去之后对线缆质量、支线长度、终端匹配的敏感度成倍增加。原本经典CAN轻轻松松跑500kbps的线束放到2Mbps的FD数据阶段可能就出现误码。所以做FD设计的规则是物理层余量要比经典CAN留得更大线缆选更粗的绞线支线尽量消灭终端严格按标准做必要时用差分探头测每个远端节点的眼图别迷信“理论上没问题”。5. 项目实战从设计到排障的完整链条5.1 一个典型ECU节点的关键设计点在做CAN或CAN-FD节点硬件设计时我通常按这个顺序把关控制器时钟源先确认CAN外设的时钟源是来自内部RC还是外部晶振CAN-FD节点必须用外部晶振或高精度时钟并核对精度指标。收发器选型明确网络是经典CAN还是CAN-FD速率目标多少选对应的收发器同时注意收发器的待机模式控制引脚是否够用、是否有总线唤醒功能。终端电阻策略确定节点是不是总线物理端点。如果是板上直接放120Ω如果不是板上不要预留默认焊接的终端电阻。ESD与滤波CAN收发器引脚靠近接口处加TVS管和共模电感是标配但要注意共模电感/滤波电容引入的寄生参数不要破坏差分信号质量。软件参数波特率、采样点、FD数据速率、自动重发开关、过滤器配置这些必须写进统一的配置表不能散落在各个工程师的代码里。硬件之外软件上还有一个高频踩坑点CAN控制器的“接收过滤器”。初学的人经常发现“为什么我收不到数据但示波器能看到报文”——大概率是过滤器把目标ID屏蔽了。过滤器的正确用法是只放行本节点关心的ID其余全部屏蔽这样能降低MCU中断负载。但在调试阶段最好先配成“接收所有”或旁路过滤器把通信链路本身验证通了再收紧过滤规则。5.2 一次真实的偶发通信故障排查实录有一次项目联调到半夜现场现象是整车CAN网络上偶发丢帧平均五分钟一次没有任何规律用分析仪挂着看也看不出明显错误帧。普通排查套路是查终端电阻、查接插件都正常。最后我用示波器长时间抓差分波形发现有一个节点的CAN_L上偶尔出现约200ns的窄毛刺不是每个周期都有频率极低。追到源头发现是这个节点的收发器供电脚上加了一个廉价的DC-DC模块该模块在特定负载条件下产生开关纹波纹波尖峰恰好耦合到CAN_L的走线上。虽然收发器本身的共模抑制能力处理了大部分干扰但当纹波尖峰和位采样点重合时就偶发一个采样错误。处理办法是把DC-DC模块的开关频率避开CAN采样时间窗同时给CAN收发器供电加了一级LC滤波问题再没出现过。这个案例想说明的是CAN总线故障里真正难查的不是协议而是物理层“低频、偶发、无规律”的事件。示波器之外CAN分析仪的错误帧计数器非常有用——错误类型能帮你缩小范围填充错误或CRC错误优先查干扰和信号质量ACK错误优先查接收节点数量和收发器工作状态位错误则往往与仲裁、位时序或收发器时序参数有关。5.3 常见问题速查表现象最可能原因排查手段完全不通波特率不一致、总线缺少终端电阻万用表量总线电阻、核对参数表偶发超时/丢帧支线过长、线缆质量差、接地不良示波器抓波形、降速验证错误帧暴涨终端失配、采样点偏移、某节点干扰逐节点断开排查、看错误帧类型单节点发送失败收发器损坏、TEC溢出进入Bus Off读控制器状态寄存器、替换收发器唤醒后不工作收发器待机模式未正确切换检查模式控制引脚时序FD帧收不到数据速率配置不一致、经典CAN节点混挂核对仲裁速率和数据速率、检查网络兼容性这张表里的前四条我在不同项目里至少各自遇到过一次。最想说的一句经验是排查CAN问题永远先从物理层开始用万用表量阻值、用示波器看波形确认“电”没问题再去动协议配置。很多工程师一上来就怀疑协议栈软件结果改了半天代码最后发现是某个接插件虚焊。6. 写在最后的调试习惯CAN/CAN-FD这套体系我已经用了很多年它给我最大的感受是“设计得恰到好处”物理层简单可靠协议层优雅高效各种边界情况都有兜底机制。但也正因为如此它一旦出问题往往不是单一原因而是多个小偏差叠加——采样点偏了1%、终端电阻少了一个、某根支线长了20厘米单独看都“不影响”合在一起就偶发丢帧。我自己现在做CAN相关项目时会固化几个习惯所有节点的网络参数统一由配置表格管理验收时逐项核对上电后先用分析仪跑24小时压力测试统计错误帧率而不是只看能通就行物理层检查永远排第一。如果你也想在自己的项目里把CAN/CAN-FD这把刀用好建议从一块带CAN控制器的开发板和两块120Ω电阻开始自己用示波器看一遍显隐性电平、量一遍终端电阻、手动把波特率设错一次看看错误帧长什么样——这些亲身经历比看十遍协议文档都管用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询