本文重点介绍一些局域网通信协议,我是通过 B 站 Vector 官方的视频学习的。
J1939 部分感觉和 CAN 差不多就没有详细继续学习,另外感觉 J1939 官网讲的一般。
Vector 官网
Vector 培训官网
Vector B站主页
我学习的课程视频
CAN 通信适用于局域网场景,高速 CAN 最高 1 MB/S,低速 CAN 最高 125KB/S。常用于工业系统、车载场景等,相比于互联网的七层或四层网络通信协议, CAN 通信不需要 IP 地址,而且汽车的各个局部通信网络,可以有不同的通信速度,匹配了不同的通信需求。不同速度的 CAN 通信使用网关互相通信。网关还可以做中继器,放大信号,提升传输距离。
两种寻址方式:
CAN 采用的是广播寻址。CAN Controller(CAN 控制器)中有 Filter(过滤器),来选择接受应用需要的数据。
过滤器原理:
非破坏性总线仲裁机制。根据标识符判断优先级,优先级高的优先发送,优先级低的之后再发送(或新一轮的仲裁)。
仲裁方法:标识符 ID 发到总线上时,进行总线与运算,假设和某个 CAN 节点 A 的标识符 ID (标准振标识符范围 [0, 2047],标识符 ID 有点类似身份证 ID)不同时,A 停止发送转为接受模式,即标识符越小优先级越高。
位填充:
发先帧错误后:某一个节点检查到发送或者接受的帧出现错误,会以发送错误帧的方式告知其他参与通信的节点,当前正在发送或者接受的帧是有问题的。
位监控指的是发送方发送出去某一位后,回读总线数据,如果回读数据和发送的数据不同,那么就表明总线数据发生错误。
仲裁段标虚线表示不能完全使用位监控。因为仲裁机制,因此这里如果出现了发1读0,则认为是仲裁失败而非发送错误。发送节点会转而变成接收节点。但是发0读1肯定是错误,因为仲裁是取较小的值,所以这里肯定是发生了错误,因此是虚线。
除了位监控之外就是 ACK,发送方 ACK 默认为 1,然后回读 ACK,如果 ACK 不为 0,则表明发生错误。
首先是位填充检测,从帧起始到 CRC。出现连续六个及以上的连续位表明肯定发生了错误。
CRC 从仲裁字段到 CRC 字段,计算 CRC 是否正确。
格式检查,分隔符、结束符。
ACK 位监控,即回读 ACK 位,接收方需要根据前面的检测结果写 ACK 位,如果数据没问题写入 0,否则写入 1。这时接收方变成了发送方,因此也有了位监控的错误检查。
错误帧格式:6位错误标识和8位错误界定符(分隔符)
除 CRC 错误之外,检查到错误时,会从下一位立即开始发送错误帧,CRC 检查到错误会在 ACK 位向接收节点发送 1,然后 ACK 界定符之后发送错误帧。
错误帧的前 6 位错误标识符是为了触发参与通信节点的位填充错误,触发之后其他参与通信的节点也会发送错误帧,6 个 0 的情况下的表现为,可能发送的 0 的个数大于 6,如图所示为 12(6 + 6),6 个 1 的情况下为可能发送完 6 个 1 之后还会发送多个 0,然后再进入错误分隔符,错误分隔符 + 帧界定符总共 11 个 1,11 个 1 表明总线又再次处于空闲状态。那么发送节点就可以根据数据进行重发。
每个节点一定处于上述三种状态,每个节点有两个值,TEC\REC,TEC\REC 变化的大致规则:
主动错误状态节点,可以在帧界定符之后继续发送;而错误被动节点必须还要再等待 8 个字符才能开始发送。总线关闭节点不允许访问总线。
硬件、协议轻微改动。CAN FD 数据段最多 64 字节。CAN FD 最高支持 8MB/s 的传输速率。CAN FD 采用可变速率,数据字段传输快。
CAN FD 没有远程帧,只分为两种:标准帧(标识符 11 位)和扩展帧(标识符 29 位)。
汽车主动安全和被动安全领域对汽车通信提出了更高的要求。
信息传输控制:
对底层拓扑结构不做任何要求,可以是 P2P、Bus、Passive star。电阻作用防止高频信号的干扰,任意两节点线长最远不能超过 24 米,这是为了保持信号完整性。可以通过主动星型拓扑结构代替被动星型,以提高通信质量、补偿信号失真,但是成本有所上升。实际应用中,经常上述几种(包括主动星型)混合应用。
上图描述了 FlexRay 的信号到数据的转化。同样是通过两线(Bus Plus、Bus Minus)的电压差分来得到数据。总线状态有以下四种:
以通信周期为一个循环,发送数据。每个周期分为 64 个 Cycle(周期)。每个周期分为四个时间段:静态段(确定性的传输报文)、动态段(传输事件驱动的报文)、符号窗口(传输特殊符号)、网络空闲时间段(不会通信)。每个周期静态段和空闲时段是必须的,其他两个是可选的。
静态段基于 TDMA 通信,静态段可以平均划分分为 2 - 1023 个 slot,slot 长度、个数由两个静态变量定义。每个 slot 放一个静态帧,每个静态帧由头、有效负载、尾、帧结束组成。CID(通信控制界定符)用来表示帧的结束。
动态段用来传输事件驱动报文。动态段分为多个动态 slot(槽),动态 slot 大小不同,有一个最小单位gdMiniSlot,动态 slot 可由一到多个 gdMiniSlot 组成。动态段最多 2047 个动态 slot,最多可划分为 7986 个 gdMiniSlot。
符号窗口大小是固定的,用于传输符号而非报文数据。符号有三种:冲突避免符号(用于表示第一个通信周期的开始)、介质测试符号(用于测试总线监控器)、唤醒符号(用于唤醒 FlexRay 网络)。通信周期的末尾是网络空闲段,用于同步本地时钟,不进行数据通信。
FlexRay 支持单双通道。不同通信通道通信相互独立。
如上图是静态段访问方式:想要保证数据正确,可以采用节点 K 所示,在不同通信通道发送相同数据;想要增加带宽,如节点 L 所示,在不同通信通道发送不同的数据。
动态段发送事件驱动的报文,由于不同通信通道相互独立,因此可以在相同的槽发送不同的大小的数据。 最迟发送时间,即超过这个时间发送的事件驱动的报文,不允许发送,只能等待下一个周期。
周期内严格按照周期调度表发送帧,为了提高传输速率,多个周期可以使用复合调度表,在不同的周期发送不同的帧。例如静态复用周期和动态复用周期。
如图,静态段,同一节点、相同的槽发送了不同的帧。
如图,动态段相对更加灵活,相同的槽可以给不同的节点发送,也可以个相同的节点发送不同的帧,每次发送的帧的大小都可以不同。
之前传感器和执行器也接入 CAN ,随着 ECU 增多,每个传感器和执行器都需要 CAN Controller 和CAN 收发器,此外也会增加 CAN 总线的长度、数量,成本高。为此提出了一个解决方案,传感器和执行器接入低成本总线,低成本总线接入某个 ECU,就可以和整个 CAN 通信。
LIN 只需要一根线,不需要控制器,可以接在 UART/SCI 上,因此 LIN 是基于 UART 帧结构通信。
上图表示了 LIN 的电信号和数字信号的关系。
LIN 总线有两种同步:初始同步、重同步。为了降低成本,LIN 总线无时钟线,从节点采用低成本的 2c 震荡器,并允许最大 14% 的时钟偏差。
上图所示为初始时钟同步,LIN 总线空闲时为 1,数据开始传输时,由主节点(即主 ECU)实现时钟同步。主节点,发送同步间隔段和同步段。同步间隔段由至少 13 个 0 和 1 个分隔符(值为 1)组成。同步段的值为 0x55。
从节点收到同步段,把第一个下降沿和最后一个下降沿相隔时间除以 8,得到主节点的单个位的时间。然后根据结果调整自身速率和主节点保持一致。初始同步实现了所有节点和主节点时钟同步。
重同步即数据传输过程中利用 UART 通信帧进行时钟同步。
主节点有总任务和从任务,主任务发送了 header,从任务负责发送 response 或接受 response 或不发送也不接受。
如图所示,LIN-Master 根据调度表发送 header,t0 时刻 Master 发送了 header,之后从节点 slave1 发送响应,slave3 接收了响应,slave2 不发送也不接受。由此可知,LIN 报文由 header 和 response 组成。
由上图可计算 header、response 的数据传输时间。但是数据不光有传输时间,传输过程中还有时间间隔没有计算,称为时间余量(Time Reserve)。
时间余量有两种:
一帧 LIN 报文时间余量最大为额定传输时间的 40%,即一帧 LIN 报文传输时间最大为额定传输时间的 1.4 倍。
帧时隙:【我的理解是前一帧结束到本帧的同步间隔第一个下降沿的时间,但是 b 站 vector 官方不是这么讲的,我感觉意思一样】报文同步间隔下降沿与帧时隙起始时刻相差的时间。
LIN 帧的槽最大时间为帧时隙 + 帧最大传输时间。
真实的 frame slot 是由若干个最小单位 mini slot 组成。mini slot 与 time base(时机)一致。时机用于主节点执行调度控制,一般为 5ms 或 10ms。主节点可以有多个调度表,并且在其中切换。
LIN 有四种报文类型:
状态管理的目的是检测各个节点运行过程中的错误。
每个从节点在其发送的某个无条件帧中包含一个 response error 的标量信号,通过该信号向主节点报告自身状态。主节点接受并分析。LIN 没有标准化制定错误类型,用户可以根据需要自行制定。
唤醒信号为:250us - 5ms 的显性电平(值为 0),150ms - 250ms 总线没有其他信号,可以再发送唤醒信号,最多连续发 3 次,之后必须等待至少 1.5s 才能继续发送唤醒信号。
主节点可以发送休眠命令,使 LIN 子网进入休眠模式。休眠命令为 ID为诊断报文 0x3c,数据字段第一个为 0x00(其他节点会只关注数据节点的第一个字节)。
美国工程汽车协会制定的通信标准。物理层和链路层都是使用的 CAN,帧格式是 CAN 扩展帧。详细规定了 29 位 ID,数据单元为 parameter group 即参数组。参数组是由参数组编号(PGN)标识。
下图所示,底层是 CAN 通信的物理层和数据链路层,上层是应用层以及其他高层。
有两种通信方式:
上图,#3 和 #11 通过参数组 TSC1 来控制发动机扭矩进行 P2P 通信,#23 通过参数组 RQST 进行广播通信。
PDU,Parameter Data Unit ,应用层或网络层的数据单元。
PGN,Parameter Group Number,PG 参数组,具有相关性并且传输速率相同的一组信号,每个参数组都有唯一的编号,即 PGN。