CAN总线协议

CAN总线协议

一、CAN概述

CAN Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。

在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统

被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很

多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需

要,1986 年德国电气商博世(Bosch)公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进

行了标准化,现在在欧洲已是汽车网络的标准协议。

​ 1991年:Bosch公司发布了CAN2.0该规范由A和B两部分组成。A部分用于标准格式,带有11位标识符;B部分用于带有29位标识符的扩展格式。使用11位标识符的CAN设备通常称为CAN 2.0A,使用29位标识符的CAN设备通常称为CAN 2.0B。

​ 1992年:CAN in Automation(CiA)协会成立。同年,CiA发布CAN Application Layer(CAL)协议。

CIA(CAN in AUTOMATION)协会是1992年在德国埃尔兰根注册的非营利性组织,致力于推动控制器局域网(CAN)技术的标准化与产业化发展。其主要职能包括制定CAN协议相关技术规范、推动国际标准化进程,并开发CANopen等高层应用协议。截至2016年,协会已拥有500余家国际企业成员 [1]。

CAN的标准规格:

  • 不仅是 ISO,SAE等其它的组织、团体、企业也对 CAN 协议进行了标准化。

  • 基于 CAN 的各种标准规格

image-20251221153836863

  • 面向汽车的通信协议以通信速度为准进行分类
    image-20251221153907978

二、CAN基本原理

1.CAN的OSI模型

从OSI网络模型的角度来看,现场总线一般只实现了第一层(物理层)、第二层(数据链路层)、第七层(应用层)。
因为现场总线通常只包括一个网段,因此不需要第三层(网络层)和第四层(传输层),也不需要第五层(会话层)和第六层(描述层)的作用。

CAN只定义了物理层和数据链路层,没有规定应用层。(CANopen提供了应用层的定义和规范)

image-20251218114721755

2. CAN的电平标准:

CAN总线的电气协议,分为高速ISO11898标准(125kbps ~ 1Mbps)低速ISO11519标准(5kbps ~ 125kbps)
CAN采用双线差分信号,两根线构成总线,CAN_HighCAN_low,这两根线之间的电位差可以对应两个不同的逻辑状态进行编码。

image-20251218220822829

通常使用的CAN2.0,都是使用高速CAN标准,也就是:
CAN_H-CAN_L<0.5V时候为隐性的,逻辑信号表现为“逻辑1”;
CAN_H-CAN_L>0.9V时候为显性的,逻辑信号表现为“逻辑0“。

3. CAN物理层特性:

image-20251218221308543

CAN 收发器根据两根总线(CAN_High 和 CAN_Low)的电位差来判断总线电平。
总线电平分为显性电平隐性电平两种。总线必须处于两种电平之一。总线上执行逻辑上的线“与”时,显性电平为“0”,隐性电平为“1”
image-20251218221429606

4. CAN拓扑结构:

  • 总线长度L最大40m

  • 支线长度H最大0.3m(节点到总线连接处的长度)image-20251220223521412

  • 节点距离D最大40m

  • 终端电阻R:120Ω(首尾各增加一个 )

image-20251218222623398

5. CAN的特点:

  • (1) 多主控制

    在总线空闲时,所有的单元都可开始发送消息(多主控制)。

    最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。

    多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权

  • (2) 消息的发送

    在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新

    消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不

    是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消

    息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的

    单元则立刻停止发送而进行接收工作。

  • (3) 系统的柔软性

    与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬

    件及应用层都不需要改变。

  • (4) 通信速度

    根据整个网络的规模,可设定适合的通信速度。

    在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元

    也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

  • (5) 远程数据请求

    可通过发送“遥控帧” 请求其他单元发送数据。

  • (6) 错误检测功能·错误通知功能·错误恢复功能

    所有的单元都可以检测错误(错误检测功能)。

    检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。

    正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送

    此消息直到成功发送为止(错误恢复功能)。

  • (7) 故障封闭

    CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部

    故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上

    隔离出去。

  • (8) 连接

    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元

    数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接

    的单元数减少。

