CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议

本文重点介绍一些局域网通信协议,我是通过 B 站 Vector 官方的视频学习的。

J1939 部分感觉和 CAN 差不多就没有详细继续学习,另外感觉 J1939 官网讲的一般。

Vector 官网

Vector 培训官网

Vector B站主页

我学习的课程视频

文章目录

  • 1 CAN 通信
    • 1.1 CAN 通信节点
    • 1.2 寻址 Address
    • 1.3 Bus Access 总线访问机制
    • 1.4 CAN Framing 帧格式
      • 帧错误检测机制
      • 发送方错误检测
      • 接收方错误检测
      • 错误帧
      • 错误状态
  • 2 CAN FD
  • 3 FlexRay
    • 3.1 FlexRay 物理层
    • 3.2 FlexRay 通信周期
    • 3.3 FlexRay 帧结构
    • 3.4 FlexRay 总线访问
  • 4 LIN
    • 4.1 LIN 物理层
    • 4.2 LIN 通信原理及帧结构
    • 4.3 LIN 调度机制及报文类型
    • 4.4 LIN 状态管理和网络管理
  • 5 J1939
    • 5.1 参数组和信号

1 CAN 通信

CAN 通信适用于局域网场景,高速 CAN 最高 1 MB/S,低速 CAN 最高 125KB/S。常用于工业系统、车载场景等,相比于互联网的七层或四层网络通信协议, CAN 通信不需要 IP 地址,而且汽车的各个局部通信网络,可以有不同的通信速度,匹配了不同的通信需求。不同速度的 CAN 通信使用网关互相通信。网关还可以做中继器,放大信号,提升传输距离。

1.1 CAN 通信节点

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第1张图片

  • MicroController:控制器把数据发送给 CAN 控制器
  • CAN Controller:报文的封装、检查、总线访问以及 bit-timing
  • CAN-Transceiver:收发报文
  • 两端的电阻:保证信息传输过程中的阻抗连续性

1.2 寻址 Address

两种寻址方式:

  • Node Address 点对点寻址:发送者选择目标地址
  • Broadcast Address 广播寻址:接收者选择是否接受

CAN 采用的是广播寻址。CAN Controller(CAN 控制器)中有 Filter(过滤器),来选择接受应用需要的数据。

过滤器原理:

  1. 第一种:CAN-TX 和 CAN-RX,通过收到的标识符和 CAN-TX 中比较,CAN-TX 中为 1 的段,则是必须匹配的位(必须相等)
  2. 第二种和第一种类似,具体忘了,但是原理差不多
  3. 第三种:和每个 CAN-Controller 内部寄存的标识符进行匹配
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第2张图片

1.3 Bus Access 总线访问机制

非破坏性总线仲裁机制。根据标识符判断优先级,优先级高的优先发送,优先级低的之后再发送(或新一轮的仲裁)。

仲裁方法:标识符 ID 发到总线上时,进行总线与运算,假设和某个 CAN 节点 A 的标识符 ID (标准振标识符范围 [0, 2047],标识符 ID 有点类似身份证 ID)不同时,A 停止发送转为接受模式,即标识符越小优先级越高。

1.4 CAN Framing 帧格式

  • 标准帧
    • 标准帧(11 ID + 0~8 bytes data)
    • 标准远程帧(11 ID + 0 byte data)
  • 扩展帧
    • 扩展帧(29 ID + 0~8 bytes data)
    • 扩展远程帧(29 ID + 0 byte data)
      CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第3张图片
  • SOF:0(显性电位为 0,隐性电位为 1,总线空闲默认为 1),帧起始,接收节点收到帧起始会和总线时钟进行同步(硬同步、重同步,这里是硬同步)。
  • 仲裁字段
    • ID:高位在前
    • RTR:远程帧请求,远程帧为 0,表示是数据帧,否则是远程帧。远程帧表明接受该帧的节点即不主动发送数据,当他收到远程帧时,才开始发送数据,减少占用 CAN 的通信。
  • 控制字段
    • IDE:表示是否是扩展帧,IDE 为 1 是扩展帧
    • r:保留位
    • DLC:数据长度,合理范围是 0 - 8,超过则表示 8 字节
  • 数据字段
  • 校验字段
    • CRC:15位校验位
    • DEL(delimter):分隔符,无意义,为 1
  • 确认字段
    • ACK:发送节点,该位都为 1,接受节点 CRC 正确则在 ACK 位时,该位置置为 0,否则还是 1。如果发送节点回读 ACK 是 0,继续发送,否则停止发送,下一次发送一个错误帧。(下一次发送错误帧不太理解)
    • DEL
  • EOF + ITM:结束字段 + 帧间隔
    在这里插入图片描述

