ARTICLE DETAIL

资讯详情

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

CAN总线从物理层到应用层:SRR位仲裁与终端电阻避坑指南

CAN总线从物理层到应用层:SRR位仲裁与终端电阻避坑指南 CAN总线这个东西很多做嵌入式或者汽车电子的朋友第一次接触时都会觉得它“看起来简单用起来处处是坑”。两根线、差分信号、多主架构教科书上几页纸就讲完了但真到了车上或者工业现场你会发现同样一个CAN节点有人跑得稳如老狗有人隔三差五就报总线关闭。问题往往不在协议本身而在于对细节的理解深度。这篇内容我打算把CAN总线从物理层到应用层彻底拆一遍重点讲那些文档里一笔带过、但实际调试中决定成败的东西——比如SRR位到底在什么场景下会引发仲裁异常、终端电阻为什么必须是120欧而不是随便一个值、总线保护电路怎么设计才能扛住浪涌。不管你是刚入行的嵌入式工程师还是已经在做车载网络诊断的老手应该都能从里面找到一些之前没注意到的点。1. 从两根线的物理层说起CAN为什么用差分信号1.1 差分传输的抗干扰逻辑CAN总线最底层的东西就是两根线CAN_H和CAN_L。很多人知道它们上面跑的是差分信号但未必想过为什么非得用差分。单端信号比如UART的TX/RX参考的是地电平一旦地线上有噪声或者两个节点之间存在地电位差接收端就可能把噪声当成有效电平。差分信号不一样它传输的是两根线之间的电压差外部电磁干扰同时耦合到两根线上时这个差值基本不变接收端照样能正确判决。具体到CAN的电气规范显性位逻辑0时CAN_H约3.5V、CAN_L约1.5V差值约2V隐性位逻辑1时两根线都约2.5V差值接近0V。收发器就是靠检测这个差值来判断总线状态的。这里有个容易被忽略的点隐性位时两根线电压相同并不意味着总线“没电”而是处于一种平衡态。我见过有人用万用表量CAN总线发现两根线电压一样就以为线路断了其实那可能只是当前没有节点在发送显性位。差分传输带来的另一个好处是共模抑制。工业现场或者汽车环境里电机、继电器、点火线圈这些东西会产生很强的共模干扰单端信号早就被淹没了但差分接收器可以把共模部分抑制掉只放大差模部分。这也是为什么CAN能在电磁环境恶劣的场合活下来的根本原因。1.2 终端电阻不是可选是必须CAN总线两端各需要一个120欧的终端电阻这个大家都知道但为什么是120欧、为什么必须两端、少一个会怎样值得说清楚。CAN总线的特性阻抗大约是120欧终端电阻的作用是匹配这个阻抗吸收信号到达线端时的反射。如果不加终端电阻信号到了线端会像光遇到镜面一样反射回来和原始信号叠加导致波形畸变。在低速短距离时可能还能勉强通信但一旦速率上去或者线缆变长反射就会造成位采样错误表现为随机错误帧甚至总线关闭。为什么是两端而不是一端因为CAN总线是总线型拓扑信号从发送节点向两个方向传播两个末端都需要吸收。只在一端加电阻的话另一端照样反射。我实测过一条20米左右的CAN线只在一端加120欧500kbps下误码率明显上升两端都加之后立刻干净。这里有个实操中的坑有些开发板为了方便板上已经焊了120欧电阻你把它接到一个已经有终端电阻的总线上就变成了并联等效阻值变成60欧总线负载加重通信距离和抗干扰能力都会下降。所以拿到板子第一件事就是确认终端电阻能不能断开不能断开的话要么改板要么就别往已有终端的网络里挂。1.3 总线电平与收发器选型收发器是CAN控制器和物理总线之间的桥梁负责把TTL电平转换成差分信号反过来也一样。常见的收发器有TJA1050、SN65HVD230、MCP2551等选型时主要看几个参数速率、供电电压、是否支持低功耗模式、有没有隔离需求。3.3V的MCU配5V收发器时要注意电平匹配虽然很多收发器的TX引脚能容忍3.3V输入但RX输出是5V直接接3.3V MCU可能烧引脚。稳妥的做法是选3.3V供电的收发器或者加电平转换。另外如果总线上有高压或者地电位差很大的情况比如电动汽车的电池管理系统和整车控制器之间最好用隔离型收发器比如ADM3053这类带隔离电源的虽然贵一点但能避免地环流烧掉整个节点。2. 帧结构里的魔鬼SRR位与仲裁机制的真实关系2.1 标准帧与扩展帧的仲裁差异CAN帧分标准帧和扩展帧标准帧11位标识符扩展帧29位。扩展帧的帧结构里有一个SRR位Substitute Remote Request位于标准帧的RTR位位置。这个位的设计初衷是为了兼容标准帧和扩展帧在同一总线上的仲裁。标准帧的RTR位在数据帧时是显性远程帧时是隐性。扩展帧在对应位置放的是SRR位固定为隐性。这样设计的结果是如果两个帧的11位基本ID相同一个是标准帧一个是扩展帧那么标准帧的RTR位如果是显性数据帧就会在仲裁中胜过扩展帧的隐性SRR位标准帧优先发送。这个机制保证了标准帧在ID冲突时优先于扩展帧算是一种对传统格式的保护。但这里有个细节如果标准帧是远程帧RTR为隐性那它和扩展帧的SRR位都是隐性仲裁会继续往后比。扩展帧后面还有IDE位显性和18位扩展ID而标准帧在RTR之后就是数据长度码了。所以实际仲裁结果取决于后续位的比较不是简单的一句“标准帧优先”能概括的。2.2 SRR位引发的典型仲裁异常我遇到过一种情况总线上同时存在标准帧和扩展帧且基本ID相同结果通信时好时坏。用分析仪抓波形才发现当标准帧是远程帧时它和扩展帧的仲裁会一直比到扩展ID部分而扩展帧的扩展ID如果恰好全是隐性标准帧的后续位IDE位为隐性因为标准帧没有IDE位实际是保留位可能会输掉仲裁。这种场景很少见但一旦出现就很难排查因为大多数人根本不会想到SRR位和RTR位的组合会出问题。更常见的坑是有些CAN控制器在配置扩展帧时如果基本ID和某个标准帧相同而标准帧是数据帧那扩展帧永远抢不到总线。这时候如果扩展帧承载的是关键控制指令就会导致响应延迟。解决办法要么是重新规划ID分配让标准帧和扩展帧的ID空间不重叠要么统一用扩展帧。2.3 仲裁丢失后的自动重传CAN控制器在仲裁丢失后会自动转为接收状态等总线空闲后重新尝试发送。这个重传是硬件自动完成的不需要软件干预。但要注意如果总线上一直有更高优先级的帧在发送低优先级帧可能长时间发不出去这就是所谓的“优先级反转”在CAN上的体现。实际项目中如果发现某个节点的报文延迟很大先别怀疑软件用分析仪看看总线负载和ID优先级。总线负载超过70%时低优先级报文的延迟会急剧增加。我一般建议关键控制报文用低ID高优先级状态上报类用高ID同时控制总线负载在50%以下留出余量。3. 错误处理与总线保护从TEC/REC到总线关闭3.1 错误计数器的工作机制每个CAN节点内部都有两个计数器发送错误计数器TEC和接收错误计数器REC。发送出错时TEC加8接收出错时REC加1如果是发送节点检测到错误REC加8。成功发送一帧TEC减1成功接收一帧REC减1。这些加减规则看起来简单但组合起来决定了节点什么时候进入错误被动、什么时候总线关闭。当TEC或REC超过127时节点进入错误被动状态此时它发送的帧里错误标志是隐性的不再主动破坏总线。当TEC超过255时节点进入总线关闭状态自动从总线上断开不再发送也不接收。只有软件干预或者总线空闲128次11位隐性位后节点才能恢复。这里的关键是总线关闭不是故障而是一种保护机制。它防止一个故障节点持续破坏总线通信。但很多工程师看到总线关闭就慌以为是硬件坏了其实先查错误计数器看看是发送错误多还是接收错误多能快速定位问题方向。3.2 常见错误类型与排查路径CAN协议定义了五种错误类型位错误、填充错误、CRC错误、格式错误、应答错误。每种错误对应的排查方向不同。位错误是发送节点在发送时监测总线发现总线上电平和自己发送的不一致。如果是仲裁阶段那是正常的仲裁丢失如果是数据阶段说明总线上有其他节点在强行覆盖可能是硬件故障。填充错误是位填充规则被破坏连续5个相同电平后必须插入一个相反电平如果接收方看到6个相同电平就报填充错误。这通常意味着波特率不匹配或者线路干扰。CRC错误是接收方计算的CRC和帧里的CRC不符说明数据在传输中变了可能是干扰或者线路问题。格式错误是帧的固定格式位出现非法电平比如CRC界定符应该是隐性却是显性。应答错误是发送节点在ACK槽没有收到任何节点的显性应答说明总线上没有其他节点正确接收可能是只有自己一个节点或者波特率不一致。排查时我一般按这个顺序先确认总线上至少有两个节点且波特率一致再看终端电阻然后查线缆屏蔽和接地最后才怀疑收发器或控制器。3.3 总线保护电路的设计要点汽车和工业环境里CAN总线暴露在各种瞬态干扰下保护电路必不可少。常见的保护方案包括TVS管、共模电感、限流电阻、隔离收发器。TVS管选型要看钳位电压和响应时间一般选双向TVS钳位电压要低于收发器引脚的最大耐压。共模电感用来抑制共模干扰选的时候注意额定电流和阻抗特性别选了个直流电阻太大的导致信号衰减。限流电阻一般串在CAN_H和CAN_L上阻值几欧到几十欧用来限制故障电流但会稍微影响信号幅度需要权衡。我见过一个案例某车载节点在点火瞬间频繁总线关闭查了半天发现是收发器没有TVS保护点火线圈的瞬态脉冲通过线束耦合进来把收发器打挂了。加了TVS和共模电感后问题消失。所以如果你的应用环境有电机、继电器、点火线圈这些感性负载保护电路千万别省。4. 汽车CAN总线电路图的读图与设计4.1 典型车载CAN网络拓扑汽车上的CAN网络通常分几条总线动力CAN高速500kbps、车身CAN低速125kbps、诊断CAN500kbps等。不同总线之间通过网关连接。读电路图时先找网关然后顺着CAN_H和CAN_L两条线看各个节点怎么挂上去的。每个节点一般包括MCU、CAN控制器可能集成在MCU里、CAN收发器、终端电阻只有两个节点有、保护电路。电路图上收发器的TX/RX接MCU的CAN_TX/CAN_RXCAN_H/CAN_L接总线VCC和GND接电源。有些收发器还有STB待机引脚用来控制低功耗模式。读图时重点看几个地方终端电阻在哪个节点上、有没有隔离、保护器件是什么、电源怎么供。这些决定了网络的可靠性和抗干扰能力。4.2 节点电路设计中的易错点第一个易错点是终端电阻的分布。有些车厂把终端电阻放在网关和某个末端节点里如果你替换了那个末端节点但没装电阻整个网络就少了终端通信距离和稳定性都会下降。第二个是地偏移不同节点的地电位可能不同尤其是大电流负载附近地偏移过大会导致收发器共模电压超出范围通信失败。解决办法是用隔离收发器或者确保所有节点共地良好。第三个是电源设计。CAN收发器对电源噪声敏感尤其是汽车环境里的负载突降和冷启动。收发器电源最好加LC滤波必要时用LDO单独供电。我见过因为收发器和电机共用一路电源电机启动时CAN通信中断的案例后来给收发器单独加了一级滤波就好了。4.3 从电路图到实际调试拿到电路图后实际调试时先用万用表量CAN_H和CAN_L的静态电压隐性时应该都是2.5V左右显性时CAN_H约3.5V、CAN_L约1.5V。如果电压不对先查收发器供电和使能引脚。然后用示波器看波形重点看上升沿和下降沿是否干净、有没有振铃、位宽是否准确。如果波形上有明显的振铃通常是终端电阻不匹配或者线缆分支太长。CAN总线的分支长度一般建议不超过0.3米分支太长会引入反射。如果波形幅度不够可能是终端电阻并联太多导致负载过重或者线缆太长导致衰减过大。调试时我习惯先用一个已知良好的节点作为参考逐个接入新节点每接一个测一次波形和通信质量这样能快速定位是哪个节点引入的问题。5. 波特率配置与采样点容易被忽视的通信质量因素5.1 波特率与晶振误差的容忍度CAN的波特率由每个位的时间划分决定通常分为同步段、传播段、相位缓冲段1和相位缓冲段2。采样点一般设在相位缓冲段1之后推荐在75%到87.5%之间。波特率越高对晶振误差的容忍度越低。比如500kbps时总晶振误差一般要求小于0.5%而125kbps时可以放宽到1.5%左右。实际项目中如果两个节点的晶振误差都接近上限再加上温度漂移就可能出现偶发性通信错误。我建议关键节点用高精度晶振至少±0.1%的普通节点用陶瓷谐振器的话要算清楚误差预算。有个简单的估算方法总误差 节点1误差 节点2误差 线缆延迟误差这个总和要小于协议允许的容忍度。5.2 采样点位置的选择采样点位置决定了在位的哪个时刻读取总线电平。设得太早信号还没稳定设得太晚可能已经受到下一个位的影响。一般推荐采样点在75%到80%之间具体要看总线长度和收发器延迟。如果总线上节点多、线缆长传播延迟大采样点要适当往后移。但也不能太晚否则相位缓冲段2太短同步能力下降。我一般用CAN分析仪或者示波器实测波形调整采样点直到误码率最低。有些MCU的CAN控制器支持灵活配置这些参数别用默认值就完事花十分钟调一下能省很多后期排查时间。5.3 同步机制与重同步CAN是异步通信靠位流里的跳变沿来同步。每帧的起始位SOF是一个显性到隐性的跳变所有节点用它来对齐。之后每个位如果有跳变也会用来微调同步。如果连续多个位没有跳变比如全显性或全隐性同步精度就会下降所以协议规定了位填充每5个相同位后强制插入一个相反位保证至少有跳变。重同步发生在检测到跳变沿时如果跳变沿在同步段之外控制器会调整相位缓冲段来补偿。这个机制允许节点之间有一定的时钟误差但误差不能超过同步段和相位缓冲段的总和。配置时如果相位缓冲段设得太小重同步能力不足就会出现同步错误。6. 实际项目中的CAN调试经验与避坑清单6.1 总线负载与报文调度总线负载是实际项目中最容易出问题的地方。理论上CAN可以跑到1Mbps但实际负载超过70%后延迟就不可控了。我一般建议设计时把负载控制在40%到50%留出余量给突发报文和错误重传。报文调度上周期性报文用固定周期发送事件性报文用事件触发但要注意事件风暴。比如某个故障发生时多个节点同时上报总线瞬间满载关键控制报文发不出去。解决办法是给事件报文加随机延迟或者优先级分级确保关键报文始终有带宽。6.2 线缆选择与屏蔽接地CAN线缆要用双绞线特性阻抗120欧屏蔽层是否接地要看环境。汽车里一般用非屏蔽双绞线因为整车地网络复杂屏蔽层接地不当反而引入干扰。工业环境里如果干扰严重可以用屏蔽双绞线但屏蔽层要单点接地避免地环流。线缆长度和波特率的关系也要注意1Mbps时最长40米500kbps时100米125kbps时500米。超过这个长度要么降速要么加中继器。我见过有人用普通排线跑500kbps结果通信距离不到10米就误码率飙升换成双绞线后立刻正常。6.3 常见故障的快速定位表现象可能原因排查方法完全无通信终端电阻缺失、收发器损坏、电源异常量静态电压、查终端电阻、换收发器偶发错误帧波特率不匹配、晶振误差大、干扰对分析仪抓波形、算误差预算、查屏蔽总线关闭TEC超255、持续发送错误读错误计数器、查发送电路、看仲裁通信距离短线缆阻抗不对、分支太长、负载过重换双绞线、缩短分支、减少节点特定节点掉线该节点电源不稳、地偏移大单独供电、测地电位差、加隔离这张表是我这些年调试CAN总结出来的大部分问题按这个顺序查都能定位到。关键是别一上来就怀疑软件CAN的物理层问题远多于协议层问题。6.4 分析仪与示波器的配合使用调试CAN离不开工具。CAN分析仪用来抓报文、看错误帧、统计总线负载示波器用来看波形质量、测位宽、查反射。两者配合使用效率最高分析仪告诉你“发生了什么”示波器告诉你“为什么发生”。比如分析仪报CRC错误你用示波器看波形可能发现某个位的电平幅度不够被接收方判错了。再查下去可能是终端电阻并联太多导致负载过重。这种问题只看分析仪是找不到根因的。我一般建议团队里至少备一台带CAN解码功能的示波器虽然贵一点但排查疑难问题时能省大量时间。分析仪可以用USB的便宜便携日常抓包够用了。6.5 从失败案例中学到的教训早些年做过一个项目CAN通信在实验室一直很稳到了现场就频繁出问题。后来发现是现场有大功率变频器共模干扰通过线缆耦合进来。实验室里没这个干扰源所以测不出来。教训是实验室测试要尽量模拟现场环境至少加一些干扰源试试。还有一个案例是节点数量增加后通信质量下降。查了半天发现是某个节点的收发器是5V的而总线是3.3V系统电平不匹配导致显性位电压不够仲裁时经常输。换成3.3V收发器后问题解决。所以选型时一定要确认电平匹配别只看功能。7. 关于CAN FD与未来演进的个人观察CAN FD灵活数据速率这几年在汽车上越来越普及它解决了经典CAN的两个瓶颈数据场最长8字节和最高1Mbps速率。CAN FD的数据场可以到64字节数据段速率可以到5Mbps甚至更高仲裁段还是保持经典CAN的速率以保证兼容性。实际用下来CAN FD的迁移成本主要在控制器和收发器都要支持线缆和拓扑基本不变。但要注意CAN FD的帧格式和经典CAN不同FDF位和BRS位用来标识FD帧和速率切换如果总线上混有经典CAN节点它们看到FD帧会报格式错误。所以迁移时要么全换要么用网关隔离。我个人觉得对于大多数工业控制和普通车载应用经典CAN在未来几年还是够用的。CAN FD更适合需要大数据量传输的场景比如ADAS传感器数据、OTA升级包传输。选型时别盲目追新先算清楚带宽需求够用就好。8. 写在最后一些零散但有用的经验终端电阻的测量断电情况下量CAN_H和CAN_L之间的电阻应该是60欧左右两个120欧并联。如果量出来是120欧说明只有一端有电阻如果是40欧说明有三个电阻并联可能某个节点多焊了。波特率快速验证用分析仪设一个和总线相同的波特率如果能收到正确报文说明波特率一致。如果收到大量错误帧先检查波特率再检查采样点。总线关闭的恢复有些MCU的CAN控制器支持自动恢复有些需要软件重新初始化。设计时最好加上自动恢复逻辑检测到总线关闭后延时一段时间重新初始化避免节点永久掉线。线缆颜色汽车上CAN_H一般是黄色或橙色CAN_L是绿色或蓝色但不同车厂可能不同接线前一定查电路图别凭颜色猜。关于SRR位再补充一句如果你在抓包时看到标准帧和扩展帧混在一起且ID冲突优先检查ID分配表确保标准帧和扩展帧的ID空间不重叠。这是最省事的办法比去研究仲裁细节高效得多。CAN总线这东西入门容易精通难难就难在细节多、场景杂。但只要你把物理层、帧结构、错误处理这三块吃透了大部分问题都能自己定位。剩下的就是多动手、多抓波形、多总结经验这东西看再多文档也不如自己踩一遍坑来得深刻。
返回列表