6. CAN通信帧

6.1 帧的种类

数据帧和遥控帧有标准格式扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),扩展格式有 29 个位的 ID。

image-20251220224315932

6.2 数据帧

7个段组成:

  • 帧起始(Start of Frame--SOF):表示数据的开始(一个位的显性位)

  • 仲裁段(Identify (ID) ):表示该帧的优先级(帧ID越小,优先级越高)(传输顺序为最高位到最低位)

    • 标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发送)。禁止高 7 位都为隐性。(禁止设定:ID=1111111XXXX)
      标准格式里,仲裁域由11位标识符和RTR位组成。

      RTR位的全称为“远程发送请求(Remote TransmissionRequest)”。它是用于区分数据帧和遥控帧的标志。当RTR位为显性电平时,表示数据帧;当RTR位为隐性电平时,表示遥控帧。在ID相同的情况下,保证数据帧优先级高于遥控帧

    • 扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性。(禁止设定:基本 ID=1111111XXXX)
      扩展帧格式里,仲裁域包括29位标识符、RTR位、SRR位、IDE位。

      SRR位是扩展帧格式中的一个特殊数据位,全称为“替代远程请求(Substitute Remote Request)”。由于在扩展帧中不再使用RTR位,因此SRR位被用来替代标准格式中的RTR位SRR位的存在使得在扩展帧中仍然能够区分数据帧和遥控帧,并保证通信的可靠性。在扩展帧中(数据帧或遥控帧),SRR横为隐性,即逻辑1,扩展帧的SRR位刚好对上标准帧的RTR位。SRR作用:在前11位ID相同的情况下,标准数据帧优先级高于扩展数据帧。

      为了区别标准帧格式和扩展帧格式,CAN1.0~1.2版本协议的保留位r1现表示为IDE(Identifier Extension,标识符扩展)位。IDE位为显性,表示数据帧为标准格式;IDE位为隐性,表示数据帧为扩展帧格式。在扩展帧中,替代远程请求-SRR(Substitute Remote Request)位为隐性。

  • 控制段:由6个位构成,表示数据段的字节数及保留位的段

    • IDE位,用于表示该帧是标准帧还是扩展帧,标准帧IDE位为显性电平,扩展帧IDE为为隐性电平
    • 扩展帧格式包含R1和R0位,它们是保留位,用于未来协议扩展或错误检测。 R1位于标识符位之后,必须由发送器显性驱动为“0”,而接收器期望其为“1”(隐性)。 R0位于控制字段之后,同样由发送器设置为“0”(显性),接收器期望为“1”(隐性)。 若不正确配置这些位,可能导致总线冲突或误判帧格式。
    • DLC(Data Length Code-数据长度码)用于指示数据帧中数据的长度。
      image-20251221003039695
  • 数据段:用于传输数据的内容,数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。

  • CRC(Cyclic Redundancy Check-循环冗余校验)段:检查帧的传输错误的段,由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成

    • CRC 顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括发送节点的(帧起始、仲裁段、控制段、数据

      )与接收节点的是否一致。

    • 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误

  • ACK(Acknowledge)段:表示确认是否正常接收的段,由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成

    • 发送单元在 ACK 段发送 2 个位的隐性位
    • 接收单元接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发送 ACK”或者“返回 ACK”。
    • 发送 ACK :是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
    • ACK界定符恒为隐性电平,即逻辑1
  • 帧结束(End Of Frame-EOF):表示数据帧结束的段,由 7 个位的隐性位构成

image-20251220233354886

6.3 遥控帧

接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据段。

  • 数据帧和遥控帧的不同
    • 遥控帧的 RTR 位为隐性位,没有数据段
    • 没有数据段的数据帧和遥控帧可通过 RTR 位区别开来
  • 遥控帧没有数据段,数据长度码该如何表示?
    • 遥控帧的数据长度码以所请求数据帧的数据长度码表示
  • 没有数据段的数据帧有何用途?
    • 例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下