位填充:

  • 出现了五个相同的位(包括填充位),就在下一个位置填充一个相反的位。
  • 范围从 SOF 开始一直到 CRC。

帧错误检测机制

  • 位监控:回读发送出去的位的数据
  • ACK 位:发送数据的节点回读 ACK 是 0,继续发送,否则意味着发生错误停止发送
  • Stuff Check:填充检测
  • CRC 检测
  • Form 检测:一些分隔符 del 等

发先帧错误后:某一个节点检查到发送或者接受的帧出现错误,会以发送错误帧的方式告知其他参与通信的节点,当前正在发送或者接受的帧是有问题的。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第4张图片

发送方错误检测

位监控指的是发送方发送出去某一位后,回读总线数据,如果回读数据和发送的数据不同,那么就表明总线数据发生错误。

仲裁段标虚线表示不能完全使用位监控。因为仲裁机制,因此这里如果出现了发1读0,则认为是仲裁失败而非发送错误。发送节点会转而变成接收节点。但是发0读1肯定是错误,因为仲裁是取较小的值,所以这里肯定是发生了错误,因此是虚线。

除了位监控之外就是 ACK,发送方 ACK 默认为 1,然后回读 ACK,如果 ACK 不为 0,则表明发生错误。

接收方错误检测

首先是位填充检测,从帧起始到 CRC。出现连续六个及以上的连续位表明肯定发生了错误。

CRC 从仲裁字段到 CRC 字段,计算 CRC 是否正确。
格式检查,分隔符、结束符。

ACK 位监控,即回读 ACK 位,接收方需要根据前面的检测结果写 ACK 位,如果数据没问题写入 0,否则写入 1。这时接收方变成了发送方,因此也有了位监控的错误检查。

错误帧

错误帧格式:6位错误标识和8位错误界定符(分隔符)
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第5张图片
除 CRC 错误之外,检查到错误时,会从下一位立即开始发送错误帧,CRC 检查到错误会在 ACK 位向接收节点发送 1,然后 ACK 界定符之后发送错误帧。CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第6张图片

  • 错误主动节点:错误帧为 6 个 0,8 个 1
  • 错误被动节点:错误帧为 6 个 1,8 个 1

错误帧的前 6 位错误标识符是为了触发参与通信节点的位填充错误,触发之后其他参与通信的节点也会发送错误帧,6 个 0 的情况下的表现为,可能发送的 0 的个数大于 6,如图所示为 12(6 + 6),6 个 1 的情况下为可能发送完 6 个 1 之后还会发送多个 0,然后再进入错误分隔符,错误分隔符 + 帧界定符总共 11 个 1,11 个 1 表明总线又再次处于空闲状态。那么发送节点就可以根据数据进行重发。

错误状态

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第7张图片
每个节点一定处于上述三种状态,每个节点有两个值,TEC\REC,TEC\REC 变化的大致规则:

  • 作为发送节点率先发现错误,则 TEC + 8
  • 作为接收节点率先发现错误,REC + 8,如果作为接收节点接收到了别人的错误帧,则 REC + 1
  • 成功接受 REC - 1,成功发送 TEC - 1

主动错误状态节点,可以在帧界定符之后继续发送;而错误被动节点必须还要再等待 8 个字符才能开始发送。总线关闭节点不允许访问总线。

2 CAN FD

