CAN通信协议
1、CAN 协议简介
CAN 是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519), 是国际上应用最广泛的现场总线之一。
CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
1.1、 CAN 物理层
与 I2C、 SPI 等具有时钟信号的同步通讯方式不同, CAN 通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
(1)闭环总线网络
CAN 物理层的形式主要有两种, 图 44-1 中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120 欧”的电阻。

(2)开环总线网络
图 44-2 中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。

(3)通讯节点
从 CAN 通讯网络图可了解到, CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及CAN_Low 是一对差分信号线,使用比较特别的差分信号。
当 CAN 节点需要发送数据时, 控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。
例如, STM32 的 CAN 片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个收发器,在我们实验板中使用型号为 TJA1050 的芯片作为 CAN 收发器。CAN 控制器与 CAN 收发器的关系如同 TTL 串口与 MAX3232 电平转换芯片的关系,MAX3232 芯片把 TTL 电平的串口信号转换成 RS-232 电平的串口信号, CAN 收发器的作用则是把 CAN 控制器的 TTL 电平信号转换成差分信号(或者相反)。
(4)差分信号
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑 0 和逻辑 1。见图 44-3,它使用了 V+与 V-信号的差值表达出了图下方的信号。

相对于单信号线传输的方式,使用差分信号传输具有如下优点:
抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。
能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
时序定位精确, 由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。
由于差分信号线具有这些优点,所以在 USB 协议、 485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。
(5)CAN 协议中的差分信号
CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,见表 44-1及图 44-4。以高速 CAN 协议为例,当表示逻辑 1 时(隐性电平), CAN_High 和 CAN_Low线上的电压均为 2.5v,即它们的电压差 VH-VL=0V;而表示逻辑 0 时(显性电平),CAN_High 的电平为 3.5V, CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-VL=2V。
例如,当 CAN 收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时(逻辑 0),它会使 CAN_High 输出 3.5V,同时 CAN_Low 输出 1.5V,从而输出显性电平表示逻辑 0。


在 CAN 总线中,必须使它处于隐性电平(逻辑 1)或显性电平(逻辑 0)中的其中一个状态。假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平(逻辑0)状态,显性电平的名字就是这样来的, 即可以认为显性具有优先的意味。
由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说, CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。
1)显性电平与隐性电平的理解
理解显性与隐性电平,是理解CAN总线仲裁、错误检测和帧结构的关键。
从电气层面理解为什么“显性”是‘0’,我们以最常用的高速CAN 为例:
当节点要发送一个显性位(逻辑0)时:
它的CAN收发器会主动驱动总线,使CAN_H电压升高,CAN_L电压降低,产生一个大约 2V 的差分电压。
这是一种主动的、强制的状态。
当节点要发送一个隐性位(逻辑1)时:
它的CAN收发器会停止驱动,进入高阻抗状态。CAN_H和CAN_L线通过终端电阻回到一个相同的静态电压(约2.5V),差分电压为 0V。
这是一种被动的、释放的状态
A、核心思想:线与逻辑
CAN总线使用一种“线与”(Wired-AND)的逻辑机制。这意味着:
只要有一个节点输出显性电平(逻辑0),整个总线就是显性电平。
只有当所有节点都输出隐性电平(逻辑1)时,整个总线才是隐性电平。
这与我们通常认为的“高电平是1,低电平是0”是相反的。在CAN总线里,“显性”是“强”的、主动的状态,而“隐性”是“弱”的、默认的状态。
节点A想发送‘1’(隐性):它释放总线,不驱动。
节点B想发送‘0’(显性):它驱动总线,产生差分电压。
根据“线与”的物理特性,那个主动驱动的、更强的信号(显性‘0’)会覆盖那个被动的、弱的信号(隐性‘1’)。
最终,总线上的实际结果是显性‘0’。
所以规则是:只要有一个节点输出显性‘0’,它就“赢”了,总线结果就是显性‘0’。
你可以把它想象成一个多人投票系统:
显性电平 相当于投 “反对”票(0)。只要有一个人投反对票,结果就是“反对”。
隐性电平 相当于投 “同意”票(1)。只有当所有人都投同意票时,结果才是“同意”。
在电气特性上,这通过使用差分信号来实现。
B、电气特性:CAN_H与CAN_L
CAN总线使用两根线来传输一个信号:CAN_H(高电平线)和CAN_L(低电平线)。接收器通过检测这两根线之间的电压差来判断逻辑状态。

