拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

CAN总线从物理层到实战:差分信号、SRR位与保护电路全解析

CAN总线从物理层到实战:差分信号、SRR位与保护电路全解析

1. 为什么CAN总线值得你花时间搞明白

如果你拆过任何一辆2010年之后生产的汽车,哪怕只是换个大灯或者加装个倒车雷达,你大概率会碰到两根拧在一起的双绞线——一根CAN_H,一根CAN_L。很多人第一次见这东西的反应是“这不就是普通信号线吗”,然后拿万用表一量,发现电压还在跳,完全看不懂。这就是CAN总线给人的第一印象:看着简单,用起来懵。

CAN(Controller Area Network,控制器局域网)总线是博世公司在1986年专门为汽车电子设计的一种串行通信协议。它的核心价值在于:让几十甚至上百个电子控制单元(ECU)用一对差分线就能可靠通信,而且不需要主机来调度。发动机、变速箱、ABS、安全气囊、车窗、座椅、电池管理系统,全都挂在这两根线上。你踩一脚刹车,刹车信号从刹车踏板传感器到刹车灯、到ABS模块、到发动机管理模块,整个过程在毫秒级完成,靠的就是CAN总线。

这套东西不只用在汽车上。工业自动化、电梯控制、医疗设备、船舶、航天,凡是需要多个节点可靠通信又不想拉一堆线的地方,CAN总线都是首选方案之一。我见过做AGV小车的团队用CAN做底盘控制,也见过做储能柜的工程师用CAN做BMS通信。可以说,搞嵌入式、搞汽车电子、搞工业控制,CAN总线是绕不过去的基本功。

这篇文章适合谁看?如果你是刚入行的汽车电子工程师、嵌入式开发者、汽修技师,或者单纯是个喜欢折腾车、想搞明白车上那两根线到底在干什么的爱好者,那接下来的内容就是给你准备的。我会从CAN总线的物理层讲起,一路讲到协议帧结构、SRR位这种细节、保护电路设计,再到实际排查问题的思路。不堆公式,不抄手册,用我这些年踩过的坑和实际测过的波形,把CAN总线讲透。

2. CAN总线的物理层与电气特性拆解

2.1 差分信号到底怎么传数据

CAN总线用的是差分信号传输,这是它抗干扰能力强的根本原因。所谓差分,就是信号不靠单根线对地的电压来判断,而是靠两根线之间的电压差。CAN_H和CAN_L在没有数据传输时都处于约2.5V的隐性电平,压差接近0V。当发送显性位时,CAN_H被拉到约3.5V,CAN_L被拉到约1.5V,压差约2V。接收端只看这个压差,不看单根线对地的绝对电压。

这个设计的好处非常直接:如果整条线束旁边有电机在干扰,两根线同时被耦合进相同的噪声,压差不变,数据就不受影响。我实测过在变频器旁边走CAN线,单根线对地噪声峰峰值能到1V以上,但差分信号依然干净。这就是为什么汽车里那么多大电流设备,CAN还能稳定跑。

注意:CAN_H和CAN_L必须使用双绞线,绞距越密抗干扰越好。我见过有人用两根平行线代替双绞线,短距离低速还能凑合,一旦线长超过2米或者波特率上到500kbps,误码率立刻飙升。

2.2 终端电阻不是可选项

CAN总线两端各需要一个120Ω的终端电阻,并联在CAN_H和CAN_L之间。很多人知道要加,但不知道为什么。原因有两个:第一,CAN总线用的是开环电流传输,信号在电缆末端会反射,终端电阻用来吸收反射能量,匹配电缆特性阻抗(典型120Ω);第二,它提供隐性电平的回流路径,确保总线在空闲时快速回到隐性状态。

你可以这样验证:断电情况下,用万用表测CAN_H和CAN_L之间的电阻,正常应该是约60Ω(两个120Ω并联)。如果测出来是120Ω,说明只接了一个终端电阻;如果是无穷大,说明一个都没接。我遇到过一台设备通信时好时坏,查了半天发现是其中一个节点的终端电阻被前一个维修工拆掉了,总线反射导致偶发错误帧。

2.3 波特率与线长的取舍关系

CAN总线的波特率和最大线长是相互制约的。波特率越高,每一位的时间越短,信号在线上传播一个来回的时间必须小于位时间的采样点,否则仲裁会出错。经验数据如下:

