CAN 技术系列 07 · CAN 高层协议

发布时间:2026/10/31 22:28:14
CAN 技术系列 07 · CAN 高层协议 CAN总线技术系列 · 持续更新中本系列从差分电气层一路打到 Linux SocketCAN,把两根线背后的电气/协议/控制器/驱动/实战全拧成一根线。 想系统追更戳这里查看完整专栏【CAN 技术系列】 其他技术系列专栏欢迎关注、交流、共同成长【SPI 技术系列】 【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】 【操作系统设计思想系列】 【 Android 系统全景专栏】本篇定位:CAN 只规定到数据链路层(ID8字节),怎么用这 8 字节传语义?靠高层协议。本篇讲四大主流高层协议:CANopen(工业自动化,CiA 301)、J1939(商用车,29bit ID 编码)、UDS(汽车诊断,ISO 14229)、ISO-TP(大报文分包,ISO 15765)。读完你理解 CAN 8 字节怎么承载复杂通信,以及 AEGIX 汽车诊断要用 UDS。CAN 只有 ID8 字节,高层协议赋予语义SPI/I2C 是裸字节,语义全靠应用自己定。CAN 也是裸 ID8 字节,但汽车/工业场景复杂(诊断/大报文/参数组),靠高层协议统一语义。CANopen 定义对象字典,J1939 用 29bit ID 编码参数组,UDS 定义诊断服务,ISO-TP 把 8 字节拼成大报文。汽车芯片,UDS 诊断和 ISO-TP 是必会。这是 L2 协议层收官篇,理解高层协议才算懂 CAN 应用。目录一、为什么需要高层协议1.1 CAN 的局限1.2 高层协议补什么1.3 四大主流高层协议二、CANopen(CiA 301)2.1 CANopen 架构2.2 对象字典(Object Dictionary, OD)2.3 PDO(Process Data Object,过程数据)2.4 SDO(Service Data Object,服务数据)2.5 心跳(Heartbeat)2.6 NMT(Network Management)三、SAE J19393.1 J1939 概述3.2 29bit ID 编码3.3 参数组(PGN)3.4 PDU1 vs PDU23.5 传输协议(BAM/RTS)四、UDS(ISO 14229)4.1 UDS 概述4.2 诊断 ID4.3 常用服务4.4 会话控制(0x10)4.5 读数据(0x22)4.6 写数据(0x2E)4.7 安全访问(0x27)4.8 刷写流程(0x34/0x36/0x37)4.9 否定响应(NRC)五、ISO-TP(ISO 15765)5.1 ISO-TP 概述5.2 帧类型5.3 单帧(Single Frame)5.4 多帧(首帧 流控 续帧)5.5 流控制(FC)5.6 分包流程图5.7 ISO-TP 状态机5.8 超时六、CAN FD 与高层协议适配6.1 CAN FD 大帧优势6.2 ISO-TP FD 适配6.3 CANopen FD6.4 J1939 FD6.5 UDS CAN FD七、关键问题 QAQ1:CANopen 的 PDO 和 SDO 有什么区别?Q2:J1939 怎么用 29bit ID 编码?Q3:UDS 刷写 ECU 完整流程?Q4:ISO-TP 单帧和多帧怎么分?Q5:ISO-TP 流控制(FC)什么作用?Q6:CAN FD 对高层协议有什么影响?八、实战案例案例 1:CANopen 节点心跳丢失告警案例 2:J1939 发动机转速解析错案例 3:UDS 读 VIN 失败案例 4:UDS 刷写中途断案例 5:ISO-TP 多帧接收方不回 FC案例 6:CAN FD 刷写比经典快多少?案例 7:J1939 多包报文 BAM 传输案例 8:CANopen SDO 下载写参数九、本篇小结与速查核心要点CANopen 速查J1939 ID 速查UDS 服务速查ISO-TP 帧速查汽车诊断要点延伸阅读参考资料一、为什么需要高层协议1.1 CAN 的局限CAN 数据链路层只提供:ID(11/29bit) 8 字节数据(经典)/ 64 字节(FD)无地址(只有 ID)、无大报文、无服务定义1.2 高层协议补什么需求CAN 链路层高层协议补数据语义裸字节定义字段含义大报文≤8B分包(ISO-TP)诊断无服务定义(UDS)节点寻址ID源/目地址(J1939)配置管理无对象字典(CANopen)心跳监控无心跳报文1.3 四大主流高层协议协议标准领域特点CANopenCiA 301工业自动化对象字典 PDO/SDOJ1939SAE J1939商用车/工程机械29bit ID 编码参数组UDSISO 14229汽车诊断诊断服务(读/写/控制)ISO-TPISO 15765传输层8B → 大报文分包二、CANopen(CiA 301)2.1 CANopen 架构应用层(用户应用) ↑ CANopen 应用层(CiA 301:对象字典/SDO/PDO/心跳) ↑ CAN 数据链路层(ID 8B) ↑ CAN 物理层(ISO 11898)2.2 对象字典(Object Dictionary, OD)CANopen 核心——对象字典,类似寄存器表:索引含义0x1000-0x1FFF设备信息(厂商/型号/版本)0x2000-0x5FFF厂商特定0x6000-0x9FFF标准设备参数(输入/输出)0xA000-0xAFFF网络管理每个对象有索引(16bit) 子索引(8bit)读写对象 读写设备参数2.3 PDO(Process Data Object,过程数据)实时数据(周期性,高优先级)无需应答,广播或点对点传输类型:周期/事件触发/同步ID 范围:0x181~0x57FTPDO(发送 PDO):节点状态 → 总线 RPDO(接收 PDO):总线 → 节点控制2.4 SDO(Service Data Object,服务数据)配置数据(非实时,低优先级)读写对象字典,需应答可传 8 字节(分段传输)ID 范围:0x581~0x67FSDO 下载(写):Client → Server,写对象字典 SDO 上传(读):Client ← Server,读对象字典2.5 心跳(Heartbeat)节点周期发心跳(0x700)其他节点监控,超时 节点失联替代 Node Guarding(轮询,少用)2.6 NMT(Network Management)0x000:NMT 主站控制命令:进入操作/停止/预操作/复位节点状态:初始化/预操作/操作/停止三、SAE J19393.1 J1939 概述商用车(卡车/客车/工程机械)标准基于 CAN 2.0B(29bit ID)用 29bit ID 编码:优先级 参数组 源/目地址3.2 29bit ID 编码29bit ID 结构: ┌──────┬─────┬───────┬──────────────┬──────────────┬──────────┐ │优先级│ 保留│数据页 │ PDU 格式(PF) │ PDU 特定(PS)│ 源地址 │ │ 3bit │ 1bit│ 1bit │ 8bit │ 8bit │ 8bit │ └──────┴─────┴───────┴──────────────┴──────────────┴──────────┘ bit28-26 bit25 bit24 bit23-16 bit15-8 bit7-0字段含义优先级(3bit)0(最高)~7(最低)保留(1bit)0数据页(1bit)0/1(扩展参数组)PF(PDU格式)参数组高字节PS(PDU特定)目标地址(PEER)或参数组低字节(PDU1/PDU2)源地址(8bit)发送节点地址3.3 参数组(PGN)PGN 保留 数据页 PF( PS if PDU1)标识一组参数(如发动机转速/水温)常见 PGN:PGN参数61444电子发动机控制器(EEC1:转速/转矩)65262发动机温度(水温/油温)65263发动机仪表(油压/液位)59904请求(Request)60416应答(ACK)3.4 PDU1 vs PDU2PDU1(PF 240):PS 是目标地址(点对点)PDU2(PF ≥ 240):PS 是参数组扩展(广播)3.5 传输协议(BAM/RTS)PGN 数据 8 字节,用传输协议分包BAM(Broadcast Announce Message):广播多包RTS/CTS(Request/Clear to Send):点对点流控四、UDS(ISO 14229)4.1 UDS 概述Unified Diagnostic Services,统一诊断服务汽车诊断标准(ISO 14229)基于 CAN ISO-TP 传输客户端(诊断仪)→ 服务端(ECU)4.2 诊断 ID请求:0x7E0~0x7E7(诊断仪 → ECU)响应:0x7E8~0x7EF(ECU → 诊断仪)广播:0x7DF(所有 ECU)4.3 常用服务SID服务用途0x10DiagnosticSessionControl会话控制(默认/编程/扩展)0x11ECUResetECU 复位0x22ReadDataByIdentifier读数据(按 DID)0x23ReadMemoryByAddress读内存0x27SecurityAccess安全访问(解锁)0x2EWriteDataByIdentifier写数据0x31RoutineControl例程控制0x34RequestDownload请求下载(刷写)0x36TransferData传输数据(刷写)0x37RequestTransferExit退出传输0x3ETesterPresent在线保活4.4 会话控制(0x10)默认会话(0x01):基础诊断编程会话(0x02):刷写 ECU扩展会话(0x03):高级诊断请求:10 03(进扩展会话) 响应:50 03 00 32 01 F4(成功,参数)4.5 读数据(0x22)按 DID(Data Identifier)读数据DID 是 16bit 标识符请求:22 F1 90(读 VIN,DID0xF190) 响应:62 F1 90 17字节VIN4.6 写数据(0x2E)按 DID 写数据需先安全解锁(0x27)请求:2E F1 90 17字节VIN(写 VIN) 响应:6E F1 90(成功)4.7 安全访问(0x27)防未授权修改流程:请求种子 → 算密钥 → 发密钥1. 请求:27 01(请求种子) 响应:67 01 种子 2. 算:密钥 f(种子) 3. 请求:27 02 密钥(发密钥) 响应:67 02(解锁成功)4.8 刷写流程(0x34/0x36/0x37)1. 10 02(进编程会话) 2. 27(安全解锁) 3. 31 01 FF 00(擦除) 4. 34(请求下载:地址长度) 5. 36(传输数据:分包发) 6. 37(退出传输) 7. 11 01(复位)4.9 否定响应(NRC)响应 7F SID NRC(否定响应码)NRC含义0x13格式错0x22条件不满足0x24请求序列错0x31超范围0x33安全拒绝(未解锁)0x78响应待定(忙)0x7E子功能不支持0x7F服务不支持五、ISO-TP(ISO 15765)5.1 ISO-TP 概述ISO Transport Protocol,CAN 传输层把 8 字节的报文拆成多个 CAN 帧传输UDS/J1939 大报文都基于 ISO-TP5.2 帧类型类型PCI 首字节用途单帧(SF)0x0x≤7 字节首帧(FF)0x1x多帧第一帧续帧(CF)0x2x多帧后续流控制(FC)0x3x接收方流控5.3 单帧(Single Frame)数据 ≤ 7 字节一帧搞定单帧:0x0N N字节(PCI首字节0x0N,N数据长度) 例:发 3 字节 [01 02 03] 帧:03 01 02 03(首字节0x033字节数据)5.4 多帧(首帧 流控 续帧)数据 7 字节,分多帧:发送 12 字节数据: 1. 首帧(FF):1x xx 6字节(首字节0x1,后11bit总长度) 帧:10 0C D1 D2 D3 D4 D5 D6(0x100C12字节,D1~D6前6字节) 2. 流控制(FC):接收方发 帧:30 00 0A(30FC,00继续发,0A帧间隔10ms) 3. 续帧(CF):发送方发 帧:21 D7 D8 D9 DA DB DC DD(21CF序号1,D7~DD后6字节) 帧:22 DE DF 00 00 00 00 00(22CF序号2,DE DF最后2字节)5.5 流控制(FC)接收方控制发送方节奏:FS(Flow Status):0继续/1等待/2溢出BS(Block Size):每发 BS 帧等一次 FC(0只一次 FC)STmin(最小间隔):帧间最小间隔(ms)FC:30 FS BS STmin 30 00 00 0A → 继续(FS0),BS0(只一次FC),STmin10ms5.6 分包流程图发送方 接收方 │ 首帧 FF(总长度前6B) │ │ ─────────────────────────→ │ │ │ │ 流控制 FC(FS/BS/STmin) │ │ ←───────────────────────── │ │ │ │ 续帧 CF1(序号1,7B) │ │ ─────────────────────────→ │ │ 续帧 CF2(序号2,7B) │ │ ─────────────────────────→ │ │ ...(按BS/STmin节奏) │ │ 续帧 CFn(最后,补0) │ │ ─────────────────────────→ │ │ │ │ 重组完成 │5.7 ISO-TP 状态机typedefenum{TP_IDLE,// 空闲TP_SEND_FF,// 发首帧TP_WAIT_FC,// 等流控制TP_SEND_CF,// 发续帧TP_RECV_FF,// 收到首帧TP_SEND_FC,// 发流控制TP_RECV_CF,// 收续帧TP_DONE// 完成}tp_state_t;5.8 超时等流控制超时(发送方等 FC):通常 1000ms等续帧超时(接收方等 CF):通常 1000ms超时 → 丢弃,重新开始六、CAN FD 与高层协议适配6.1 CAN FD 大帧优势数据段 64 字节单帧可传 64 字节(经典 ≤ 7 字节)6.2 ISO-TP FD 适配单帧扩到 64 字节(很多报文不用分包)多帧时每续帧 64 字节(分包数大减)传输大报文快很多经典 ISO-TP 传 100 字节:1 FF 14 CF(7B/帧) FD ISO-TP 传 100 字节:1 FF 2 CF(64B/帧)6.3 CANopen FDCiA 302(CANopen FD)SDO 大块传输(64B/帧)对象字典扩展6.4 J1939 FDJ1939-22(FD 传输)参数组数据段 64B兼容经典 J1939 仲裁段6.5 UDS CAN FDUDS 服务不变,传输层用 ISO-TP FD刷写快(64B/帧,刷写时间大减)诊断仪要支持 CAN FD七、关键问题 QAQ1:CANopen 的 PDO 和 SDO 有什么区别?A:PDO:过程数据,实时,周期/事件触发,无需应答,高优先级(ID 0x181~0x57F)。传实时控制数据(位置/速度)。SDO:服务数据,非实时,读写对象字典,需应答,低优先级(ID 0x581~0x67F)。传配置数据(参数/标定)。Q2:J1939 怎么用 29bit ID 编码?A:29bit 分 6 段:优先级(3bit) 保留(1) 数据页(1) PF(8) PS(8) 源地址(8)。PF 240 是 PDU1(PS目标地址,点对点),PF ≥ 240 是 PDU2(PS参数组扩展,广播)。PGN 保留数据页PF(PS)。例:发动机转速 PGN 61444,优先级 3。Q3:UDS 刷写 ECU 完整流程?A:10 02(进编程会话)27(安全解锁:请求种子→算密钥→发密钥)31 01(擦除 Flash)34(请求下载:地址长度)36(传输数据:分包发,ISO-TP 多帧)37(退出传输)11 01(复位 ECU)验证(10 03 进扩展会话,22 读版本)Q4:ISO-TP 单帧和多帧怎么分?A:单帧(SF):数据 ≤ 7 字节,一帧搞定(PCI 首字节 0x0N,N长度)多帧:数据 7 字节,首帧 FF(0x1,总长度前6B)→ 接收方发流控 FC(0x3,FS/BS/STmin)→ 发送方发续帧 CF(0x2,序号7B)→ 重组Q5:ISO-TP 流控制(FC)什么作用?A:接收方控制发送方节奏,防淹没。FC 三字段:FS(0继续/1等待/2溢出)BS(每发 BS 帧等一次 FC,0只一次)STmin(帧间最小间隔)。例:30 00 0A → 继续,只一次 FC,间隔 10ms。Q6:CAN FD 对高层协议有什么影响?A:数据段 64 字节,单帧传更多。ISO-TP 单帧扩到 64B(很多报文不分包),多帧续帧 64B(分包数大减)。UDS 刷写快很多(64B/帧)。CANopen FD(CiA 302)/J1939-22 都是 FD 适配版。仲裁段仍 1M 兼容经典。八、实战案例案例 1:CANopen 节点心跳丢失告警现象:CANopen 从站失联,主站报心跳超时。分析:从站崩溃/掉线,停止发心跳(0x700),主站超时检测到。解决:查从站电源/复位;主站心跳超时进安全状态(停止相关控制)。案例 2:J1939 发动机转速解析错现象:读 J1939 报文,发动机转速值不对。分析:PGN 61444(EEC1),转速是 2 字节,分辨率 0.125 rpm/bit,偏移 0。解析没按比例换算。解决:按 SPN 定义换算:转速 raw × 0.125 rpm。注意字节序(MSB 先)。案例 3:UDS 读 VIN 失败现象:发 22 F1 90(读 VIN),响应 7F 22 33(安全拒绝)。分析:VIN 写需要安全解锁(0x27),读 VIN 在默认会话也可能限制。解决:先进扩展会话(10 03),安全解锁(27),再读 VIN(22 F1 90)。案例 4:UDS 刷写中途断现象:ECU 刷写,36 传输数据中途失败。分析:ISO-TP 续帧超时(接收方等 CF 超时),或 CAN 总线错(错误帧)。解决:查 CAN 错误(逻辑分析仪),检查刷写流程(34 下载请求的地址/长度对),重刷。案例 5:ISO-TP 多帧接收方不回 FC现象:发首帧 FF,接收方不发流控制 FC,超时失败。分析:接收方没实现 ISO-TP,或 FC 的 ID 配错,或接收方忙(没处理)。解决:确认接收方实现 ISO-TP,检查 FC 的 CAN ID(请求/响应对应),接收方提高处理优先级。案例 6:CAN FD 刷写比经典快多少?现象:CAN FD 刷写 1MB Flash 用 30s,经典 CAN 用 4min。分析:FD 单帧 64B vs 经典 7B,分包数 1/9,传输快约 9 倍。解决:CAN FD 刷写是优势,诊断仪和 ECU 都要支持 FD。案例 7:J1939 多包报文 BAM 传输现象:J1939 参数组数据 20 字节,收到 BAM(广播多包)。分析:PGN 59904 请求 → 响应方发 BAM(0x18ECFF)声明多包 → 分包发数据包(0x18EBFF)→ 接收方重组。解决:实现 J1939 传输协议(BAM),按序号重组,超时丢弃。案例 8:CANopen SDO 下载写参数现象:SDO 下载写对象字典 0x20000x1234,响应成功但参数没变。分析:SDO 下载请求格式错(子索引/数据长度),或对象只读。解决:确认对象可写(OD 定义),SDO 帧格式对(指令索引子索引数据),读回验证。九、本篇小结与速查核心要点CAN 只有 ID8B,高层协议赋予语义CANopen(CiA 301):对象字典 PDO(实时) SDO(配置) 心跳J1939:29bit ID 编码(优先级PGN源/目地址),商用车UDS(ISO 14229):诊断服务(0x10会话/0x22读/0x2E写/0x27解锁/0x34/36/37刷写)ISO-TP(ISO 15765):8B → 大报文分包(SF单帧/FF首帧/CF续帧/FC流控)UDS 刷写流程:会话→解锁→擦除→下载→传输→退出→复位J1939 PDU1(PF240,点对点)/PDU2(PF≥240,广播)ISO-TP 流控:FS(继续/等待/溢出) BS(块大小) STmin(间隔)CAN FD 适配:单帧 64B,刷写快 9 倍,CANopen FD/J1939-22否定响应 NRC:7F SID NRC(0x33安全拒绝/0x31超范围/0x78忙)CANopen 速查对象ID 范围用途NMT0x000网络管理紧急0x080紧急报文PDO0x181~0x57F过程数据(实时)SDO0x581~0x67F服务数据(配置)心跳0x700节点心跳J1939 ID 速查字段bit含义优先级30最高7最低保留10数据页10/1PF8参数组高字节PS8目标地址/参数组低源地址8发送节点UDS 服务速查SID服务用途0x10会话控制默认/编程/扩展0x11ECU 复位复位0x22读数据按 DID 读0x27安全访问解锁0x2E写数据按 DID 写0x31例程控制擦除等0x34请求下载刷写开始0x36传输数据刷写分包0x37退出传输刷写结束0x3E在线保活防超时ISO-TP 帧速查类型PCI用途SF0x0N≤7B 单帧FF0x1x多帧首帧(总长6B)CF0x2x续帧(序号7B)FC0x3x流控(FS/BS/STmin)汽车诊断要点UDS 诊断服务必实现(0x10/0x22/0x2E/0x27/0x11)ISO-TP 传输层(单帧/多帧/流控/超时)安全访问(0x27)防未授权刷写流程(0x34/0x36/0x37) 校验CAN FD 刷写优化(64B/帧)否定响应码完整(NRC)诊断 ID 分配(0x7E0~0x7EF)延伸阅读[[04-CAN帧格式]] —— 8 字节数据段承载高层协议[[05-CAN仲裁与优先级]] —— 高层协议 ID 分配[[08-CAN控制器寄存器与IP架构]] —— 高层协议驱动实现[[12-CAN设备驱动实战]] —— UDS/ISO-TP 实战[[14-CAN排查手册与速查表]] —— 高层协议速查[[07-SPI高级模式-QSPI-Octal-XIP]] —— 对比 SPI 高级模式[[07-I2C协议扩展-SMBus-PMBus]] —— 对比 I2C 协议扩展参考资料CiA 301(CANopen 应用层)SAE J1939-21(数据链路层)/-71(应用层)ISO 14229(UDS)ISO 15765-2(ISO-TP)CiA 302(CANopen FD)[[00-CAN技术系列总目录]] · 上一篇:[[06-CAN错误处理与错误帧]] ·下一篇:[[08-CAN控制器寄存器与IP架构]]✨ 感谢你的阅读 ✨技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的支持 点赞|⭐ 收藏| 关注如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。关注我一起交流底层开发的那些事儿

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询