一个生动的比喻:把CAN_H和CAN_L看作一条水管的进水管和出水管。
隐性电平(1):两个水管的水流平衡,没有压力差。系统处于“静止”或“空闲”状态。
显性电平(0):进水管压力增大(CAN_H ↑),出水管压力减小(CAN_L ↓),产生了显著的压力差。系统处于“活动”状态。
C、为什么这么设计?—— 核心优势
这种“线与”逻辑和显/隐性电平的设计,带来了CAN总线最强大的特性:无损仲裁。
仲裁过程
CAN节点在发送数据的同时,也在监听总线。
当总线处于隐性状态(所有节点都输出1),如果一个节点想发送一个显性位(0),它就会开始驱动总线为显性电平。
如果此时有两个节点同时发送:
节点A想发送 1(隐性)
节点B想发送 0(显性)
节点B会成功地将总线拉低到显性电平。
节点A在发送的同时也在监听,它发现自己想发送的是1(隐性),但实际检测到总线却是0(显性)。它意识到有更高优先级的报文正在发送,于是立即退出发送,转为接收模式。
这个过程没有任何数据损坏或延迟,发送更高优先级(标识符数值更小)报文的节点会毫无阻碍地赢得总线访问权。标识符(ID)数值越小,开头的‘0’(显性位)越多,优先级越高。因为它能在仲裁中轻易覆盖掉别人发的‘1’(隐性位)。
帧起始与帧结束
帧起始(SOF):是一个显性位(0)。它用一个强有力的信号把所有人从空闲(隐性)状态中“唤醒”,不容忽视。它就像一个起跑信号,告诉所有节点“有报文要开始了!”,同时用于硬同步。
帧结束(EOF):是7个连续的隐性位(1)。这是一个非常独特的序列,因为在正常数据中,连续5个相同位后就会插入一个填充位。因此,7个隐性位是一个明确的“结束”标志,不会与数据流混淆。
错误标志
当一个节点检测到错误时,它会立即发送一个显性位(0)来打断当前的数据流。当一个节点需要报告错误时,它会立刻发送一连串的显性‘0’来强力打断当前的数据流,确保所有节点都能注意到。
由于“线与”逻辑,这个显性位会覆盖其他节点可能正在发送的隐性位,从而强制所有节点都注意到这个错误条件。
总结与对比

