开场与视频结构说明
开场指出CAN没有地址也没有主节点,却能让车内数十个控制器共享两根线不停交换数据,即使多个控制器同时开始发送也不会损坏数据。全片从理论讲到代码实现再到实战经验,内容较长但按章节划分,可按需跳看,随后先讲CAN为何被创造。
系统讲解CAN总线从差分信号与仲裁到帧结构、错误处理、位定时、CAN FD、STM32代码与DBC工具的完整知识体系。
从汽车多ECU共享总线的需求出发,说明UART、SPI、I2C为何不适合车内长线噪声环境,引出CAN抗噪与无主从的设计动机。
开场指出CAN没有地址也没有主节点,却能让车内数十个控制器共享两根线不停交换数据,即使多个控制器同时开始发送也不会损坏数据。全片从理论讲到代码实现再到实战经验,内容较长但按章节划分,可按需跳看,随后先讲CAN为何被创造。
车内发动机、制动、安全气囊、仪表、电池管理等数十个电子控制器统称ECU,彼此需要交换信息,例如车速要供制动控制器、仪表和发动机控制器使用。CAN只需两根线,所有ECU都接到这条共享通信线上互相交换数据,这种多设备共享的通信线称为总线。
UART基本形态是一对一连接两个设备;SPI可连多个设备,但每个从设备需要一根额外的选择线;I2C能用两根线连多个设备,但通常由一个产生时钟的主设备控制通信。这三者多用于单板内或物理距离很近的设备之间,而车内情况不同。
车内线束较长且噪声环境恶劣,单个主控设备故障也可能影响通信。因此汽车需要抗噪且无主从结构的通信;CAN的故障封闭机制可限制部分节点故障,但收发器或布线故障仍可能影响整条总线。
拆解CAN节点的MCU、控制器、收发器三部分,说明广播通信与ID表示内容而非地址,以及验收滤波只收所需报文。
接入CAN总线的单个设备称为节点,节点内部主要有三部分:MCU运行决定发什么数据、使用接收数据的软件;CAN控制器在硬件上组帧、发位、竞争总线访问并检查错误,如今多集成进MCU,STM32G474上用名为FDCAN的外设承担;收发器把MCU的3.3伏逻辑信号与总线电压互相转换,因此节点必须经收发器接入总线,不能像UART那样直连引脚。
节点经CAN High与CAN Low接入总线,一个节点发送报文时所有节点都会收到,这称为广播。CAN规范没有接收方地址和发送方编号,每条报文携带的ID说明的是报文内容而非发给谁。
只接收节点所需报文ID的机制称为验收滤波,由控制器硬件完成过滤,CPU只需处理自己需要的报文。此外ID还承担优先级的作用,具体将在后面详细讲解。
对比单端信号在车内的噪声问题,讲解差分信号、显性隐性电平、共模噪声抵消、双绞线与120欧终端电阻的作用及60欧测量法。
若像UART那样用单根线以0伏和3.3伏传信号,车内线束长且紧邻电机、点火线圈等强噪声源,噪声耦合到线上会让接收方把0读成1或把1读成0;各节点地电位也略有差异,参考点偏移会让同一信号被读成不同结果。因此CAN改用两根线CAN High与CAN Low。
CAN不按每根线的电压、而按两线电压差判定0和1,即差分信号。以5伏收发器为例,无节点发送时CAN_H与CAN_L都在约2.5伏,差值为0,称为隐性即逻辑1;发送0时收发器把CAN_H拉向约3.5伏、CAN_L拉向约1.5伏,差值约2伏,称为显性即逻辑0。接收端差值高于0.9伏判为显性,低于0.5伏判为隐性,中间区间结果不确定。
两线同路径靠近走线时噪声几乎等量耦合到两根线上,例如CAN High与CAN Low同时升高1伏,接收端只看差值,差值不变,噪声因此被抵消,这是差分信号的最大优势。等量出现在两线上的成分称为共模,只要共模电压在收发器数据手册规定范围内即可正确解码。两线还互相绞合,使两线相对噪声源的位置交替,耦合更均匀;实际产品有时还用共模扼流圈。
CAN总线两端各有一个120欧终端电阻,作用有二:一是防止反射,信号到开路末端会反射并与原信号叠加,而CAN双绞线特性阻抗约120欧,用120欧端接可吸收信号;二是在总线由显性转隐性时帮助差分电压快速下降,收发器释放差分驱动后电压差经终端电阻衰减,使接收方能可靠识别隐性。终端电阻不是每个节点都装,必须在总线物理两端各有一个。
现场CAN出问题时首先断电,用万用表测CAN High与CAN Low之间电阻。两个120欧电阻并联,正常应读到约60欧;读到120欧说明缺一个终端,读到40欧说明多了一个终端,接近0欧则说明两线在某处短路。
从收发器输出级讲起,说明CAN总线的线与逻辑与I2C开漏总线的类比,以及显性转隐性时的振铃问题。
收发器输出级在CAN High侧有接电源的开关、CAN Low侧有接地的开关。发显性0时两开关导通,形成约2伏差分电压;发隐性1时释放差分驱动,差分电压接近0伏。多节点同时发送时,只要有一个发0,总线上就检测到显性0。
所有节点都发1时总线才是1,任一节点发0总线就是0,这与逻辑与相同,在CAN中称为线与。该原理类似I2C开漏总线,两者电气结构不同,但逻辑特性相同,这正是显性位优先于隐性位的原因。
典型CAN收发器从显性切换到隐性时会关闭输出驱动,输出阻抗急剧升高,若布线存在阻抗不连续或长支线,信号反射会引起振铃。尤其在CAN FD高速数据段位时间更短,这类波形失真对通信可靠性的影响更大。
本章讲CAN非破坏性仲裁:多节点同时发送时按ID逐位比较,显性覆盖隐性,输者立即转为接收,胜者报文不受损,ID越小优先级越高。
总线空闲时多个节点同时发送,以电机控制器ID 0x120、BMS 0x124、仪表0x3E0为例:控制器每发一位都比对总线实际电平,发1却检测到0即输掉仲裁并立即转接收。仪表在第2位、BMS在第9位先后退出,最终只有0x120完整发出,且胜者报文一位未损。
这种机制叫非破坏性仲裁:输的节点恰在发1检测到0的那一位退出,而该位总线值与胜者所发的0一致,所以胜者数据不被破坏。对比早期以太网CSMA/CD,冲突会让所有帧损坏并需随机退避重发;CAN即使多节点同时起发也不浪费总线时间,输者仍正常接收并回ACK,帧结束后硬件自动重发,无需软件写代码。
仲裁的结论是ID数值越小,高位越早出现0,优先级越高。若同时刻刹车控制器发ID 0x000,电机控制器在第3位就会输掉。因此实际分配ID就是设计优先级:刹车、动力等不能容忍延迟的报文分配小ID。
两个节点绝不能发相同ID:ID相同则仲裁段分不出胜负,双方继续同时发送,直到DLC或数据段位值不同时,发1的节点检测到位错误。设计规则是一个ID只由一个节点发送。另外高优先级不等于立即发送,若总线正有帧在传仍需等待,仲裁只在总线空闲后多节点同时起发时起作用。
本章拆解标准数据帧各字段,从SOF、11位ID、RTR、IDE、DLC到CRC、ACK与EOF,并说明帧开销、扩展帧29位ID与远程帧。
以0x120报文为例定义数据:电机转速1500 RPM、电池电压36.5 V、电机温度25摄氏度、电机状态运行,另加计数器确认周期更新、加校验和验证完整性,按规则编码后共8字节十六进制数据。转换规则留到代码与DBC章节详述,此处只需记住发送8字节。
标准帧CAN 2.0A最前是单个显性SOF位,空闲时产生隐性到显性边沿供所有节点硬同步。随后11位ID按高位先发,仲裁在ID与RTR上进行,11位理论上可表示2048个ID。RTR数据帧为显性0、远程帧为隐性1;IDE标准帧为0;R0为保留位;4位DLC表示数据字节数,本例8字节即1000,标准帧可载0到8字节。
数据之后是15位CRC,由前面各位计算得出用于检错,本例为0x7631;接着是单个隐性CRC界定符,然后是ACK槽与ACK界定符共两位,帧以7个隐性位的EOF结束。帧结束到下一帧开始之间至少有3位帧间隔。
累加各字段,载8字节数据的帧共108位,含3位帧间隔为111位,此外还有第7章要讲的填充位。因此实际数据占帧长不到60%,其余是帧首尾标志、仲裁、格式与长度、检错确认及填充位。这种效率问题正是后来引入CAN FD的原因之一。
11位ID不够时用CAN 2.0B新增的扩展帧,ID为29位:11位基本ID后,标准帧RTR的位置放隐性SRR位,IDE为隐性1,再接剩余18位ID与RTR。若标准帧与扩展帧前11位相同,第12位标准帧发显性RTR 0、扩展帧发隐性SRR 1,故标准帧赢得仲裁。
同一ID下数据帧优先于远程帧,因为RTR在数据帧为0、远程帧为1。远程帧用于向另一节点请求数据,但实际很少使用,CAN FD则完全不含远程帧。
补齐帧结构讲解中暂缓的细节:位填充、CRC与ACK,说明它们如何保证同步、检错与确认。
位填充规则:连续五个相同值后插入一个相反位,接收方按同规则去除。示例帧ID末尾五个0后插入1,全帧共插入6个填充位,因此同样8字节帧长度随数据变化;含帧间隔共117位,500kbps下约234微秒。位填充只作用于SOF到15位CRC结束,CRC界定符、ACK与EOF为固定格式不填充。
位填充有两个目的:一是同步,CAN无独立时钟线,接收方靠信号边沿校正位定时,填充保证相同值不超过五位、边沿在有限位内出现;二是预留错误标志,填充区内不可能出现连续六个相同位,节点故意发六个相同位即可宣告帧无效,即错误标志。
发送方对SOF到数据场结束的位计算15位CRC并放入帧中,填充位不参与计算,生成多项式由规范定义;接收方同样计算并与帧中CRC比较,不同则说明传输中数据被破坏。CAN CRC保证检测帧内最多五个随机位错误,也能检测15位以内的突发错误;但该能力仅在位错误不影响位填充时成立,若位错误导致接收方误判填充位,极少数情况下CRC可能漏检。
ACK槽中发送方发隐性1,任何无错接收CRC的节点都发显性0,发送方据此确认至少有一个节点正确接收。但ACK无法告知是哪个节点收到,必需接收的节点断电时,只要其他节点正常,发送方仍能检测到ACK。因此重要报文按固定周期重复发送,接收侧超时未收到即判为通信故障。
讲解CAN控制器的五类错误检测、错误帧、TEC与REC计数器及error active、passive、bus off三态,核心是故障封闭。
CAN控制器在硬件中检测五类错误:位错误,即发送值与总线检测值不同,仲裁场与ACK槽中发1检测到0属正常不算错;填充错误,填充区内出现连续六个相同位;CRC错误,接收方计算值与帧中CRC不同;格式错误,CRC界定符、ACK界定符、EOF等固定值位上检测到不同值;ACK错误,发送方在ACK槽未检测到0。
检测到错误的节点在下一位置开始发送错误帧,但检测到CRC错误的节点要等到ACK界定符之后一位才开始。错误帧以六个显性位的错误标志开头,其他节点收到后也检测到填充或格式错误并各自发送错误标志,使总线上所有节点都判该帧无效。发送方控制器自动重发同一帧。
若某节点收发器故障、对有效帧也持续发错误标志,通信会被反复打断,因此控制器用错误计数器管理状态:发送出错TEC加8,接收出错REC通常加1;成功发送TEC减1,成功接收REC减1。即出错大幅加、正常小幅减,偶发噪声的节点计数会回落保持较低,持续出错的节点计数快速上升。
两个计数器都不超过127时节点为error active,检测到错误时发送六个显性位的主动错误标志。任一计数器达到128及以上则进入error passive,错误标志改为六个隐性位,不再破坏有效帧。TEC超过255时节点进入bus off,完全退出总线活动。
节点每次发送都出错,TEC每次加8,第32次错误时TEC达256超过255进入bus off。从bus off恢复需检测到128次连续11位隐性,即128次正常帧结束或空闲后才重新入网;500kbps下恢复至少需2.8毫秒。
故障封闭只在故障节点的CAN控制器能检测错误并停止输出时有效。若收发器发送输入被卡在显性,或CAN High与CAN Low短接,整条总线可能瘫痪。一直发送高优先级报文的节点不产生任何错误,故障封闭无法阻止它占用总线。
单板接总线发送报文时没有接收节点在ACK槽发0,产生ACK错误,控制器不断重发同一帧,TEC每次加8,第16次错误后进入error passive。但error passive节点检测到ACK错误后,若被动错误标志期间仍未检测到其他节点的显性位,TEC不再增加,因此不会进入bus off。单板测试应使用loopback模式。
本章讲经典CAN的位定时:时间量子与四段划分、采样点位置、位速率与总线长度关系、硬同步与重同步及SJW,并用STM32G474的500k配置做实例计算。
CAN没有时钟线,各节点须预先配置相同位速率,并像UART一样由自身时钟生成位定时。500kbps时一位为2微秒,控制器把一位细分为时间量子,例如一位分20个时间量子则每个100纳秒。一位由四段组成:同步段、补偿总线往返物理延迟的传播段、相位段一与相位段二,位值在相位段一与二之间判定。
采样点位于相位段一与相位段二之间,通常放在位时间的75%到87.5%,汽车应用中约80%常见。UART在位中间采样,CAN却偏后采样,原因是仲裁:总线两端节点在同一比特内各自发送并回读比较,信号沿电缆传播约每米5纳秒,加上收发器与控制器延迟,采样点必须等完整往返延迟过去,两节点才能在同一比特内比较同一总线值。
采样点之前要留足够长的传播段,这就引出位速率与总线长度的关系:提高位速率会缩短位时间,但往返延迟由总线长度和收发器延迟决定,不会变短,所以位速率越高总线必须越短。经验值约为1Mbps对应40米、500kbps对应100米、125kbps对应500米。
各节点时钟即使同频也有容差,位定时会随时间漂移。控制器在帧起始边沿做硬同步,之后在每个隐性到显性边沿重同步:边沿检测偏晚就加长相位段一,偏早就缩短相位段二。一次重同步可修正的最大时间量子数称为SJW。重同步依赖边沿,保证有限位内出现边沿的规则正是位填充。位填充、采样点位置与总线长度限制共同保证无时钟线下多节点同时判定同一位。
STM32G474的FDCAN时钟80MHz、预分频2得40MHz,一位取80个时间量子即2微秒,对应500kbps。同步段1、段一63、段二16,采样点80%,SJW为16。总线上各节点位速率必须相同,采样点也应尽量匹配,否则可能反复出现错误帧。
本章说明CAN FD如何突破经典CAN的8字节与1Mbps限制:仲裁段保持低速、数据段提速,并介绍帧结构变化、双套位定时、发送延迟补偿与兼容性风险。
经典CAN单帧最多8字节,位速率最高1Mbps,传摄像头雷达等数据分片太慢。直接提高整条总线速率不可行:受往返延迟限制,2Mbps就要把总线缩到几米,ACK槽也要求所有节点在同一比特内检测到显性位。
CAN FD的做法是:仲裁段和ACK字段这些多节点同时使用总线的部分保持原比特率,仲裁结束后只有发送节点驱动总线,从BRS位采样点起经CRC以更高速率发送。例如仲裁段500kbps、数据段2Mbps,实际常用2或5Mbps,最大数据长度也扩展到64字节。
经典CAN的RTR位变为保留位RRS,因FD无远程帧而恒发0;R0位变为FDF位,隐性1表示FD帧。BRS为1则从该位采样点切换到数据段速率,从ESI到CRC都以高速率发送。
DLC仍是4位,但9到15对应12到64字节的固定长度,超过8字节只能取这些值。CRC也变了:数据不超过16字节用17位CRC,超过16字节用21位CRC,并新增stuff count字段。
stuff count记录数据段填充位数量对8取模,以3位格雷码加1位奇偶校验发送。原因是填充位附近出错可能漏删或多删,导致其后所有位错位一位,经典CAN中偶尔能逃过CRC。因此CAN FD把填充位纳入CRC计算,ISO标准还单独发送stuff count多做一次检查,且与早期非ISO CAN FD不兼容。
CAN FD控制器配置两套位定时:仲裁段的nominal位定时和数据段的data位定时。500kbps仲裁段每比特80个时间量子,数据段保持同样时间量子、每比特20个即2Mbps,只有每比特时间量子数从80降到20。
发送节点从TX经收发器到总线再回到RX存在环路延迟,CAN FD收发器规格允许高达255纳秒。5Mbps时位时间200纳秒,采样点在比特开始后约160纳秒,环路延迟可能超过它,正常条件下也会误判为位错误。因此FD控制器有发送延迟补偿:用FDF与RES之间的边沿测量实际环路延迟,数据段在测量延迟加偏移的二次采样点检查自己发的位,其他接收节点仍在正常采样点判决。
按仲裁段500kbps、数据段2Mbps计算:发8字节经典CAN约222微秒,CAN FD约108微秒,约快一倍;发64字节经典CAN要拆成8帧约1.8毫秒,CAN FD单帧约0.33毫秒,快五倍以上。数据段提到5Mbps后8字节只降到约79微秒,因为仲裁段、ACK、EOF和帧间约30位仍以500kbps发送。所以CAN FD的收益在单帧大数据量加高速率时最大。
若总线上接入不支持CAN FD的经典CAN控制器,它会把经典帧规则套用到FDF之后的位,检测到违规就发错误帧,破坏原本有效的FD帧,因此单个经典节点就能扰乱整条FD总线。规则是承载FD帧的总线上每个节点都要支持CAN FD;至少不支持时收到FD帧不得发错误帧。反向则兼容:FD控制器能照常收发经典CAN帧,收发器也必须保证在FD速率下工作。
数据段位时间变短后,显性转隐性时的振铃更容易影响下一位判决,因此短桩线等布线规则更严格。字幕在此处结束,未展开SIC收发器与CAN XL的具体内容。
把前面讲过的仲裁、位定时与CAN FD原理落到STM32代码上,用两块Nucleo-G474RE演示发送、接收、滤波与错误处理。
选用带FDCAN外设的Nucleo-G474RE,新老STM32外设函数名不同但配置流程相近。PA12发送、PA11接收,收发器需支持CAN FD速率与3.3伏逻辑,双绞线两端各接120欧终端并共地。板A作电机控制器,板B作仪表接收。
初始化按五步:时钟与引脚、位定时、滤波器、启动CAN、使能接收中断。位定时沿用标称段预分频2、段一63、段二16、SJW16,数据段预分频2、段一15、段二4、SJW4。帧格式设为带位速率切换的CAN FD,并开启自动重传。
字节0到1为转速,字节2到3为电池电压,单位0.01伏,低字节在前即Intel字节序。字节4为温度加40,字节5为电机状态,字节6为计数器,字节7为校验和。校验和对字节0到6做CRC8,用SAE J1850变体。
发送头设ID为hex120、标准ID、数据帧、长度8字节,帧格式设为经典CAN,其余字段显式赋默认值。调用发送函数只是存入发送缓冲区,仲裁与ACK检查由控制器完成。报文由定时器以10毫秒周期发送,计数器到15后回绕。
板A兼作BMS,用一帧64字节发送32节电芯电压,ID为hex300,帧格式设为CAN FD、使能位速率切换、数据长度64字节。数据段2兆比特每秒,需配置发送延迟补偿,偏移取30约合375纳秒。这两项必须在启动CAN前设置。
滤波器0设为掩码模式标准ID滤波,ID为hex120、掩码为hex7FF,掩码位为1必须匹配,全1则只放行hex120。通过滤波的报文存入接收FIFO0。要收hex300需添加滤波器1并把标准ID滤波器数量设为2,接收数组要声明为64字节。
FDCAN默认会把不匹配任何滤波器的报文也存入FIFO0,只配滤波器仍会收到其他报文。要只收所需报文,必须把全局滤波设为拒绝不匹配报文。老bxCAN未使能滤波器时一条报文都收不到,常见问题是能发不能收。
FIFO0收到新报文时产生中断,回调只置标志,数据处理放主循环。读出后先看头部ID判断是哪条报文,避免把电芯电压误读成电池电压。ID为hex120时按发送侧逆运算解码,并检查计数器与校验和,不符则丢弃。
单板测试可先把工作模式设为内部回环模式,发出的帧在内部被接收,缺少ACK也不当作错误,可验证滤波器与代码行为。但该模式验证不了收发器和接线,线路必须接两个节点才能检查。
量产代码第一点是错误状态监控,使能错误状态回调,进入error passive或bus off时记录日志。第二点是bus off恢复,FDCAN进入bus off会自动切到初始化模式,软件必须清除初始化位才能重新入网。回调里先判断是否处于bus-off再清。
第三点是检查发送函数返回值,该MCU有三个发送缓冲区,排队过多会填满并返回错误。第四点是缓冲区工作模式:队列模式按ID最小者先发,FIFO模式按存入顺序发送。
本章说明DBC文件如何把CAN帧中的原始字节翻译成有物理意义的信号,并给出解码流程与字节序陷阱。
CAN标准只定义帧格式,不定义数据字节含义,一辆车可能有数百条报文、数千个信号,且控制器由多家公司开发,因此需要共同文档。DBC由Vector定义,成为事实行业标准,也称CAN database,是纯文本,可用记事本打开。
示例DBC中,BU行定义总线节点名称,如电机控制器、仪表和BMS;BO行定义一条报文,288是十进制ID即十六进制120,后接报文名、8字节长度和发送节点;其下的SG行定义报文内各信号。
以电池电压信号为例,第一个16是起始位,第二个16是信号长度。@后1表示Intel小端、0表示Motorola大端;加号表示无符号整数,减号表示补码有符号。括号内是因子与偏移,方括号是最小最大值,引号内是单位。温度信号因子1、偏移负40,对应发送前加40的规则。
状态信号可用val行把数字映射为名称,如0停止、1就绪、2运行、3故障,工具会显示名称而非数字。BA行设置报文发送周期等属性值,示例中周期设为10毫秒;工具要读取这些属性,必须先在BA def行中定义。
解码按固定五步:先按ID找到报文,再按起始位和长度取出位,然后应用字节序,转十进制,最后乘因子加偏移。电池电压得0e42即3650,乘0.01加0得36.5伏。工具应用DBC后会在数据旁显示信号名、物理值和单位。
常见错误是字节序。同样42、0e按Motorola顺序解释时,前一字节成为高字节,得十六进制420e即16910,乘0.01得169.1伏,而实际约36伏,屏幕却显示169伏。此外Motorola信号的起始位约定为最高有效位位置,Intel则为最低有效位位置,手工编辑DBC常因此填错起始位,建议尽量用专用编辑工具而非直接改文本。
CAN FD报文在DBC中定义方式相同,把数据长度设为64并添加标记CAN FD的属性。DBC不只是文档,用cantools等库可自动生成C代码,完成手写的字节拆分与合并。AUTOSAR通信模块也由DBC自动配置,改信号只需改DBC重新生成。
本章梳理从通信规范定义到仿真、测量、分析诊断的开发流程,并介绍Vector、标定与开源工具链。
实际项目开发CAN通信分五步:第一步定义通信规范,由整车厂规定报文周期与信号并写成DBC;第二步供应商基于数据库实现通信代码;第三步用PC工具做剩余总线仿真;第四步测量与记录;第五步用DBC解码日志分析定位原因。
行业最常用工具来自Vector:CANdb++用于编辑DBC文件,CANalyzer用于监控和分析总线,CANoe是在CANalyzer基础上增加仿真与测试功能,可用类似C的脚本语言CAPL实现虚拟ECU行为。
测量和标定ECU内部变量时,常用Vector的CANape和ETAS的INCA,这些工具需配合专用硬件接口连接PC与CAN总线,价格昂贵,通常以公司为单位采购使用。
较实惠的选择包括PCAN USB适配器与免费工具PCAN View,Kvaser适配器也广泛使用;要用CAN FD,适配器也必须支持。免费开源方面,Linux的SocketCAN用candump和cansend收发,Python用python-can和cantools。物理层问题最终要靠示波器波形定位。
即使没有适配器和示波器,也能在PC上练习仿真与监控。在Linux上创建虚拟CAN接口,用Python运行虚拟ECU每10毫秒发送十六进制120报文,用candump查看。应用了DBC的工具则实时显示电池电压36.5伏和电机温度25摄氏度。
从工程落地角度总结CAN通信设计要点:发送周期与总线负载、E2E保护、超时监控与网关架构,以及现场排查的自下而上顺序。
设计通信首先要确定发送周期,多数报文按10毫秒或100毫秒固定周期持续发送,即使数值不变也照发,以便接收方确认发送节点正常工作。其次是总线负载:示例报文ID为十六进制120,单次发送约需234微秒,每10毫秒发一次约占总线时间的2.3%;报文增多后负载上升,低优先级报文持续仲裁失败而被延迟,因此设计阶段要留足余量。
示例报文中字节6的计数器与字节7的校验和就是E2E保护。CAN自带的CRC只能检测总线上的位错误,检测不到发送ECU软件冻结后反复发送同一数值,也检测不到ECU内部复制错误的数据。因此制动、转向等安全相关信号由发送软件加计数器与校验和,接收软件再校验一次,这称为端到端保护即E2E protection。
超时监控指报文在数个发送周期内未到达即判为通信故障,相关功能切换到安全状态。现代汽车按功能域划分多条CAN总线,域间由网关ECU只转发必要报文。
现场排查按从物理层向上的顺序进行:断电测CAN High与CAN Low间电阻,正常约60欧;上电后用示波器看差分波形;再确认各节点位速率与采样点一致;然后读错误计数器与错误状态,并查验收滤波设置;数值仍不对时最后查DBC中的字节序、因子与偏移。下层有问题时,查上层再多也找不到原因。
介绍运行在CAN之上的上层协议UDS、ISO-TP、OBD-II、J1939与CANopen,回顾示例报文全流程,并对比CAN与UART、SPI、I2C的定位。
CAN只定义物理层与数据链路层,不定义数据字节含义,因此其上有多种上层协议。汽车诊断使用UDS,UDS运行在ISO-TP之上,OBD-II诊断仪也通过同一ISO-TP通信。
卡车、农机与工程机械使用J1939,它把优先级、参数组编号PGN和发送节点地址放进29位扩展ID中,即上层协议在ID内定义了CAN标准本身没有的发送节点地址。工厂自动化与机器人领域则广泛使用CANopen。最终CAN定义的物理层与数据链路层保持不变,只是按应用在其上运行不同的上层协议。
回顾示例报文ID十六进制120的完整流程:按DBC规则,36.5伏变为3650并转成两字节420E;控制器加上SOF、ID、DLC与CRC并插入填充位组成帧;收发器把位转成差分电压,该帧在仲裁中获胜;接收节点在采样点读取每位电平、校验CRC后回ACK;代码解码恢复出36.5伏,工具再用DBC显示同一数值。
UART、SPI、I2C用于单板内或近距离设备间通信;CAN则让多个控制器通过非破坏性仲裁共享一条总线而无需主节点,并用差分信号抗噪、用故障封闭限制失效节点的影响,把整个系统连成一个网络。
UP主希望本视频能帮助正在学习CAN或工作中第一次接触CAN的观众,感谢观众看到最后,并表示如果内容有帮助,点赞与订阅对频道有帮助。
由知否生成 · 整理你自己的资料 · 登录后按账户权益阅读、整理与提问