6.4 错误帧

用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。

  • 错误标志包括主动错误标志和被动错误标志两种

    • 主动错误标志:6 个位的显性位
    • 被动错误标志:6 个位的隐性位
  • 错误界定符由 8 个位的隐性位构成

image-20251221125633375

6.5 过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。

  • 过载标志为6 个位的显性位(过载标志的构成与主动错误标志的构成相同)

  • 过载界定符由 8 个位的隐性位构成(过载界定符的构成与错误界定符的构成相同)

image-20251221125914754

6.6 帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。

  • (1)间隔:3个位的隐性位

  • (2)总线空闲:隐性电平,无长度限制(0 亦可)。本状态下,可视为总线空闲,要发送的单元可开始访问总线。

  • (3)延迟传送(发送暂时停止):8个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

image-20251221130748387

6.7 CAN总线优先级

在总线空闲态,最先开始发送消息的单元获得发送权。

多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

image-20251221141914343

  • 数据帧和遥控帧的优先级:

    具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。

image-20251221142042760

  • 标准格式和扩展格式的优先级:标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。

image-20251221144150510

6.8 位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。

  • 发送单元的工作:

    在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则

    要插入 1 位与前 5 位反型的电平。

  • 接收单元的工作:

    在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个

    位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。

6.9 位时序

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。

一个位可分为 4 段,每个段又由若干个 Tq 构成,这称为位时序。
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。

Tq指的是CAN模块时钟提供的单位时间,也就是:CAN时钟=CAN时钟源/CAN分频系数,Tq指的就是分频后的CAN时钟的单位时间。

1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

image-20251221144723695

image-20251221144802655

在有的控制器里,把传播段与相位缓冲段1合并称为“时间段1”,而相位缓冲段2称为“时间段2”

image-20251221151456895

控制器采样电平信号的采样点位置在相位缓冲段1跟相位缓冲段2之间,通过设置相位缓冲段1和相位缓冲段2的值,可以调整采样点位置,保证每个位采样点一致。2个缓冲位的长度在传输数据时还可以硬件自动调节,调节范围则是由同步补偿宽度(SJW)决定;

采样点不能太靠前,也不能太靠后,否则如果刚好处于一个位的上升沿或者下降沿区间,会造成识别错误,所以根据CIA 105 的规范,采样点在87.5%左右比较合适。但是一般我们可根据实际情况选取75%~85%之间。

image-20251221152216629

6.10 同步
  1. 硬件同步:

    • 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步

    • 硬件同步只在帧的第一个下降沿(SOF下降沿)有效

    • 经过硬件同步后,若发送方和接受方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近

image-20251221150014235

  1. 再同步

    • 若发送方和接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW 值的误差时,最大调整量不能超过 SJW 值。

    • 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿

    • SJW=2Tq(1~4之间)

image-20251221150722544

  • 调整同步的规则(硬件同步和再同步遵从如下规则):
    • (1)1 个位中只进行一次同步调整。
    • (2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
    • (3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
    • (4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要满足下面条件。
    • (5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
    • (6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
6.11 波特率计算
  • CAN时钟=CAN时钟源/CAN分频系数
  • CAN波特率=CAN时钟/( SS(1Tq) + PTS + PBS1 + PBS2 )的Tq总个数

参考链接

[http://www.renesas.com]-CAN入门书(瑞萨电子公司)

[20.1 CAN总线协议解读_哔哩哔哩_bilibili]

[CANopen是什么? CANopen通讯基础(上)_哔哩哔哩_bilibili]

[解析CAN总线中的SOF、SRR、IDE和RTR数据位-百度开发者中心]

[CAN数据链路层的帧格式介绍——数据帧和远程帧 - 想当海贼王的akm - 博客园]

[40、CAN总线遥控帧-错误帧-过载帧-帧间隔_哔哩哔哩_bilibili]

posted @ 2026-01-03 00:17  verd  阅读(503)  评论(0)    收藏  举报