K课堂 | 深入解析CAN总线常见高层协议J1939标准(下篇)

SAE J19399 (以下简称J1939) 是美国汽车工程协会 (SAE) 的推荐标准,也是CAN通讯开发常用的协议,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会” (Track & Bus Electrical & Electronics Committee) 下属的“卡车与大型客车控制和通讯网络附属委员会” (Track & Bus Control and Communications Network Subcommittee) 开发编写。
J1939描述了重型车辆现场总线的一种网络应用,包括CAN网络物理层定义、数据链路层定义、应用层定义、网络层定义、故障诊断和网络管理。在SAE J1939协议中,不仅仅指定了传输类型、报文结构及其分段、流量检查等,而且报文内容本身也做了精确的定义。J1939是在商用车辆、舰船、轨道机车、农业机械和大型发动机中应用最广泛的应用层协议。
本篇内容根据Kvaser《J1939概述》内容进行整理,简要介绍SAE J1939标准,深入讲述报文架构以及SAE规范指南,希望能对CAN总线技术的学习者有所帮助。
内容框架如下:
上篇(已更新,进入UP主页阅读)
J1939: 简介:简介、特点
J1939: 详述:报文格式和使用方法(J1939/21)、地址和名称 (J1939/81)、地址声明、发送报文(J1939/21 和 J1939/7x)、TP_BAM 报文、TP_CM 报文、报文接收(J1939/21 和 J1939/7x)
下篇(本篇内容)
J1939: 详述:ECU 设计(J1939/1x,J1939/21 和 J1939/7x)、接线拓扑 - 物理层(J1939/1x)、如何解读 J1939 报文的示例
其它:获取完整版 J1939 规范文件、订购 J1939 诊断电缆
附录 A:J1939/11 物理层、J1939/13 – 非车载诊断连接器、J1939/21 – 数据链路层、J1939/31 – 网络层、J1939/71 – 车辆应用层、J1939/73 应用层 – 诊断、J1939/81 – 网络管理

ECU设计 (J1939/1x, J1939/21和J1939/7x)
尽管每个制造商对产品中的电子控制单元(ECU)的性能有不同的要求,但是应该对支持 J1939 所需的资源进行注意。J1939 目前的数据速率是 250Kbps。一个典型的包含 8 个数据字节的报文长度是 128 位(不包含用于位填充的位),其在时间上约为 500 微秒。最短的报文 64 位长度。这意味着每 250 微秒可以发送一个新报文。尽管不是每个报文都是相关的,总线负载也不可能超过50%,但接收处理器必须能处理(或缓冲)短时间突发性大量报文。这就需要一些内存空间以及用于内存传输的处理器时间。
接线拓扑 - 物理层 (J1939/1x)
J1939 网络旨在作为单一、线型、屏蔽双绞线,在车辆周围覆盖每个 ECU。在 ECU 和总线之间允许短根。无需要求主总线直接连接到每个 ECU,这样简化了主总线布线接线。线型总线的数据速率要达到 250Kbps,以便使电信号反射最小化。总线每端的终端电阻也减少了反射。
J1939 网络实际上可以由多个段组成,其中在它们之间存在被称为网桥的在线设备。这些段不需要彼此直接兼容。例如,段可以以不同的数据速率运行或使用不同的物理介质。网桥的主要功能是在段之间提供电隔离。如果拖拉机和拖车之间的导线断裂,拖拉机上的主要 J1939 部分将继续工作。网桥还可以有选择地过滤需要存储的报文和将报文从一个段转送到另一个。
如何解读 J1939 报文的示例
此示例旨在提供如何解读 J1939 报文的准则。我们来看一条内容如下的 J1939 报文:
CAN 标识符:0xCF00401
数据字节:0xFF FF 82 DF 1A FF FF FF
CAN-ID 提供了什么信息?