核心要点:
显性(0)是“强”信号,隐性(1)是“弱”信号。
显性总能覆盖隐性,这是总线仲裁和错误信令的基础。
总线在空闲时始终处于隐性状态。
理解这个概念,就能很容易地理解为什么标识符值越小(开头显性位越多),报文优先级越高。
将位同步和显/隐性电平这两个概念结合起来,你就能对CAN总线如何实现稳定、高效、可靠的多主机通信有一个非常扎实的基础理解了。
1.2 协议层
以上是 CAN 的物理层标准,约定了电气特性,以下介绍的协议层则规定了通讯逻辑。
(1)CAN 的波特率及位同步
由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地, CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
位同步
1)核心思想:为什么需要位同步?
想象一下,两个人用摩斯电码通信。如果双方的手表时间不一致,一个觉得“点”是0.1秒,另一个觉得是0.2秒,那么信息很快就会错乱。
CAN总线也是如此:
发送器 以特定的标称位时间 发送一个位(比如1微秒一个位)。
接收器 也有一个内部的时钟源,但其频率和发送器不可能完全一致,存在微小偏差。
随着时间推移,这个微小的偏差会累积,导致接收器在错误的时间点对总线电平进行采样,最终读错位的值(例如把0读成1)。
位同步的目的,就是让接收器的内部时钟与当前数据流的实际位边界保持对齐,确保在每位最“安全”的中心位置进行采样,从而得到正确的数据。
2)位同步是如何实现的?
CAN协议通过一种名为 “硬同步” 和 “再同步” 的机制来实现位同步。要理解这个,首先需要了解一个位的结构。
A、一个位的构成:时间段
CAN协议将一个位时间划分为四个不重叠的段:
同步段(Sync_Seg)
这是位的开始,期望的边沿(从隐性到显性,或显性到隐性)就发生在这个段内。
硬同步事件会直接使位时间计数器复位到这个段。
固定长度,通常为1个时间份额(Time Quantum, Tq)。
传播段(Propagation_Seg)
用于补偿信号在总线上物理传输的延迟。
这个时间包括发送器输出延迟、接收器输入延迟和信号在总线上的往返传播延迟。
长度可配置(通常为1-8 Tq)。
相位缓冲段1(Phase_Seg1)
位于采样点之前。用于补偿节点的时钟误差。
通过再同步,可以延长 这个段来等待边沿的到来。
长度可配置(通常为1-8 Tq)。
相位缓冲段2(Phase_Seg2)
位于采样点之后。同样用于补偿时钟误差。
通过再同步,可以缩短 这个段来追赶边沿。
长度可配置(通常为1-8 Tq)。
采样点(Sample Point):
这是接收器实际读取总线电平值的时间点,位于相位缓冲段1结束的位置。
位同步的所有努力,都是为了确保这个采样点位于一个位的正中央,远离可能发生边沿变化的区域(位开始和位结束)。
B、同步的两种机制
a) 硬同步(Hard Synchronization)
发生时机:仅在帧起始(SOF) 的下降沿(显性位开始)时发生。
动作:硬同步会强制立即结束当前的位时间,并重新从同步段开始一个新的位时间。
作用:它为整个报文的接收提供了一个全局的起始对齐点。相当于在长跑开始时,所有人听到发令枪响,同时起跑。
b) 再同步(Resynchronization)
发生时机:在一个位时间内的其他任何地方(除了帧起始),只要检测到“同步跳转边沿”(即总线上从隐性到显性或显性到隐性的变化),就会发生再同步。
动作:再同步不会像硬同步那样强行复位,而是通过调整相位缓冲段的长度来微调当前位时间。
如果边沿在采样点之前出现(即在Sync_Seg之后,但在Sample Point之前),说明接收器本地时钟“慢了”,发送器的边沿提前到来了。此时,Phase_Seg1会被延长,以等待这个边沿,相当于让接收器“等一等”。
如果边沿在采样点之后出现(即在Sample Point之后,但在下一位的Sync_Seg之前),说明接收器本地时钟“快了”,发送器的边沿迟到了。此时,Phase_Seg2会被缩短,以立即开始下一位,相当于让接收器“赶一赶”。
限制:为了避免过度调整导致混乱,每次再同步的调整量有一个上限,称为 “同步跳转宽度(SJW)” 。SJW通常设置为1到4个Tq。它限制了Phase_Seg1最多能延长多少,Phase_Seg2最多能缩短多少。
3)一个生动的比喻
把接收一个CAN位比作和一个人一起走路:
标称位时间:你们约定好每1秒迈出一步。
硬同步:在开始走路时(帧起始),你喊“齐步走!”,确保你们第一步同时迈出。
走路过程中:你用余光瞟着同伴的脚。
再同步:如果你发现他的脚比你的先 落地(边沿提前),你下一脚就稍微慢一点 落地(延长Phase_Seg1)。
如果你发现他的脚比你的后 落地(边沿滞后),你下一脚就稍微快一点 落地(缩短Phase_Seg2)。
SJW:你每次调整步速的幅度是有限的,不能一下子从慢走变成狂奔,否则会摔倒。这个最大调整幅度就是SJW。
采样点:你判断对方是否跟你同步的最佳时机,是在他的脚稳稳地踩在地面上的时候(位的中央),而不是在他抬脚或刚落地的瞬间(位的边界)。
4)、总结与要点
根本目的:补偿不同节点间晶振的频率偏差和相位偏差,确保采样准确。
两大机制:
硬同步:在报文开始时进行“对表”,强制对齐。
再同步:在报文传输过程中进行“微调”,持续跟踪。
关键概念:
位时间分段(Sync_Seg, Prop_Seg, Phase_Seg1, Phase_Seg2)是同步的基础。
采样点 是位同步要守护的目标位置。
同步跳转宽度(SJW) 是每次微调的最大限度,保证了系统的稳定性。
正是由于这种精巧的位同步机制,CAN总线才能在恶劣的工业环境和存在一定时钟误差的情况下,实现稳定可靠的通信。在配置CAN控制器时,正确设置这些时间段和SJW是保证通信质量至关重要的一步。
位时序分解
为了实现位同步, CAN 协议把每一个数据位的时序分解成如图 44-5 所示的 SS 段、PTS 段、 PBS1 段、 PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示, 图 44-5 中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。

