资讯动态

ISO 11898与SAE J1939协议分层解析:CAN总线通信核心区别

发布时间:2026/9/25 1:46:07 来源:尧图企业网站定制
1. 从一次总线调试翻车说起为什么这两个协议总被搞混刚入行那会儿我接手过一个车载节点的通信调试任务。硬件同事把CAN收发器焊好线束接上终端电阻也量了120欧姆没问题。上电之后用分析仪抓包总线上确实有报文在跑ID、DLC、数据段都看得见。但问题是我按手头那份CAN协议说明去解析数据怎么都对不上——发动机转速的字节位置跟文档里写的完全不一样车速信号更是找不到。折腾了大半天请教了一位老师傅他看了一眼我手里的文档就笑了你看的是ISO 11898但这条总线上跑的是J1939。物理层一样上层完全两码事。这句话点醒了我。ISO 11898和SAE J1939经常被新手混为一谈根本原因在于它们确实共享同一套物理层和部分数据链路层基础但在协议栈里所处的位置、解决的问题、定义的规则完全不在一个层面上。打个比方ISO 11898像是规定了公路怎么修、车道多宽、限速多少而J1939则是在这条公路上进一步规定了货车拉什么货、货物怎么贴标签、司机之间怎么对话。路是同一条路但跑在上面的规矩截然不同。这篇内容就是想把这件事彻底讲清楚。不管你是刚接触车载网络的嵌入式新手还是从其他总线比如Modbus、SPI、IIC转过来做CAN通信的工程师只要花几分钟把下面这几个层面的区别理顺以后拿到任何一份CAN相关文档你都能快速判断它讲的是哪一层的东西不至于像我当年那样对着错误的参考文档死磕。核心关键词先摆出来CAN总线、ISO 11898、SAE J1939、协议分层、ECU通信。这几个词贯穿全文搞懂它们之间的关系基本就抓住了车载CAN通信的主干。2. 协议栈视角ISO 11898和J1939根本不在一个楼层2.1 用盖楼类比理解协议分层要讲清楚这两个协议的区别最有效的切入角度是协议栈分层。我习惯用盖楼来类比地基和承重墙物理层负责电信号怎么传、线缆什么规格、电平怎么定义。ISO 11898主要就在这一层以及数据链路层的一部分。楼层和房间隔断数据链路层负责帧怎么组、仲裁怎么做、错误怎么检测。ISO 11898-1定义了CAN的帧格式和仲裁机制。房间里的家具和规矩应用层负责数据代表什么含义、怎么打包、怎么寻址。SAE J1939主要在这一层同时它自己也定义了一套网络层和传输层规则。所以你看ISO 11898是楼本身的标准J1939是楼里怎么办公的标准。一栋楼可以只盖好框架不装修只用ISO 11898也可以按J1939的规矩精装修跑J1939协议。这就是为什么同一条CAN总线上物理层测量结果一样但上层解析规则可以完全不同。2.2 ISO 11898到底规定了什么ISO 11898这个标准其实是一个系列常见的有几个部分标准编号覆盖内容通俗理解ISO 11898-1数据链路层与物理信令CAN帧格式、仲裁、错误处理ISO 11898-2高速物理介质连接高速CAN收发器电气特性ISO 11898-3低速容错物理层低速CAN容错能力更强新手最常接触的是ISO 11898-2也就是高速CAN的物理层标准。它规定了差分信号传输CAN_H和CAN_L两根线显性位和隐性位的电平定义终端电阻120欧姆两端各一个最高速率1Mbps经典CAN总线拓扑为线性总线节点挂在主干上注意很多人以为ISO 11898就是CAN协议的全部其实它只管到数据链路层。你抓到一个CAN帧能看懂它是标准帧还是扩展帧、ID是多少、数据几个字节这是ISO 11898-1的功劳。但数据段里每个字节什么意思ISO 11898不管。2.3 J1939在ISO 11898之上又加了什么SAE J1939是建立在CAN基础之上的应用层协议主要面向商用车、重型车辆、工程机械等领域。它复用了ISO 11898定义的物理层和数据链路层然后往上叠了好几层自己的规则网络层定义了29位扩展ID的分配方式把ID拆成优先级、PGN、源地址等字段传输层定义了多包传输机制TP.CM和TP.DT解决CAN单帧最多8字节的限制应用层定义了各种参数组PGN和可疑参数SPN规定了每个参数怎么解析换句话说J1939把CAN的29位ID从一个标识符变成了一套寻址系统。这是理解J1939最关键的一步。在ISO 11898层面ID就是一个用于仲裁和过滤的编号在J1939层面这29位被拆解得明明白白每一位都有含义。2.4 一张表看清两者的层级关系对比维度ISO 11898SAE J1939协议栈位置物理层数据链路层应用层含网络层、传输层核心职责电信号传输、帧格式、仲裁数据含义、寻址、多包传输ID使用方式标识符用于仲裁和过滤29位拆分为优先级/PGN/源地址数据段含义不定义8字节裸数据按PGN定义每个字节含义典型速率最高1Mbps通常250kbps或500kbps终端电阻120欧姆沿用ISO 11898同样120欧姆这张表建议新手存下来。以后拿到任何CAN相关材料先问一句它讲的是左边这列还是右边这列答案立刻就清楚了。3. 29位ID的拆解J1939最核心的那把钥匙3.1 为什么J1939要用29位扩展帧经典CAN有11位标准帧和29位扩展帧两种。11位ID最多2048个标识符对于简单系统够用但对于一辆重型卡车动辄几十上百个ECU、每个ECU要发多种参数的场景11位根本不够分。J1939选择了29位扩展帧并且把这29位做了极其精细的划分。这是J1939区别于裸CAN最本质的特征。如果你只学ISO 11898你看到的是一个29位数字如果你学了J1939你看到的是优先级、参数组编号、源地址三个有意义的字段。3.2 29位到底怎么分J1939的29位ID结构如下位段名称含义28-263位Priority优先级0最高7最低251位Reserved保留位通常为0241位Data Page数据页用于扩展PGN范围23-168位PDU FormatPDU格式决定PDU1还是PDU215-88位PDU SpecificPDU特定字段含义随PF变化7-08位Source Address源地址标识发送节点这里有个关键分水岭PDU FormatPF的值决定了PDU SpecificPS字段的含义。当PF 240时是PDU1格式PS字段表示目标地址Destination Address也就是点对点通信当PF 240时是PDU2格式PS字段表示组扩展Group Extension也就是广播通信这个规则我第一次看的时候也觉得绕后来用一句话记住了PF小于240是我跟你说话PF大于等于240是我向大家广播。3.3 PGN是怎么算出来的PGNParameter Group Number是J1939里表示一组参数的编号。它的计算方式跟PDU格式有关PDU1格式PF 240PGN Data Page PF 00PS固定为0PDU2格式PF 240PGN Data Page PF PS举个例子发动机转速的PGN是614440xF004。拆开看PF 0xF0 240属于PDU2PS 0x04Data Page 0PGN 0 0xF0 0x04 0xF004 61444再比如请求PGNRequest是599040xEA00PF 0xEA 234小于240属于PDU1PS 目标地址PGN 0 0xEA 0x00 0xEA00 59904提示算PGN的时候PDU1格式下PS要当作0来处理这是新手最容易算错的地方。我第一次手算PGN就栽在这里把目标地址也加进去了结果怎么都对不上。3.4 源地址和地址声明J1939里每个ECU都有一个源地址Source Address范围0到253。其中0到127常用固定地址比如发动机ECU通常是0制动ECU通常是11128到247动态分配地址248到253特殊用途254空地址Null Address255全局地址Global Address广播时用地址不是随便设的J1939有一套地址声明Address Claim机制。ECU上电后会发一个地址声明报文PGN 60928如果发现地址冲突会通过优先级仲裁决定谁保留、谁换地址。这套机制保证了即插即用的网络管理能力也是J1939比裸CAN高级的地方。3.5 一个实际抓包例子假设你在总线上抓到一帧ID: 0x18F00400 Data: FF FF 7D 00 FF FF FF FF按J1939拆解0x18F00400 二进制 0001 1000 1111 0000 0000 0100 0000 0000优先级 110 6保留位 0数据页 0PF 0xF0 240PS 0x04源地址 0x00 0发动机ECUPGN 0xF004 61444查J1939标准可知这是电子发动机控制器1EEC1。数据段前两个字节FF FF是发动机扭矩相关第三、四字节7D 00按小端解析是0x007D 125对应发动机转速。J1939里转速的分辨率是0.125 rpm/bit所以实际转速 125 × 0.125 15.625 rpm不对这里要再乘一个系数实际转速计算是 (0x007D) × 0.125 15.625但标准里EEC1的转速字节是第4、5字节且分辨率是0.125 rpm/bit所以125 × 0.125 15.625 rpm显然不对说明我取的字节位置需要再核对。这个例子说明一个重点光会拆ID还不够还得会查PGN对应的SPN定义知道每个字节的位置、分辨率、偏移量。这就是J1939应用层的核心工作。4. 物理层和终端电阻两者共享但常被误解的部分4.1 终端电阻到底该接几个、接在哪CAN总线的终端电阻是新手最容易出问题的地方。ISO 11898-2规定高速CAN总线两端各需要一个120欧姆的终端电阻总共两个并联后总线静态电阻约60欧姆。我见过太多现场问题出在这里有的节点板子上自带了120欧姆结果一条总线上接了五六个并联后电阻低到20多欧姆通信直接瘫有的整条总线一个终端电阻都没有短距离低速勉强能跑一上速度就丢帧有的只在主机端接了一个以为有一个就行注意终端电阻的作用是消除信号反射匹配总线特性阻抗。CAN总线特性阻抗约120欧姆所以两端各接一个120欧姆让信号到达末端时被吸收而不是反射回来。接多了相当于阻抗不匹配接少了反射严重两种情况都会导致通信异常。正确的做法是整条总线只有最远的两个物理端点各接一个120欧姆中间节点一律不接。如果你用的是成品线束通常线束两端已经集成好了如果是自己搭的测试台一定要确认清楚每个节点的电阻配置。4.2 波特率和线长的关系ISO 11898-2对波特率和总线长度的关系有明确建议波特率最大总线长度1 Mbps40米500 kbps100米250 kbps250米125 kbps500米50 kbps1000米这个表背后的逻辑是波特率越高位时间越短信号在总线上的传播延迟占比就越大允许的总线长度就越短。信号在铜线里的传播速度大约是光速的2/3也就是每米约5纳秒。1Mbps时一个位时间是1微秒信号跑一个来回的时间必须远小于位时间否则采样点会错位。J1939常用的250kbps和500kbps对应总线长度250米和100米覆盖了大部分商用车和工程机械的场景。这也是为什么J1939没有选1Mbps——车太长1Mbps跑不了那么远。4.3 采样点设置容易被忽略的细节CAN的位时间分成几个段同步段、传播段、相位缓冲段1、相位缓冲段2。采样点就在相位缓冲段1和2之间。ISO 11898建议采样点在位时间的75%到87.5%之间。这个参数在配置CAN控制器的时候要设置。如果总线上所有节点的采样点不一致通信距离一长就容易出错。我遇到过一批节点有的用75%有的用87.5%短距离测试没问题装车后跑起来就间歇性丢帧查了好久才发现是采样点不统一。提示J1939对采样点有推荐值通常建议在87.5%左右。配置的时候尽量让所有节点保持一致尤其是不同厂商的ECU混用的时候这一项要提前确认。4.4 共模电感和隔离工业场景的加分项在实验室里跑CAN不接共模电感、不做隔离通常也能通。但到了工业现场或者车载环境电磁干扰严重地电位差大这时候就需要共模电感抑制共模干扰提高抗扰度隔离收发器把CAN总线侧和MCU侧电气隔离防止地环路和浪涌损坏这些不是ISO 11898强制要求的但属于工程实践中的常规做法。J1939的应用场景商用车、工程机械环境恶劣所以实际产品里几乎都会加隔离。5. 多包传输J1939解决8字节限制的独门方案5.1 为什么需要多包传输CAN单帧最多8字节数据这是ISO 11898-1定死的。但J1939应用层很多参数组远超8字节比如故障码列表、软件版本信息、标定数据动辄几十上百字节。怎么办J1939的传输层定义了多包传输机制用两个专门的PGN来协调TP.CMTransport Protocol Connection ManagementPGN 60416负责协商传输TP.DTTransport Protocol Data TransferPGN 60160负责实际数据传输5.2 多包传输的完整流程以发送一个长报文为例流程是这样的发送方发TP.CM.BAM或TP.CM.RTSBAM是广播方式RTS是点对点方式。报文里包含总字节数、总包数、目标PGN接收方回应TP.CM.CTS点对点方式告诉发送方可以开始发以及每次发几包发送方发TP.DT每包7字节有效数据第1字节是包序号接收方收齐后组包按序号拼接还原完整数据BAM方式不需要接收方回应直接连发适合广播RTS/CTS方式有流控适合点对点可靠传输。5.3 多包传输的实操坑我在实际项目里踩过几个多包传输的坑包序号从1开始不是0TP.DT的第一个字节是序号从1递增。我一开始按0开始写接收方组包全乱最后一包不足7字节要填充J1939规定用0xFF填充接收方按总字节数截断BAM传输间隔有要求包与包之间最小间隔50ms到200ms发太快接收方处理不过来超时处理点对点传输如果CTS没来发送方要超时重试不能死等注意多包传输是J1939应用层的一部分ISO 11898完全不涉及。如果你只用ISO 11898遇到超过8字节的数据就得自己想办法拆包组包而J1939已经把这套机制标准化了。5.4 和CAN FD的区别这里顺带提一句CAN FD。CAN FD是ISO 11898-1的后续演进数据段最多64字节速率也可以更高。但J1939目前主流还是基于经典CAN虽然有J1939-22基于CAN FD的新版但存量市场里经典CAN的J1939还是绝对主力。所以新手不要一上来就想着用CAN FD绕过8字节限制先搞清楚J1939的多包传输机制这是理解现有车载网络的基础。6. 实际项目中怎么快速判断该用哪套规则6.1 看文档标题和来源拿到一份CAN相关文档先看标题标题里有ISO 11898、物理层、数据链路层、收发器、终端电阻——这是底层标准标题里有J1939、PGN、SPN、商用车、重型车辆——这是应用层协议6.2 看ID是11位还是29位抓包的时候看ID11位标准帧可能是ISO 11898裸CAN也可能是其他应用层协议如CANopen29位扩展帧大概率是J1939但也要确认因为CANopen也用29位进一步确认把29位ID按J1939规则拆如果PF、PS、SA字段拆出来合理PF值常见、SA在0-253范围基本就是J1939。6.3 看数据段是否有规律J1939的数据段通常有明确的字节定义比如前两字节常是扭矩或转速有分辨率如0.125 rpm/bit和偏移量多字节参数通常小端排列裸CAN的数据段往往没有统一规律取决于具体项目自定义。6.4 一个实用的判断流程判断步骤观察点结论第一步文档是否提到PGN/SPN是→J1939第二步ID是11位还是29位29位→倾向J1939第三步29位ID拆解是否合理PF/PS/SA合理→J1939第四步数据段是否有标准分辨率有→J1939第五步是否有多包传输有TP.CM/TP.DT→J1939这套流程走下来基本不会判断错。6.5 常见误区澄清最后澄清几个新手常犯的误区误区一ISO 11898就是CAN协议的全部。实际上它只管物理层和数据链路层应用层是空的误区二J1939是另一种总线。不是J1939跑在CAN总线上物理层完全一样误区三学了J1939就不用学ISO 11898。不行物理层出问题的时候J1939知识帮不了你还得回到ISO 11898查终端电阻、查电平、查采样点误区四J1939只用于商用车。虽然它起源于商用车但现在工程机械、农业机械、船舶、发电机组都在用覆盖面很广7. 给新手的上手路径建议如果你刚接触这块我建议按这个顺序上手先搞懂ISO 11898-2的物理层终端电阻、电平、波特率、线长这些是基础中的基础出问题最先查这里再学ISO 11898-1的帧格式标准帧、扩展帧、仲裁、错误帧能看懂抓包数据然后学J1939的29位ID拆解优先级、PGN、SA这是J1939的钥匙接着学常用PGN和SPN先掌握发动机、车速、制动这几个高频的最后学多包传输和地址声明这是进阶内容实际项目遇到再深入工具方面一台CAN分析仪支持J1939解析的更好、一个示波器看波形和电平、一个万用表量终端电阻基本就够了。软件上很多分析仪自带J1939数据库能直接显示PGN名称和参数值省去手动查表的麻烦。我在实际带新人的时候发现最容易卡住的地方不是协议本身多难而是没有建立起分层的思维习惯。一旦你养成拿到问题先问这是哪一层的事的习惯ISO 11898和J1939的区别就再也不会搞混了。物理层的问题查ISO 11898数据含义的问题查J1939各归各管排查效率会高很多。最后分享一个我自己的小技巧在项目里建一个自己的PGN速查表把常用PGN、对应SPN、字节位置、分辨率、偏移量都整理进去用的时候直接查比翻标准文档快得多。这个表随着项目积累会越来越值钱是实打实的经验资产。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