1. 简介
CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。由德国博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。 CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。目前也拥有以 CAN 为底层协议为商用车等大型车辆设计的 J1939 协议。
2.特点
- 多主控制:每个连接到CAN总线的节点都可以作为发送器或接收器
- 消息帧格式:支持标准帧(11位标识符)和扩展帧(29位标识符)两种消息格式
- 错误检测与处理:具有强大的错误检测机制,包括位填充、循环冗余校验(CRC)、应答场等,能够自动进行错误隔离。
- 仲裁机制:当多个节点同时发送消息时,根据标识符(ID)的优先级决定哪个节点可以继续发送,避免冲突。
- 物理层:CAN总线使用双绞线进行信号传输,它可以抵抗电磁干扰,适用于恶劣环境。
- ISO标准化:CAN总线已经成为了国际标准(ISO 11898),并且有专门针对特定应用的子标准,如J1939用于重型车辆。
- 数据速率:最高数据速率可达1 Mbps,实际应用中常见的速度是250 kbps 或 500 kbps。
- 最大消息长度:一帧CAN消息最多可传输8字节用户数据。
- 差分信号传输:使用两条信号线(CAN_H和CAN_L),通过测量两条线之间的电压差来传输信息,增强了抗干扰能力。需要在CAN_H和CAN_L之间接上120欧姆的终端电阻,因为电缆的特性阻抗为120欧。
3.CAN通讯
CAN总线网络使用两条信号线(CAN_H和CAN_L),各个节点通过这两条线实现信号的串行差分传输,此外CAN_H和CAN_L之间需接上120欧姆的终端电阻,主要作用是为了减少信号反射和改善信号质量,增强了抗干扰能力。
3.1 数据传输
CAN总线采用不归零码(Non-Return-to-Zero, NRZ)位填充技术,在NRZ编码中,每一位数据由一个固定的电平表示,这意味着信号的电压水平不会像其他一些编码方式那样在每个比特周期内返回到一个参考值。
例如,在CAN总线上, CAN 控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
显性电平对应逻辑:0 CAN_H和CAN_L之差 > 0.9V
隐性电平对应逻辑:1 CAN_H和CAN_L之差< 0.5V
根据此图我们知道,CAN总线采用的"线与"的规则进行总线冲裁。即1&0=0;所以0为显性。显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。
3.2 开始通讯
当系统启动时,CAN节点开始检测总线上的信号,如果总线空闲,节点准备发送数据。这个数据包括发送的数据、本身的ID信息或者其他的控制指令,又称为数据包(数据帧),也叫做报文。当报文被传输到其它节点时,只要这些节点按照规定的格式去解析,就能还原出原始数据。
CAN报文:CAN报文是控制区域网络(Controller Area Network, CAN)总线上使用的一种消息格式,用于在汽车和工业自动化等领域的通信中传输数据和控制命令。这种通信协议允许不同的电子控制单元(ECU)之间进行信息交换,而不需要主从结构或中央控制器。
一个基本的CAN报文通常包括以下几个部分:
- 起始位:一个显性的位,表示开始一个新的报文。
- 仲裁场:包含了标识符(ID),根据ID的优先级决定多个设备同时发送时哪个报文可以继续传输。ID长度可以是11位(标准帧)或29位(扩展帧)。
- 控制场:包含报文的类型(标准帧或扩展帧)和远程请求(RTR)位。
- 数据场:最多8个字节的数据内容,具体长度取决于应用需求。
- CRC校验码:循环冗余校验码,用于检测传输过程中的错误。
- ACK确认位:接收节点通过发送隐性位来确认收到正确的报文。
- EOF结束位:表示报文的结束,由两个隐性位组成。
- IFS间隔位:插入的一个隐性位,用作报文之间的间隔。
CAN通信是以以下5种类型的帧进行的:
其中,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。
3.2.1 数据帧
数据帧构成
3.2.2数据帧解析
1、帧起始。标准帧和扩展帧都是由1个位的显性电平表示帧起始。
2、仲裁段。表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图所示:
- 图中D表示显性电平,R表示隐形电平(下同)
- ID:高位在前,低位在后。
- 基本ID,禁止高7位都为隐性,即不能:ID=1111111XXXX。
- RTR,远程请求位。0,数据帧;1, 远程帧;
- SRR,替代远程请求位。设置为1(隐性电平);
- IDE,标识符选择位。0,标准标识符;1,扩展标识符
3、控制段。由6个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图所示:
- r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。
- DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。
- IDE,标识符选择位。0,标准标识符;1,扩展标识符;
4、数据段。该段可包含0~8个字节的数据,从最高位(MSB)开始输出。标准帧和扩展帧在这个段的格式完全一样:
5、CRC段。该段用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的:
- CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。
- 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
6、ACK段。此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的:
- 发送单元ACK段:发送2个隐性位。
- 接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为发送ACK/返回ACK。
- 注意:发送 ACK 的是既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC 错误的消息。
7、帧结束。由7个位的隐性位组成。标准帧和扩展帧在这个段格式完全一样。
3.2.3 总线仲裁
CAN(Controller Area Network)总线是一种多主通信协议,允许网络中的多个节点同时尝试发送数据。为了确保在冲突情况下确定性地传输数据,CAN采用了仲裁机制来决定哪个节点可以优先使用总线。这种机制是非破坏性的,这意味着即使一个节点的报文被中断,也不会造成物理层上的错误或需要重传。
CAN总线仲裁机制的主要步骤:
- 并行竞争:当两个或更多的节点在同一时间开始发送报文时,它们的报文起始位和仲裁场同时出现在总线上。
- 仲裁段比较:仲裁是基于报文中包含的标识符(ID),ID决定了报文的优先级。ID越小,优先级越高。
- 电平判决:在仲裁期间,每个节点都在监听总线,并且只有当它正在发送的位与总线上的位相匹配时,它才能继续发送。
- 显性电平具有高优先级:如果两个节点同时发送相同位(显性位对显性位或隐性位对隐性位),则仲裁继续进行下一个位。但如果一个节点发送显性位而另一个节点发送隐性位,则发送显性位的节点将赢得仲裁,因为显性位具有较高的优先级。
- 失去仲裁的节点停止发送:当一个节点检测到它的报文不再与总线上的报文匹配时,它就知道它已经失去了仲裁,因此会立即停止发送数据,而不会干扰当前正在获胜的报文。
- 获胜节点完成发送:赢得仲裁的节点继续发送报文的剩余部分,包括数据场、CRC校验码、ACK确认位等,直到报文结束。
规律:总线空闲时,最先发送的单元获得发送优先权,一但发送,其他单元无法抢占;如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级。
从ID开始比较,如果ID相同,还可能会比较RTR和SRR等位。
3.2.4 位时序
CAN总线的位速率,也称为波特率,指的是每秒钟传输的位数。一个位一般可以分为如下四段:
- 同步段(SS):同步段用于实现发送节点和接收节点之间的同步,确保所有节点都能正确地解释传输的数据
- 传播时间段(PTS):传播时间段用于补偿网络中的物理延迟,确保了所有节点都能在给定的时间内正确地接收和发送数据
- 相位缓冲段1(PBS1):相位缓冲段1位于同步段之后,用于在同步跳变和采样点之间提供一个缓冲区域。这允许接收器有时间来调整其位时间,以便在采样点正确地采样数据。PBS1的长度可以根据网络条件进行调整,以确保最佳的采样性能。
- 相位缓冲段2(PBS2):相位缓冲段2位于采样点之后,用于在采样点和下一个位的开始之间提供一个缓冲区域。这允许发送器有时间来准备下一个要发送的位,并确保接收器有时间来正确地解释已采样的数据。与PBS1一样,PBS2的长度也可以根据网络条件进行调整。
- 分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。
这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。 1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
位时间=1/波特率,因此,知道位时间,我们就可以知道波特率。 1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
如何计算波特率呢?
首先通过公式 位时间=1/波特率 (1)
位时间由若干个时间单元(Tq)或者称为时间份额组成。那么位CAN消息中最小的时间份额由下式计算:
Tq = (PRESDIV+1)/Fcanclk (2)
PRESDIV 为预分频因子, Fcanclk为CAN模块时钟源频率。
- 同步段(SYNC_SEG)为 1 个时间份额;
- 传播段( PROP_SEG)的长度可设置为 1, 2, …, 8 个时间份额;
- 相位缓冲段 1 ( PHASE_SEG1)的长度可设置为 1, 2, …, 8 个时间份额;
- 相位缓冲段 2( PHASE_SEG2 )的长度为阶段相位缓冲段 1 ( PHASE_SEG1 )和信息处理时间( INFORMATIONPROCESSINGTIME)之间的最大值;信息处理时间少于或等于 2 个时间份额。
- 一个位时间总的的时间份额值可以设置在 8—25 的范围。
-
- 根据公式(1),知道传播段,相位缓冲段1,相位缓冲段2的时间份额,同步段时间间隔为1,即可知道波特率与Tq的关系,波特率=1/[(SS+PTS+PBS1+PBS2)Tq]
- 根据公式(2),在知道PRESDIV和Fcanclk的设定值之后,即可计算出Tq的值,进而得到波特率的值。
3.2.5 CAN 的同步
CAN的同步分为硬同步和重新同步
- 硬同步:硬同步是指 CAN 节点在检测到总线上特定的位跳变时进行的同步操作。这些位跳变通常是隐性位(逻辑 1)到显性位(逻辑 0)的变化。当一个节点接收到这样的位跳变时,它会根据位跳变的位置来调整自己的采样点,以便与总线上的其他节点保持同步。这种同步方式在帧起始信号时同步总线上所有器件的位时序,无法确保后续一连串的位时序都是同步的。
- 重新同步:节点检测到总线上的跳变沿不在自己的 SS段范围,那么它会延长 PBS1 段或缩短 PBS2段,以使采样点与总线上的跳变沿重合。
一个位的构成:
采样点: 读取总线电平的时刻,并将读到的电平作为位值的点。位置在 PBS1 结束处。
延长/缩短PBS段来达到同步: PTS+PBS1小而PBS2加大时采样点前移,PTS+PBS1大而PBS2减小时采样点后移。
图中采样时间加大或减少量的最大值就是SJW,SJW 是 "Synchronization Jump Width" 的缩写,中文可以翻译为“同步跳跃宽度”。在 CAN(Controller Area Network)总线协议中,它是一个重要的参数,用于控制位同步时的采样点调整。
SJW 是同步段(SS)长度的倍数,其值决定了当接收节点检测到不匹配的位定时时,允许的最大调整量。如果采样点没有落在同步段内,那么就认为发生了同步错误,此时可以通过增大或减少采样点的位置来尝试恢复同步。SJW 控制了这个调整范围,即采样点能够前后移动的最大距离。
硬同步过程:
1、接收单元在总线空闲状态检测出帧起始时进行的同步调整。
2、当节点检测到本身SS段并不在总线电平下降沿跳变处,在其他段时进行的同步调整。
重新同步过程:
1、相位超前时
相位超前,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步
2、相位滞后时
相位滞后,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减
3.3 遥控帧
遥控帧用于请求发送节点传输数据,而不是直接携带数据本身。 遥控帧的结构与数据帧相似,但其数据字段部分包含的是远程传输请求(RTR),而没有实际的数据。
当一个接收节点接收到一个遥控帧时,它会知道发送节点正在请求特定 ID 的数据,并且需要通过发送数据帧来响应这个请求。
遥控帧通常用于读取远程设备的状态或获取远程设备的数据。
与数据帧一样,遥控帧也包含仲裁场、控制场和 CRC 场。但是,由于遥控帧不包含数据,所以其 DLC 字段(Data Length Code)始终为 0。此外,为了区分数据帧和遥控帧,CAN 协议规定了 RTR 位,该位在数据帧中为显性(逻辑 0),而在遥控帧中为隐性(逻辑 1)。
3.4 错误帧
在 CAN(Controller Area Network)总线协议中,错误帧(Error Frame)是一种用于报告网络错误的特殊报文类型。当 CAN 节点检测到总线上存在错误时,它会发送一个错误帧来通知其他节点,并尝试重新同步总线。 错误帧由两个部分组成:错误标志和错误界定符。
- 错误标志:用于标记错误帧的开始,并根据错误的严重程度进入主动或被动错误状态:
- 主动错误标志:是当一个节点检测到总线上存在严重错误时发送的信号。这个信号是一个持续时间至少为 6 个单位时间的显性位(逻辑 0),即连续的低电平信号。主动错误标志的目的是通知其他节点当前总线上的通信出现了问题,并请求重新同步总线,它已经被禁止发送报文,因为它被认为是导致通信错误的主要原因。
- 被动错误标志:是当一个节点接收到错误帧后发送的信号。这个信号是一个持续时间至少为 6 个单位时间的隐性位(逻辑 1),即连续的高电平信号。被动错误标志的目的是向其他节点表明该节点已经收到了错误帧,并且已经停止了数据传输,但是它仍然可以继续发送报文,但需要遵守一些特殊的规定,以避免加重网络中的错误情况。
- 需要注意的是,CAN 协议规定了一个节点在检测到错误之后只能发送一个错误标志,无论是主动还是被动。如果多个节点同时检测到错误并开始发送错误标志,则优先级最高的节点能够首先将总线设置为显性状态,并发送其错误标志。其他节点则必须停止发送并进入错误激活状态,等待总线恢复同步。
- 错误界定符:错误界定符由 8 个位的隐性位构成(逻辑 1),用于标记错误帧的结束。
3.5 过载帧
在 CAN(Controller Area Network)总线协议中,过载帧(Overload Frame)是一种特殊的报文类型,用于标记总线上存在的过载情况。当一个节点发送数据的速度超过了其他节点的处理能力时,它会发送一个过载帧来通知其他节点,并请求暂停一段时间以等待网络恢复同步。 过载帧由两个部分组成:过载标志和过载界定符
- 过载标志:6 个位的显性位(逻辑 0)。过载标志的构成与主动错误标志的构成相同,过载标志的作用是通知其他节点当前总线上的通信出现了过载,并请求暂停一段时间以等待网络恢复同步。
- 过载界定符:8 个位的隐性位(逻辑1)。过载界定符的构成与错误界定符的构成相同,过载界定符的作用是标记过载帧的结束,并表明发送节点已经停止了数据传输。
3.6 帧间隔
在 CAN(Controller Area Network)总线协议中,帧间隔(Inter-Frame Space)是指两个连续报文之间的时间间隔。它用于提供足够的时间让所有节点完成数据处理和错误检测,并为下一个报文的发送做好准备。
- 帧间隔是用于分隔数据帧和遥控帧的帧。
- 数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
- 过载帧和错误帧前不能插入帧间隔。
间隔:这是帧间隔的第一个阶段,也称为恢复时间。在这个阶段,所有节点都必须停止发送报文,并等待一段时间让总线恢复到空闲状态。这个时间长度通常为 3 个位的隐性位。
总线空闲(Bus Idle):这是帧间隔的第二个阶段,也称为沉默期。在这个阶段,总线上没有任何活动,所有的节点都在监听总线以检测是否有新的报文要发送。隐性电平,这个时间长度可以是任意值,但通常设置为一个固定值。
延迟传送:延迟传送是指发送节点在发送一个报文后需要等待一段时间才能开始发送下一个报文的过程。这个过程也被称为重传延迟。包含了 8 个隐性位的延迟传送段,在这个阶段,所有节点都必须停止发送报文,并等待一段时间让总线恢复到空闲状态。只有当这个时间段结束之后,节点才能开始发送下一个报文。
需要注意的是:延迟传送只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含。这是因为主动错误状态的节点已经被禁止发送报文,因此不需要进行延迟传送。而被动错误状态的节点虽然可以继续发送报文,但它们需要通过延迟传送来确保不会导致总线上的数据冲突和通信混乱。