◾ 前两个字节=0x0C = 00001100 为二进制格式。由于标识符只有 29 位,所以前 3 位不使用。接下来的 3 位表示报文优先级,此例中级别是 3。其次是保留位,然后是决定完整 PGN 的数据页。
◾ CAN-ID 的最后一个字节是源地址(发送设备的地址),此例中是 1。
◾ 根据 J1939/71 文档,PGN= 0x0F004 与电子引擎控制器#1 (EEC1)相对应。该文档还描述了参数及其在数据字节中的位置。在此示例中,数据字段由以下字节组成:

◾ 在此示例中,数据字节 1,2,6,7 和 8 不可用,因此设置为 0xFF。源参数值(单个字节)不能为0xFF。
◾ 数据字节 3 是参数实际发动机转矩百分比。源值 0×82 是十进制 130。根据 J1939/71 文件,标度每位 1%, 偏移量-125。因此,该参数的实际值为 5%。
◾ 数据字节 4 和 5 构成引擎转速参数。第一个字节(4)是最低有效字节(Intel 字节顺序)。源值0x1ADF = 十进制 6879。标度为每位 0.125rpm, 偏移量为 0。所以该参数的实际值低于859.875rpm。

本文简要介绍了 J1939 标准,SAE 规范指南,以及深入了解报文构成。希望这有助于帮助您了解 J1939。
您可能出于各种原因阅读本文。也许您正在设计一个系统或 ECU,或者故障排除车辆,或者进行学术研究。在所有这些情况下,我们为你提供几个简单的“下一步”,将帮助您继续了解J1939。
获取完整版 J1939 规范文件
可以从SAE网站购买完整版标准规范文件。
订购 J1939 诊断电缆
使用 J1939 总线的第一步是访问数据。Kvaser Leaf Light HS v2 J1939-13 是一款使用广泛且易于使用的诊断电缆。它含有用于网络访问的 J1939-13 连接端口和用于 PC 连接的 USB 端口,并且免费提供驱动程序、监控软件和技术支持。

J1939/11 物理层
总线的物理特性:
◾ 屏蔽双绞线
◾ 最长 40 米
◾ 250kbps
◾ 最大 30 节点(ECU)
◾ 基于 ISO11898
J1939/13 - 非车载诊断连接器
本文档定义了用于诊断目的的标准连接器。该连接器,德国 hd10-9-1939,是一款9针圆形连接器。

J1939/21 – 数据链路层
本文档定义了 CAN 帧(29 位标识符和 PGN 等)的使用和传输协议函数,这些函数定义了如何在J1939 总线网络上传输长于 8 字节的报文。
J1939 报文被组织到由标识符和 8 个数据字节组成的协议数据单元(PDU)中。大于单字节的数字数据首先以最低有效字节(LSB)发送。J1939 使用支持扩展标识符(29 位)的 CAN 2.0B。
CAN 标识符由优先权位(3 位),保留位(1 位),数据页位(1 位),PDU 格式位(1 个字节),特定 PDU 位(1 个字节)和源地址(1 个字节)组成。
有两种不同的 PDU 格式:
◾ PDU1 格式用于发送具有特定目标地址的报文。
◾ PDU2 格式只能发送广播。
标识符中的 PDU 格式字节决定报文格式。如果 PDU 格式字节小于 240(0xF0),则格式为 PDU1,如果 PDU 大于 239,则为 PDU2。
该 J1939 文档还描述了 5 种类型的报文类型:命令,请求,广播/响应,应答和组功能。
传输协议提供用于发送长于 8 字节的报文的功能,因为它们不适合安排在单个 CAN 帧中。在J1939 中,这些报文被分割成 7 字节的分组,每个分组含有序列号。有用于处理分段报文的通信的特殊连接管理(CM)报文。这类报文示例如:请求发送(RTS),清除发送(CTS)和广播通告报文(BAM)。分段的报文可以被发送到指定设备或作为广播。CM 报文在发送者和接收者之间提供虚拟连接和握手过程。发送方请求发送分段报文,接收方回答其目前可以接收多少个段(图4)。分段报文可以作为广播发送,并且在发送者和接收者之间无需握手。