该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1 段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。
各段的作用如介绍下:
SS 段(SYNC SEG)
SS 译为同步段, 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。 SS 段的大小固定为 1Tq。
PTS 段(PROP SEG)
PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。 PTS 段的大小可以为 1~8Tq。
PBS1 段(PHASE SEG1),
PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。 PBS1 段的初始大小可以为 1~8Tq。
PBS2 段(PHASE SEG2)
PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。 PBS2 段的初始大小可以为 2~8Tq。
通讯的波特率
总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个Tq,就可以确定 CAN 通讯的波特率。
例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit =19us,从而每秒可以传输的数据位个数为:1x106/19 = 52631.6 (bps)。这个每秒可传输的数据位的个数即为通讯中的波特率。
同步过程分析
波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据位内的 SS、 PTS、 PBS1 及 PBS2 段了。
根据对段的应用方式差异, CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:
1) 硬同步
若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号(即下一小节介绍的帧起始信号),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。
见图 44-6,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

2) 重新同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS段把跳变沿包含起来。
重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。第一种相位超前的情况如图 44-7,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步。

第二种相位滞后的情况如图 44-8,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。

在重新同步的时候, PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度 SJW (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。
(2)、CAN 的报文种类及结构
在 SPI 通讯中, 片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢? CAN协议给出的解决方案是对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。
报文的种类
在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。
为了更有效地控制通讯, CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表44-2。

1)数据帧的结构
数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,见图 44-9。

数据帧以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束,在它们之间,分别有仲裁段、控制段、数据段、 CRC 段和 ACK 段。
帧起始
SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。
仲裁段
当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。
仲裁段的内容主要为本数据帧的 ID 信息(标识符), 数据帧具有标准格式和扩展格式两种,区别就在于 ID 信息的长度,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。 CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。
报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平, CAN 正是利用这个特性进行仲裁。
若两个节点同时竞争 CAN 总线的占有权,当它们发送报文时, 若首先出现隐性电平(逻辑1),则会失去对总线的占有权,进入接收状态。见图 44-10,在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平(逻辑1),而此时节点单元 2 发送的为显性电平(逻辑0),由于总线的“线与”特性使它表达出显性电平,因此单元 2 竞争总线成功,这个报文得以被继续发送出去。

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN 控制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID的报文。
回看图 44-9 中的数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、 IDE 和 SRR位。
(1) RTR 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
(2) IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
(3) SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的 SRR 位为隐性位, RTR 在数据帧为显性位,所以在两个 ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
控制段
在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段(DataLength Code),译为数据长度码,它由 4 个数据位组成, 用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。
数据段
数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成, MSB先行。
CRC 段
为了保证报文的正确传输, CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的 CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。 CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。
在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK 段间隔起来。
ACK 段
ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
帧结束
EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。
2)其它报文的结构
关于其它的 CAN 报文结构,不再展开讲解,其主要内容见图 44-11。


浙公网安备 33010602011771号