硬件、协议轻微改动。CAN FD 数据段最多 64 字节。CAN FD 最高支持 8MB/s 的传输速率。CAN FD 采用可变速率,数据字段传输快。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第8张图片
CAN FD 没有远程帧,只分为两种:标准帧(标识符 11 位)和扩展帧(标识符 29 位)。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第9张图片
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第10张图片

  • SOF:帧起始
  • 标识符ID
  • RRS 代替原来的 CAN 帧的 RTR
  • IDE:表示是否是扩展帧
  • FDF:表示是否是 CAN 帧还是 CAN FD 帧
  • r:保留位
  • BRS(Bit Rate Switch): 之后数据段传输是否变换速度,BRS 之前属于仲裁段,会以低速传输;BRS 开始到 CRC 分隔符为止,属于数据段,可以高速传输。CRC 分割符之后,由于需要 ACK 应答,因此又变为低速传输。
  • ESI:用来告知其余节点,发送方的错误状态。
  • DLC:0-8 线性表示数据长度,9-15离散的表示数据长度。
  • CRC:根据不同的数据长度使用不同长度的 CRC 校验。CAN 使用 15 位的 CRC 校验,且不包含填充位。CAN FD CRC 包含数据填充位。CAN FD 在 CRC 字段的前四位增加了对前面填充位的计数校验,前面的填充同样是 5 个相同位跟一个相反的位。CRC 字段不适用之前的填充,而是使用固定位填充,从 CRC 字段开始位置开始填充,每隔四个位填充一位,每次填充的位都取前一个的相反值。
    • 先统计 SOF 开始到 CRC 字段之前填充位的个数对 8 取模,将数值以格林编码的形式存放在高三位,最后一位偶校验位,校验前三位。
    • 当数据段大于 16 字节,使用 21 位 CRC
    • 当数据段小于等于 16 字节,使用 17 位 CRC

3 FlexRay

汽车主动安全和被动安全领域对汽车通信提出了更高的要求。

  • 传输速率:10MB/s
  • 可扩展性:增加删除节点
  • 物理层:要保持简便且鲁棒性
  • 传输可靠:提高容错性、确定性

信息传输控制:

  • 事件触发控制:发送时间根据事件。可能同时需要发送很多数据,最终导致延迟等问题
    • CSMA:CAN 属于 CSMA(载波监听多点接入)
  • 时间触发控制:发送时间提前分配好,提前安排好发送时间是必须的。
    • TDMA:时分多路访问方式

3.1 FlexRay 物理层

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第11张图片
对底层拓扑结构不做任何要求,可以是 P2P、Bus、Passive star。电阻作用防止高频信号的干扰,任意两节点线长最远不能超过 24 米,这是为了保持信号完整性。可以通过主动星型拓扑结构代替被动星型,以提高通信质量、补偿信号失真,但是成本有所上升。实际应用中,经常上述几种(包括主动星型)混合应用。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第12张图片
上图描述了 FlexRay 的信号到数据的转化。同样是通过两线(Bus Plus、Bus Minus)的电压差分来得到数据。总线状态有以下四种:

  • 空闲、低功耗状态:差分为 0,但两线都处于低电压
  • 空闲状态:差分为 0,电压不低,处于高低电压中间
  • Data1:BP 和 BM 电压差大于 600mV 表明此时数据是 Data1
  • Data0:BP 和 BM 电压差小于 -600mV 表明此时数据是 Data1
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第13张图片
    上图介绍了 FlexRay 总线物理布局。
  • μC:Micro Controller 微控制器即 CPU
  • CC:通信控制器,组帧、总线访问、收发报文
  • BD:总线驱动,信号转换
  • BG:总线监控器(Bus Guardian),在 CC 和 BD 之间可以增加 BG,防止故障节点在未分配给他们的时隙内出现未经授权的传输数据(防止故障节点在错误时间访问总线)。

3.2 FlexRay 通信周期

以通信周期为一个循环,发送数据。每个周期分为 64 个 Cycle(周期)。每个周期分为四个时间段:静态段(确定性的传输报文)、动态段(传输事件驱动的报文)、符号窗口(传输特殊符号)、网络空闲时间段(不会通信)。每个周期静态段和空闲时段是必须的,其他两个是可选的。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第14张图片
静态段基于 TDMA 通信,静态段可以平均划分分为 2 - 1023 个 slot,slot 长度、个数由两个静态变量定义。每个 slot 放一个静态帧,每个静态帧由头、有效负载、尾、帧结束组成。CID(通信控制界定符)用来表示帧的结束。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第15张图片
动态段用来传输事件驱动报文。动态段分为多个动态 slot(槽),动态 slot 大小不同,有一个最小单位gdMiniSlot,动态 slot 可由一到多个 gdMiniSlot 组成。动态段最多 2047 个动态 slot,最多可划分为 7986 个 gdMiniSlot。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第16张图片
符号窗口大小是固定的,用于传输符号而非报文数据。符号有三种:冲突避免符号(用于表示第一个通信周期的开始)、介质测试符号(用于测试总线监控器)、唤醒符号(用于唤醒 FlexRay 网络)。通信周期的末尾是网络空闲段,用于同步本地时钟,不进行数据通信。