波特率最大线长(经验值)典型应用场景
1 Mbps40米动力总成、底盘控制
500 kbps100米车身控制、电池管理
250 kbps250米商用车、工业设备
125 kbps500米楼宇自动化、电梯
50 kbps1000米长距离监控系统

这个表是保守值,实际能跑多远还跟线材质量、节点数量、终端匹配有关。我建议新手先从500kbps开始调,这个速率在汽车上最常见,对线长要求也不算苛刻。

2.4 汽车CAN总线电路图里的保护设计

看汽车CAN总线电路图时,你会发现每个ECU的CAN收发器前端都有一组保护器件。典型配置包括:

  • 共模电感:抑制共模干扰,对差分信号无影响。
  • TVS二极管:防止静电和浪涌打坏收发器,通常选双向TVS,击穿电压在24V到36V之间。
  • 分裂终端:有些设计不用单个120Ω,而是用两个60Ω串联,中间接一个电容到地,进一步滤除共模噪声。
  • 限流电阻:部分设计在CAN_H和CAN_L上串小阻值电阻(如5Ω到10Ω),限制故障电流。

这些保护不是可有可无的。汽车环境里负载突降、静电放电、电源反接都可能发生,没有保护电路,收发器芯片分分钟烧掉。我自己做板子时,TVS和共模电感是必加的,成本不高但能省很多返修麻烦。

3. CAN协议帧结构深度解析

3.1 标准帧与扩展帧的区别

CAN协议有两种帧格式:标准帧(CAN 2.0A)和扩展帧(CAN 2.0B)。标准帧用11位标识符,扩展帧用29位标识符。标识符不表示地址,而是表示消息的优先级和内容类型。数值越小优先级越高。

标准帧的结构是:SOF(1位)+ 标识符(11位)+ RTR(1位)+ IDE(1位)+ r0(1位)+ DLC(4位)+ 数据场(0到8字节)+ CRC(15位)+ CRC界定符(1位)+ ACK槽(1位)+ ACK界定符(1位)+ EOF(7位)。

扩展帧在标准帧基础上,把标识符扩展到29位,中间多了SRR位和IDE位。这里就引出了热搜词里的“CAN总线SRR位”。

3.2 SRR位到底是什么,为什么容易搞混

SRR全称是Substitute Remote Request,替代远程请求位。它只存在于扩展帧中,位置在标准标识符的11位之后、IDE位之前。在标准帧里,这个位置是RTR位(远程发送请求位)。扩展帧用SRR位替代了RTR位的位置,并且SRR位始终发送隐性电平。

为什么要这样设计?因为CAN总线仲裁机制要求:当标准帧和扩展帧同时竞争总线时,标准帧的RTR位如果是显性(数据帧),而扩展帧的SRR位是隐性,那么标准帧会赢得仲裁。这保证了标准帧的优先级高于扩展帧,避免扩展帧长时间占用总线导致标准帧饿死。

很多人看协议文档时会把SRR和RTR搞混,因为它们在帧里的位置相同。记住一个口诀:标准帧那个位置叫RTR,扩展帧那个位置叫SRR,SRR永远是隐性,RTR在数据帧里是显性、在远程帧里是隐性。

3.3 仲裁机制:为什么CAN不会撞车

CAN总线最精妙的设计就是非破坏性仲裁。当多个节点同时发送时,它们逐位比较:发送显性位的节点会检测到总线是显性,继续发送;发送隐性位但检测到总线是显性的节点,知道自己优先级低,立刻退出仲裁,转为接收状态。整个过程没有任何数据被破坏,赢家继续发,输家等下一轮。

这个机制依赖两个条件:第一,显性位能覆盖隐性位(物理层上显性压差更大);第二,所有节点必须在同一位时间采样。所以CAN对时钟同步要求很高,每个节点都要通过SOF位重新同步。

我实测过用示波器抓仲裁过程:两个节点同时发,一个ID是0x100,一个是0x200。0x100的二进制是1 0000 0000,0x200是10 0000 0000。在第2位,0x100发显性0,0x200发隐性1,0x200立刻退出。整个过程不到1微秒。

3.4 数据场长度与DLC编码