J1939/31 – 网络层
本文档描述 J1939 网络不同段之间进行通信需要的服务和功能。段可以是子网,其由可“看到”相同信号的 ECU 进行定界。J1939/31 描述了四种在段之间为网络互连提供功能的 ECU 类型:中继器(转发)、网桥(转发和过滤)、路由器(转发、过滤和地址转换)和网关(转发、过滤、地址转换和报文重组)。
J1939/71 – 车辆应用层
本文档描述并定义了“标准”参数,这些参数在报文帧中组合在一起并赋予 PGN。本文档每年大概更新四次,以包含新的标准参数和报文。
文档中定义了不同长度的参数:1、2 和 4 字节。如果参数最高有效字节的值是 0xFE,则表示存在错误;如果值是 0xFF,则表示参数不可用。本文档还建议根据参数的长度和物理属性进行适当的缩放,限制和偏移。
参数的描述开始于要表示的值的名称和说明(即,用于获取参数值的测量方法)。以下信息描述参数的内容:
◾ 数据长度(字节)
◾ 精度(标度和偏移、测量单位)
◾ 数据范围(标定刻度后物理值的范围)
◾ 类型(状态、测量值)
◾ 可疑参数号(SPN)(参数特定号)
◾ PGN(参考发送的报文帧)
每个参数组都被一个名称定义,内含以下信息:
◾ 传输重复率(间隔或请求时间)
◾ 数据长度(字节)
◾ 数据页(0 或 1,与 PGN 有关)
◾ PDU 格式(0 到 255,与 PGN 有关)
◾ 特定 PDU(取决于 PDU 格式)
◾ 默认优先级(值在 0 和 7 之间, 0 是最高优先级)
◾ 参数组编号(PGN)
◾ 数据参数字节(包括参考和字节顺序的所有参数)
大部分内部报文以广播形式发送,没有特定的目标地址。
J1939/73 应用层 – 诊断
本文档定义用于访问诊断和校准数据的函数和报文。有一些预定义的诊断报文(DM)用于:
◾ 读写 ECU 内存
◾ 在运行时报告诊断信息
◾ 标识灯状态
◾ 读取和清除诊断故障代码(DTC)
◾ 启动/停止广播 DM
本文档较新版本包含关于诊断故障代码(DTC)解释的其它信息。DTC 是继承自 J1587 的 32 位标识符,由 4 个元素组成:可疑参数号(SPN),故障模式标识符(FMI),发生次数(OC)和 SPN转换方法。DTC 与源地址一起标识组件或子系统。
J1939/81 – 网络管理
本文档包含有关 ECU 名称内容的信息以及 ECU 如何使用该名称声明寻址。该名称是 64 位(8 字节)长的数字,为每个 ECU 提供唯一的标识。该名称有两个主要目的:
➡ 提供 ECU 的描述,包括功能。
➡ 作为在声明地址时可用于仲裁的数值。
J1939/81 文档还描述了地址声明过程的工作原理。文档中基本上定义了三种类型用于此目的的报文。
◾ 声明主张的地址(PGN 59904)。发送这个报文来检索网络上其它设备所使用地址的信息。
◾ 声明地址(PGN 60928)。可以分成:
声明的地址,被发送以申明地址或作为对“请求地址声明”报文的响应以指示设备的地址。源地址设置为声明的地址。
地址无法声明。当 ECU 地址申明进程失败时发送该报文。如果 ECU 地址声明进程失败并收到“请求地址声明”的报文,则可以发送地址不能声明作为响应。源地址设置为 0×254,表示无地址。
◾ 命令地址(PGN 65240)。用于将 ECU 设置为特定地址。这可以由诊断工具或互连 ECU(网桥,网关)完成。
当执行地址仲裁时,名称将被视为一个 8 字节的数值,值越小,优先级越高。