3.3 FlexRay 帧结构

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第17张图片

  • 帧头:存放属性信息,40位
    • Start bits:5 位
      • 1:保留位 1 位,默认发送 0
      • 2:Payload preamble indicator,动态静态报文不同,含义也不同
      • 3:Null frame indicator,指示 payload 是正常还是无效
      • 4:Sync frame indicator,判断该帧是否为同步帧
      • 5:Startup frame indicator,判断该帧是否为启动帧
    • Frame id:报文ID
    • Payload length:数据大小,范围 0-127,单位是 字,规定一个字为两字节
    • Header CRC:帧头 CRC,校验范围从 4 开始到 Header CRC 之前
    • Cycle count:周期计数器,范围 0-63
  • 有效负载:最多 254 字节
    • 静态报文可以使用有效负载指示位,把 payload 前 12 个字节作为传输网络管理向量,可以进行网络管理
    • 动态报文则可以把 payload 前 2 个字节作为报文标识符,既 message id,用于实现更精细的区分依据。
  • 帧尾:存放 CRC 校验所求结果,校验范围是前面所有。

3.4 FlexRay 总线访问

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第18张图片
FlexRay 支持单双通道。不同通信通道通信相互独立。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第19张图片
如上图是静态段访问方式:想要保证数据正确,可以采用节点 K 所示,在不同通信通道发送相同数据;想要增加带宽,如节点 L 所示,在不同通信通道发送不同的数据。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第20张图片
动态段发送事件驱动的报文,由于不同通信通道相互独立,因此可以在相同的槽发送不同的大小的数据。 最迟发送时间,即超过这个时间发送的事件驱动的报文,不允许发送,只能等待下一个周期。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第21张图片
周期内严格按照周期调度表发送帧,为了提高传输速率,多个周期可以使用复合调度表,在不同的周期发送不同的帧。例如静态复用周期和动态复用周期。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第22张图片
如图,静态段,同一节点、相同的槽发送了不同的帧。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第23张图片
如图,动态段相对更加灵活,相同的槽可以给不同的节点发送,也可以个相同的节点发送不同的帧,每次发送的帧的大小都可以不同。

4 LIN

之前传感器和执行器也接入 CAN ,随着 ECU 增多,每个传感器和执行器都需要 CAN Controller 和CAN 收发器,此外也会增加 CAN 总线的长度、数量,成本高。为此提出了一个解决方案,传感器和执行器接入低成本总线,低成本总线接入某个 ECU,就可以和整个 CAN 通信。

典型应用是在舒适领域,后视镜调节、电动车窗、雨刷等等。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第24张图片

  • NCF:节点性能文件,定义了节点名称和属性
  • LDF:LIN 描述文件,描述了 LIN 网络信息,网络中所有信号和报文在这里声明

4.1 LIN 物理层

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第25张图片
LIN 只需要一根线,不需要控制器,可以接在 UART/SCI 上,因此 LIN 是基于 UART 帧结构通信。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第26张图片
上图表示了 LIN 的电信号和数字信号的关系。

  • recessive:为 1
  • dominant:为 0

LIN 总线有两种同步:初始同步、重同步。为了降低成本,LIN 总线无时钟线,从节点采用低成本的 2c 震荡器,并允许最大 14% 的时钟偏差。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第27张图片
上图所示为初始时钟同步,LIN 总线空闲时为 1,数据开始传输时,由主节点(即主 ECU)实现时钟同步。主节点,发送同步间隔段和同步段。同步间隔段由至少 13 个 0 和 1 个分隔符(值为 1)组成。同步段的值为 0x55。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第28张图片
从节点收到同步段,把第一个下降沿和最后一个下降沿相隔时间除以 8,得到主节点的单个位的时间。然后根据结果调整自身速率和主节点保持一致。初始同步实现了所有节点和主节点时钟同步。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第29张图片
重同步即数据传输过程中利用 UART 通信帧进行时钟同步。

4.2 LIN 通信原理及帧结构

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第30张图片
主节点有总任务和从任务,主任务发送了 header,从任务负责发送 response 或接受 response 或不发送也不接受。CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第31张图片
如图所示,LIN-Master 根据调度表发送 header,t0 时刻 Master 发送了 header,之后从节点 slave1 发送响应,slave3 接收了响应,slave2 不发送也不接受。由此可知,LIN 报文由 header 和 response 组成。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第32张图片

  • 同步间隔段:至少 13 个 1(值为 0,显性),和一个界定符(值为 1,隐性),其他字段都符合 UART 不超过 10 个位。
  • 同步段:0x55
  • 保护标识符段:PID,6 位 ID 和 2 位奇偶校验位组成。ID:范围是 0-63。60、61 用于诊断。 62、63 保留。
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第33张图片
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第34张图片
    response 由数据段和校验段组成。数据段最多 8 个字节。校验方式有两种,如下:
  • 经典校验:只包含数据段
  • 增强校验:包含前面的 PID
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第35张图片