DLC(Data Length Code)是4位,理论上可以表示0到15,但CAN数据场最多8字节,所以DLC有效值是0到8。9到15是无效值,但有些控制器允许发送,接收端按8字节处理。我建议不要用无效DLC,虽然协议允许,但不同厂商的控制器行为可能不一致。

CAN FD(灵活数据速率)把数据场扩展到64字节,DLC编码也变了:0到8还是原来的值,9到15分别对应12、16、20、24、32、48、64字节。如果你在做新设计,CAN FD值得考虑,但要注意收发器和控制器都要支持。

4. CAN总线保护与硬件设计实操

4.1 收发器选型要点

CAN收发器是连接控制器和总线的桥梁。选型时重点看几个参数:

  • 供电电压:5V还是3.3V,要和你的MCU匹配。
  • 共模电压范围:汽车级通常要求-12V到+12V,工业级可以窄一些。
  • ESD保护等级:至少±8kV接触放电,汽车级要求±15kV。
  • 待机电流:电池供电的设备要关注,好的收发器待机电流在微安级。
  • 总线故障保护:CAN_H或CAN_L对电源或对地短路时,收发器不能损坏。

常见型号比如TJA1050、SN65HVD230、MCP2551,都是经典型号。TJA1050是5V的,SN65HVD230是3.3V的,MCP2551兼容5V。我一般根据MCU电平选,3.3V系统就用SN65HVD230,省得加电平转换。

4.2 保护电路设计实例

一个完整的CAN节点保护电路包括:

  1. 共模电感:选100μH到200μH,额定电流要大于总线最大电流。
  2. TVS管:选双向TVS,击穿电压24V到36V,峰值脉冲功率至少400W。
  3. 分裂终端:两个60Ω电阻串联,中间节点通过4.7nF电容到地。
  4. 限流电阻:CAN_H和CAN_L各串一个5.1Ω电阻,功率至少0.25W。

提示:分裂终端的电容不要选太大,否则会影响信号上升沿。4.7nF到10nF是比较稳妥的值。

我做过一个对比测试:同样的收发器,不加保护直接接总线,在电机启停时误码率约10^-4;加了共模电感和TVS后,误码率降到10^-7以下。保护电路的成本不到两块钱,但可靠性提升是数量级的。

4.3 PCB布局注意事项

CAN总线的PCB布局有几个坑:

  • 差分线等长:CAN_H和CAN_L走线长度差控制在5mil以内,否则差分信号会畸变。
  • 远离干扰源:不要和电源线、电机驱动线平行走,至少保持3倍线宽的距离。
  • 终端电阻位置:终端电阻必须放在总线物理末端,不能放在节点中间。
  • 地平面完整:收发器下方要有完整地平面,不要被其他走线割裂。

我见过一个设计,CAN差分线走了两个过孔,结果500kbps下通信距离不到20米就出错。后来改成单层走线,问题消失。过孔会引入阻抗不连续,高速差分信号要尽量避免。

5. 常见问题排查与实战经验

5.1 通信完全不通怎么查

第一步,断电测电阻。CAN_H和CAN_L之间应该是60Ω左右。如果不对,查终端电阻。

第二步,上电测电压。隐性时CAN_H和CAN_L都约2.5V,显性时CAN_H约3.5V、CAN_L约1.5V。如果电压不对,查收发器供电和使能引脚。

第三步,用示波器看波形。正常波形是清晰的差分方波,上升沿陡峭。如果波形圆钝,可能是终端电阻不对或者线太长。如果波形上有毛刺,查干扰源和屏蔽。

第四步,用CAN分析仪抓报文。如果能看到报文但CRC错误多,查波特率是否匹配。如果完全看不到报文,查节点是否在发送。

5.2 偶发错误帧怎么定位

偶发错误帧是最难查的。我的经验是:

  • 先查终端电阻:接触不良会导致偶发反射。
  • 再查电源:收发器供电纹波大,会导致位采样错误。
  • 查地线:节点之间地电位差超过收发器共模范围,会出错。
  • 查线束:线束磨损导致间歇短路,特别是过孔和接插件附近。

我遇到过一台车,CAN总线每隔几分钟报一次错误,查了两天发现是线束在车门铰链处磨破了,关门时短路,开门时正常。这种问题只能靠分段排查。

