ARTICLE DETAIL

资讯详情

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

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

CAN总线从物理层到实战:差分信号、SRR位与保护电路全解析 1. 为什么CAN总线值得你花时间搞明白如果你拆过任何一辆2010年之后生产的汽车哪怕只是换个大灯或者加装个倒车雷达你大概率会碰到两根拧在一起的双绞线——一根CAN_H一根CAN_L。很多人第一次见这东西的反应是“这不就是普通信号线吗”然后拿万用表一量发现电压还在跳完全看不懂。这就是CAN总线给人的第一印象看着简单用起来懵。CANController 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.5VCAN_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位标识符。标识符不表示地址而是表示消息的优先级和内容类型。数值越小优先级越高。标准帧的结构是SOF1位 标识符11位 RTR1位 IDE1位 r01位 DLC4位 数据场0到8字节 CRC15位 CRC界定符1位 ACK槽1位 ACK界定符1位 EOF7位。扩展帧在标准帧基础上把标识符扩展到29位中间多了SRR位和IDE位。这里就引出了热搜词里的“CAN总线SRR位”。3.2 SRR位到底是什么为什么容易搞混SRR全称是Substitute Remote Request替代远程请求位。它只存在于扩展帧中位置在标准标识符的11位之后、IDE位之前。在标准帧里这个位置是RTR位远程发送请求位。扩展帧用SRR位替代了RTR位的位置并且SRR位始终发送隐性电平。为什么要这样设计因为CAN总线仲裁机制要求当标准帧和扩展帧同时竞争总线时标准帧的RTR位如果是显性数据帧而扩展帧的SRR位是隐性那么标准帧会赢得仲裁。这保证了标准帧的优先级高于扩展帧避免扩展帧长时间占用总线导致标准帧饿死。很多人看协议文档时会把SRR和RTR搞混因为它们在帧里的位置相同。记住一个口诀标准帧那个位置叫RTR扩展帧那个位置叫SRRSRR永远是隐性RTR在数据帧里是显性、在远程帧里是隐性。3.3 仲裁机制为什么CAN不会撞车CAN总线最精妙的设计就是非破坏性仲裁。当多个节点同时发送时它们逐位比较发送显性位的节点会检测到总线是显性继续发送发送隐性位但检测到总线是显性的节点知道自己优先级低立刻退出仲裁转为接收状态。整个过程没有任何数据被破坏赢家继续发输家等下一轮。这个机制依赖两个条件第一显性位能覆盖隐性位物理层上显性压差更大第二所有节点必须在同一位时间采样。所以CAN对时钟同步要求很高每个节点都要通过SOF位重新同步。我实测过用示波器抓仲裁过程两个节点同时发一个ID是0x100一个是0x200。0x100的二进制是1 0000 00000x200是10 0000 0000。在第2位0x100发显性00x200发隐性10x200立刻退出。整个过程不到1微秒。3.4 数据场长度与DLC编码DLCData 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节点保护电路包括共模电感选100μH到200μH额定电流要大于总线最大电流。TVS管选双向TVS击穿电压24V到36V峰值脉冲功率至少400W。分裂终端两个60Ω电阻串联中间节点通过4.7nF电容到地。限流电阻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_HCAN_L接CAN_L。在两个节点的两端各并一个120Ω电阻。注意如果只有两个节点两个电阻分别放在两个节点上总线两端就都有了。配置节点波特率为500kbps。以STM32为例如果APB1时钟是36MHz预分频器设为4时间段1设为15时间段2设为2采样点就是(115)/(1152)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也是在这个基础上扩展底层逻辑是相通的。
返回列表