4.3 LIN 调度机制及报文类型

CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第36张图片
由上图可计算 header、response 的数据传输时间。但是数据不光有传输时间,传输过程中还有时间间隔没有计算,称为时间余量(Time Reserve)。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第37张图片
时间余量有两种:

  • Inter-byte space 即字节间的传输间隔
  • Response space 即响应间隔

一帧 LIN 报文时间余量最大为额定传输时间的 40%,即一帧 LIN 报文传输时间最大为额定传输时间的 1.4 倍。

帧时隙:【我的理解是前一帧结束到本帧的同步间隔第一个下降沿的时间,但是 b 站 vector 官方不是这么讲的,我感觉意思一样】报文同步间隔下降沿与帧时隙起始时刻相差的时间。

LIN 帧的槽最大时间为帧时隙 + 帧最大传输时间。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第38张图片
真实的 frame slot 是由若干个最小单位 mini slot 组成。mini slot 与 time base(时机)一致。时机用于主节点执行调度控制,一般为 5ms 或 10ms。主节点可以有多个调度表,并且在其中切换。
LIN 有四种报文类型:

  • 无条件帧(Unconditional frame 0-59):一个 response 对应一个 header,
  • 事件触发帧(Event triggered frame 0-59):典型应用是
  • 偶发帧(Sporadic frame 0-59):
  • 诊断帧(60-61,60 master diagnostic request frame,61 slave)
    CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第39张图片
    无条件帧5-8发生变化频率较低,并且满足事件触发帧关联条件,则可以用事件触发帧代替无条件帧5-8,当主节点调度表执行到事件触发帧时,只有关联的从节点的无条件帧的信号发生变化才会返回 response。当有多个从节点响应时会切换到冲突解决调度表。

4.4 LIN 状态管理和网络管理

状态管理的目的是检测各个节点运行过程中的错误。

每个从节点在其发送的某个无条件帧中包含一个 response error 的标量信号,通过该信号向主节点报告自身状态。主节点接受并分析。LIN 没有标准化制定错误类型,用户可以根据需要自行制定。

网络管理主要指的是网络的休眠和唤醒。从节点有三种状态:
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第40张图片

  • 初始化:第一次连接电源、复位或唤醒后进入初始化,初始化完毕后进入运行状态,初始化不能超过 100ms
  • 运行状态:可以进行 LIN 报文的收发
  • 总线休眠:运行状态收到休眠命令或总线静默4-10秒时,进入休眠状态。休眠状态,总线保持隐性电平。主从节点都可以向总线发送唤醒信号,当接收到唤醒信号或者由于内部原因唤醒,后又会进入初始化状态。

唤醒信号为:250us - 5ms 的显性电平(值为 0),150ms - 250ms 总线没有其他信号,可以再发送唤醒信号,最多连续发 3 次,之后必须等待至少 1.5s 才能继续发送唤醒信号。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第41张图片
主节点可以发送休眠命令,使 LIN 子网进入休眠模式。休眠命令为 ID为诊断报文 0x3c,数据字段第一个为 0x00(其他节点会只关注数据节点的第一个字节)。

5 J1939

美国工程汽车协会制定的通信标准。物理层和链路层都是使用的 CAN,帧格式是 CAN 扩展帧。详细规定了 29 位 ID,数据单元为 parameter group 即参数组。参数组是由参数组编号(PGN)标识。

下图所示,底层是 CAN 通信的物理层和数据链路层,上层是应用层以及其他高层。
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第42张图片
有两种通信方式:
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第43张图片
CAN\CANFD\FlexRay\LIN 一文深度解析常见通信协议_第44张图片
上图,#3 和 #11 通过参数组 TSC1 来控制发动机扭矩进行 P2P 通信,#23 通过参数组 RQST 进行广播通信。

5.1 参数组和信号

PDU,Parameter Data Unit ,应用层或网络层的数据单元。

PGN,Parameter Group Number,PG 参数组,具有相关性并且传输速率相同的一组信号,每个参数组都有唯一的编号,即 PGN。

你可能感兴趣的:(通信,网络协议,单片机,物联网,iot,mcu)