5.3 常见问题速查表

现象可能原因排查方法
完全无通信终端电阻缺失、收发器损坏、供电异常测电阻、测电压、换收发器
通信时好时坏接触不良、干扰、地电位差查接插件、加屏蔽、测地线
CRC错误多波特率不匹配、线太长、反射核对波特率、缩短线长、加终端
仲裁丢失频繁优先级配置不合理、总线负载高调整ID、降低发送频率
节点掉线总线故障保护触发、温度过高查短路、查散热

5.4 总线负载率计算

总线负载率是评估CAN网络健康度的重要指标。计算方法:负载率 = 所有报文位数之和 / 总线带宽。比如500kbps下,每秒最多传500000位。如果所有报文加起来每秒占300000位,负载率就是60%。

一般建议负载率不超过50%,留出余量给突发报文和错误帧。如果超过70%,延迟会明显增加,严重时会导致报文丢失。我见过一个设计负载率到85%,结果刹车信号延迟超过20ms,这是很危险的。

计算报文位数时,标准帧大约47到111位(取决于数据长度),扩展帧大约67到131位。加上帧间隔3位,再乘以每秒发送次数,就是该报文的位速率。

6. 从零搭建CAN测试环境的完整步骤

6.1 硬件准备清单

  • 两个CAN节点(可以用两块开发板,比如STM32带CAN控制器的)
  • 两个CAN收发器模块(如SN65HVD230模块)
  • 120Ω电阻两个
  • 双绞线若干
  • CAN分析仪(如USB-CAN适配器)
  • 示波器(可选但强烈建议)

6.2 接线与配置

把两个节点用双绞线连起来,CAN_H接CAN_H,CAN_L接CAN_L。在两个节点的两端各并一个120Ω电阻。注意:如果只有两个节点,两个电阻分别放在两个节点上,总线两端就都有了。

配置节点波特率为500kbps。以STM32为例,如果APB1时钟是36MHz,预分频器设为4,时间段1设为15,时间段2设为2,采样点就是(1+15)/(1+15+2)=88.9%,这是比较标准的配置。

6.3 发送与接收测试

节点A发送标准帧,ID设为0x123,数据为8字节递增。节点B接收并打印。用CAN分析仪抓包,确认ID、DLC、数据都正确。然后测试仲裁:两个节点同时发送不同ID,观察低ID是否优先。

我建议新手一定要做这个实验,亲手抓一次波形,看一次仲裁过程,比看十遍文档都管用。很多概念比如显性覆盖隐性、位同步、采样点,只有亲眼看到才能真正理解。

6.4 错误注入测试

故意制造错误来观察CAN的错误处理机制:

  • 拔掉一个终端电阻,观察错误帧增加。
  • 把波特率设错,观察错误计数器飙升。
  • 短接CAN_H和CAN_L,观察节点是否进入总线关闭状态。

CAN控制器有错误计数器,发送错误超过255次会进入总线关闭状态,停止发送。这是保护机制,防止故障节点一直干扰总线。恢复需要重新初始化或者等待一段时间。

7. 我个人在实际操作中的体会

搞CAN总线这些年,最大的体会是:协议本身不难,难的是现场排查。实验室里跑通不代表装车能用,装车能用不代表跑三年不出问题。我见过太多设计阶段忽略保护电路、忽略终端匹配、忽略地线处理的案例,最后都是现场返工。

另一个体会是,工具比想象中重要。一个靠谱的CAN分析仪能省掉大量猜测时间。我早期用便宜的分析仪,抓包丢帧严重,后来换了带时间戳和错误统计的,排查效率翻倍。示波器也是必备,看波形能直接判断是物理层问题还是协议层问题。

最后分享一个小技巧:如果你怀疑某个节点干扰总线,可以逐个断开节点,观察错误计数是否下降。这个方法虽然笨,但非常有效。我靠这招定位过好几个疑难杂症,包括一个电源模块在特定工况下向总线注入噪声的问题。

CAN总线这东西,入门容易精通难。但只要你把物理层、帧结构、仲裁机制、保护设计这几块吃透,再配合实际动手测试,基本上就能应对绝大多数场景了。后续如果要做CAN FD或者CANopen,也是在这个基础上扩展,底层逻辑是相通的。

返回列表