控制器局域网络

控制器局域网（Controller Area Network，简称CAN或者CAN bus）是一种功能丰富的车用总线标准。被设计用于在不需要主机（Host）的情况下，允许网络上的单片机和仪器相互通信。它基于消息传递协议，设计之初在车辆上采用复用通信线缆，以降低铜线使用量，后来也被其他行业所使用。

CAN建立在基于信息导向传输协定的广播机制（Broadcast Communication Mechanism）上。其根据信息的内容，利用信息标志符（Message Identifier，每个标志符在整个网络中独一无二）来定义内容和消息的优先顺序进行传递，而并非指派特定站点位址（Station Address）的方式。

因此，CAN拥有了良好的弹性调整能力，可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外，消息的传递不基于特殊种类的节点，增加了升级网络的便利性。

## 历史

罗伯特·博世公司于1983年开发了控制器局域网（CAN bus）。该协议于1986年美国密歇根州底特律市举行的国际汽车工程师学会（SAE）会议上正式发表。第一个CAN控制芯片，由英特尔和飞利浦生产，并且于1987年发布。世界上第一台装载了基于CAN的多重线系统的汽车是1991年推出的梅赛德斯-奔驰 W140。

博世公司发表了关于CAN规范的几个版本，最新的CAN 2.0于1991年发布。该规范被分为两部分；A部分适用于使用11位标识符的标准格式，B部分适用于使用29位标志符的拓展格式。使用11位标识符的CAN装置一般被称作CAN 2.0A，而使用29位识别码的CAN装置通常称为CAN 2.0B。博世公司免费提供标准、规范和白皮书。

1993年，国际标准化组织（ISO）公布了CAN标准ISO11898。后来CAN标准被重新编译分成两个部分：ISO11898-1涵盖了数据链路层；ISO11898-2涵盖了高速CAN总线的物理层； ISO11898-3于晚些时候公布并且涵盖了低速CAN总线的物理层和CAN总线容错规范。物理层标准ISO11898-2和ISO11898-3并不包含在博世CAN2.0规范中，它们可以单独从ISO购买。

之后，博世公司仍然积极地拓展CAN标准。2012年，博世公布CAN FD 1.0或称作可变数据速率的CAN。这个规范使用不同的架构，允许在仲裁之后，切换至更快的比特率，传输不同的数据的长度。CAN FD兼容现有的CAN 2.0网络，所以新的CAN FD装置能够与现有CAN装置共存于同一控制网络。

CAN总线是五个使用在车载诊断 (OBD)-II标准的协议的其中一个。1996年以后，所有在美国销售的汽车及轻型卡车被强制要求符合OBD-II标准。在欧盟，自2001年后销售的汽油载具及2004年后销售的柴油载具都强制规定需要符合EOBD标准。

## 应用

CAN总线通常应用于如下领域

- 乘用车、卡车、公共汽车（汽油车及电动车）
- 航空、航海电子仪器
- 工业自动化及机械控制
- 电梯、扶梯
- 建筑自动化
- 医疗仪器及设备

### 汽车

现代的汽车可能为其子系统配备多达70个电子控制器（ECU）。最常见的控制器为发动机控制器。除此以外，变速器、安全气囊、防锁死刹车系统/ABS、定速巡航、动力方向盘、音响系统、动力车窗、车门、后视镜调整、电池和混合动力电动汽车的充电系统等等均使用电子控制器。这其中，有的是独立的子系统，有些需要跟其他子系统进行通信，控制驱动器或接收传感器的反馈信息。为此设计了控制器局域网络，将汽车的不同系统相互连接在一起。传统的“电缆直连”成本高，布线复杂，而控制器局域网络仅需软件就可实现，不仅安全、经济还十分便利。

- 自动启动/停止：车辆各处的各种传感器（速度传感器、转向角、空调关闭，发动机温度）所发出的各种信号可由CAN总线收集并用于决定是否可以在停车时关闭发动机，进而改善燃油效率和尾气排放。
- 电子驻车制动系统："斜坡驻车"的功能需要车辆的倾斜传感器（同时用于防盗报警器）和道路的速度传感器（同时用于防锁死制动、发动机控制和牵引力控制）通过CAN总线传输采样信号并决定车辆是否停在斜坡上。同样，安全带的传感器(安全气囊的一部分)通过CAN总线传输信号，以确定安全带是否扣上，然后泊车的刹车会自动在移动时关闭。
- 自动停车系统：当司机切换至倒档，变速器控制单元可以通过CAN总线发送信号，激活停车传感器系统和车门控制模块，使副驾驶侧的后视镜向下倾斜显示路涯。CAN总线也可以从雨水传感器获取信号，在倒车时自动触发后挡风玻璃雨刮。
- 车道偏离警示/防撞系统：车道偏离警示/驻车传感器的信号也可通过CAN总线用于驾驶辅助系统判断附近物体，比如车道偏离警示。最近，这些信号可以通过CAN总线触发防撞系统中的电子刹车系统。
- 汽车刹车清扫：雨水传感器(主要用于自动挡风玻璃雨刷)通过CAN总线将信号送达防抱死制动系统模块中，在行驶中轻微触发一次人体不会察觉的刹车来清除刹车片上的液体。奥迪和宝马的某些高性能型号搭配有这一功能。

近些年又开发出了LIN（区域互联网络）标准，用在非关键系统中的应用，例如空调和信息娱乐系统等数据传输速度和可靠性不是很重要的系统中。

### 其他

- CAN总线协议自2009年后被用于禧玛诺DI2的公路自行车电子变速系统上。同样的，Ansmann和BionX在它们的直驱电机中使用CAN协议。
- 由于CAN控制器和处理器价格低廉，CAN总线同样可应用于普通自动化环境的现场总线中。
- 包括NISMO在内的开发商致力于使用CAN总线数据在GT赛车6中利用游戏内的GPS数据，重建真实的赛车视觉动态模糊，玩家将获得真实的赛车动态模糊效果。
- 约翰·霍普金斯大学应用物理学实验室的模块化假肢（MPL）使用局域CAN总线使假肢上的伺服电机和控制器的沟通更容易。
- 熔融沉积成型（FDM）的3D打印机，工具头与控制主板之间的连接线改用CAN bus以简化传统繁琐的接线，并减轻工具头的重量，以利打印速度提升。

## 架构

CAN是一个用于连接电子控制单元（ECU）的多主机串行总线标准。电子控制单元有时也被称作节点。CAN网络上需要至少两个节点才可进行通信。节点的复杂程度可以只是简单的输入输出装置，也可以是包含有CAN交互器并搭载了软件的嵌入式元件。节点还可能是一个网关，允许普通计算机通过USB或以太网端口与CAN网络上的装置通信。

所有节点通过两根平行的总线连接在一起。两条电线组成一条双绞线，并且接有120Ω的特性阻抗。

ISO 11898-2，也称为高速度CAN。它在总线的两端均接有120Ω电阻。

<image>

高速CAN总线在传输显性（0）信号时，会将CAN_H端抬向5V高电平，将CAN_L拉向0V低电平。当传输隐性（1)信号时，并不会驱动CAN_H或者CAN_L端。显性信号CAN_H和CAN_L两端差分标称电压为2V。终端电阻在没有驱动时，将差分标称电压降回0V。显性信号（0）的共模电压需要在1.5V到3.5V之间。隐性信号（1）的共模电压需要在+/-12V。

<image>

ISO 11898-3，也被称作低速或者容错CAN。它使用线性主线，星形主线或者连接到一个线性主线上的多星结构主线著称。每个节点都有终端电阻作为全局终端电阻的一部分。全局终端电阻不应低于100 Ω。

<image>

低速/容错CAN信号在传输显性信号（0）时，驱动CANH端抬向5V，将CANL端降向0V。在传输隐性信号（1）时并不驱动CAN 总线的任何一端。在电源电压Vcc为5V时，显性信号差分电压需要大于2.3V，隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时，终端电阻使CANL端回归到RTH电压（当电源电压Vcc为5V时，RTH电压至少为Vcc-0.3V=4.7V），同时使CANH端回归至RTL电压（RTL电压最大为0.3V）。两根线需要能够承受-27V至40V的电压而不被损坏。

<image>

在高速和低速CAN中,从隐性信号向显性信号过渡的速度更快，因为此时CAN线缆被主动积极地驱动。显性向隐性的过渡速度主要取决于CAN网络的长度和导线的电容。

高速CAN通常被用于汽车和工业应用，在这些应用环境中，总线通常从一端横跨至另一端。容错CAN总线则经常被用在需要连接在一起的一组节点。

ISO规格只要求总线共模电压必须保持在最小和最大范围内，但不定义如何将总线电压保持在这个范围。

CAN总线必须使用终端电阻。终端电阻可以用来抑制信号反射，同时可以使总线电压回到隐性状态或者闲置状态。

高速CAN在总线两端使用120Ω电阻。低速CAN在每个节点均使用电阻。也有其他类型的终端，例如ISO 11783中定义了终端偏压电路。

终端偏压电路使用由4条导线组成的线缆，除了CAN信号线以外还有电源线和地线。这在每段总线两端提供自动偏压和终端功能。ISO11783网络是专为热拔插总线段和电子控制单元设计的。

<image>

每个节点需要:

- 中央处理器、微处理器或主处理器
- 处理主机决定收到的信息的意思以及想要传输的信息。
- 传感器、驱动器和控制装置可以与主处理器连接。
- CAN控制器；通常是集成单片机的一部分
- 接收：CAN控制器将从总线上接收的串位字节存储直到整个消息可用，之后主处理器可以获取这个消息（通常由于CAN控制器触发一个中断）。
- 发送：主处理器发送传递信息到CAN控制器，之后当总线空闲时将串位信息传递至总线。
- 收发器；由ISO11898-2/3介质访问单元（MAU）标准定义
- 接收：把数据流从CAN总线层转换成CAN控制器可以使用的标准。CAN控制器通常配有保护电路。
- 传输：把来自CAN控制器的数据流转换至CAN总线层。

每个节点能够发送和接收信息，但不是同时进行的。一个消息或帧主要包括标识符(ID)，它表示信息的优先级，最多八个数据字节。CRC、ACK和其他帧部分也是消息的一部分。改进了的CAN FD将每个帧拓展至最多64字节。消息采用不归零(NRZ)格式串联传送到主线并可被所有节点接收。

被CAN网络连接的装置通常是传感器，驱动器和其他控制设备。这些装置通过一个中央处理器、一个CAN控制器，和一个CAN接收器连接至总线。

## 数据传输

CAN数据传输如果出现争执，将会使用无损位仲裁解决办法。该仲裁法要求CAN网络上的所有节点同步，对每一位的采样都在同一时间。这就是为什么有人称之为CAN同步。然而，同步这个术语在此并不精确，因为数据以异步格式传输而不包含时钟信号。

CAN规范中使用术语"显性"位和"隐性"位来表示逻辑高低。显性是逻辑0(由发信器积极驱动通过电压)而隐性是逻辑1(被动地通过电阻返回到一个电压)。闲置状态代表隐性的水平，也就是逻辑1。如果一个节点发送了显性位而另一个节点发送一个隐性位，那么总线上就有冲突，最终结果是显性位“获胜”。这意味着，更高优先级的信息没有延迟。较低优先级的节点信息自动在显性位传输结束，6个时钟位之后尝试重新传输。这使得CAN适合成为一个实时优先通讯系统。

逻辑0或1的确切电压取决于所使用的物理层，但CAN的基本原则要求每个节点监听CAN网络上的数据，包括发信节点本身。如果所有节点都在同时发送逻辑1，所有节点都会看到这个逻辑1信号，包括发信节点个接受节点。如果所有发信节点同时发送逻辑0信号，那么所有节点都会看到这个逻辑0信号。当一个或多个发信节点发送逻辑0信号，但是有一个或多个发信节点发送了逻辑1信号，所有节点包括发送逻辑1信号的节点也会看到逻辑0信号。当一个节点发送逻辑1信号但是看到一个逻辑0信号，它会意识到线上有争执并退出发射。通过这个过程，任何传送逻辑1的节点在其他节点传送逻辑0时退出或者失去仲裁。失去仲裁的节点会在稍后把信息重新加入队列，CAN帧的比特流保持没有故障继续进行直到只剩下一个发信节点。这意味着传送第一个逻辑1的节点丧失仲裁。由于所有节点在开始CAN帧时传输11位(或CAN 2.0B中是29位)标识符，拥有最低标识符的发信节点在起始处拥有更多0。那个节点赢得仲裁并且拥有最高优先级。

例如，一个11位标识符的CAN网络，有两个节点，他们的ID分别为15（二进制表示为00000001111）和16（二进制表示为00000010000）。如果这两个节点同时传输，每个都会优先传输它们标识符中的前6个0而不触发仲裁。

起始位｜ID位｜帧剩下的部分

10｜9｜8｜7｜6｜5｜4｜3｜2｜1｜0

节点15｜0｜0｜0｜0｜0｜0｜0｜0｜1｜1｜1｜1

节点16｜0｜0｜0｜0｜0｜0｜0｜1｜停止传输

CAN数据｜0｜0｜0｜0｜0｜0｜0｜0｜1｜1｜1｜1

当ID中的第7位传输时，节点16为其ID发送1(隐性)，而节点15为其ID发送0（显性）。当这种情况发生时，该节点16知道自己发送了1，但在总线上看到了0，意识到有冲突发生并且自己失去仲裁。节点16停止传送而节点15继续传输自己的ID，没有丢失任何数据。拥有最低ID的节点总是赢得仲裁，因此具有最高优先级。

长度小于40m的网络最高支持的比特率高达1百万比特/秒。降低比特率可以允许使用更长的网络距离（例如，125千比特/秒支持最大500米）。改进的CAN FD标准允许仲裁后升高比特率，可以将数据区段速度增加至仲裁位速率的八倍。

## ID分配

信息ID在单条CAN总线上必须是唯一的，否则两个节点将在仲裁位(ID)传送结束后继续传输，造成错误。

1990年代早期，为信息选择标志符（ID）的准则仅仅基于数据的种类和发信节点。但是，当标志符同样代表着信息的优先级时，这会带来不好的实时响应。在这种情况下，通常要求CAN总线只能使用大概30%才能保证信息可以在截止时间之前到达。然而，如果信息的标志符根据信息的优先级决定，更低标志符的信息获得更高优先级，那么在不损失数据的前提下，总线的使用率可以达到70%到80%。

## 位时序

CAN网络上的所有节点必须运行在相同的标称比特率下，但噪音、相移、振荡频率容差和振荡频率漂移导致实际的比特率可能与标称比特率不同。由于没有使用一个单独的时钟信号，需要一个同步节点方法。同步在仲裁机制中十分重要，因为仲裁中的节点需要能够同时看到它们传输数据的数据和其他节点的传输数据。同步在确保节点间震荡时间不同时不发生错误上十分重要。

总线闲置一段时间后，在第一个隐性信号向显性信号转换时（起始位）进行硬同步。再次同步发生在传输帧期间的每次从隐性向显性转换时。CAN控制器期望在标称位时间内发生多次转换。如果并没有在期望的确定时间发生，控制器将根据这调整标称位时间。

调整是通过将每一位划分成多个称为量子的时间段,并分配一定数量的量子到位中的四个阶段完成的。这四个阶段分别为：同步、传播、相位段1和相位段2。

<image>

位被分成的量子数量会因控制器的不同而不同，每一个阶段分配的量子数会因比特率和网络状况的不同而改变。

在预期时刻之前或之后发生的过渡会促使控制器计算时间差，并根据计算所得的时间差延长相位段1或者缩短相位段2。这有效地改变接收器到发信器的时序，将它们同步在一起。这个重新同步过程不断地在每次隐性向显性过渡时进行已确保发信器和接收器保持同步。不断地重新同步降低了噪声产生的错误，让同步至已经失去仲裁的节点的接收节点重新同步到赢得仲裁的节点。

## 层级

CAN协议与很多网络协议相似，可以被分解为下列抽象层：

应用层

对象层

- 信息过滤
- 消息和状态处理

传输层

大多数CAN标准应用在传输层。传输层从物理层接收消息并将这些信息传递给对象层。传输层负责特定时序、同步、信息位构架、仲裁、确认、错误检测及发信和故障约束。它的职责为：

- 故障约束
- 错误监测
- 消息验证
- 信息确认
- 仲裁
- 信息帧
- 传输速率和时间
- 路由信息

物理层

<image>

CAN总线（ISO11898-1:2003）最初指定的链路层协议仅包括对物理层的抽象需求。物理层关于电气方面的（电压，电流，数量导体）规定来自于ISO11898-2:2003，该协议目前被广泛接受。但是，物理层关于机械方面的（接头种类和数量、颜色、标签、标准输出）尚未被正式指定。因此，汽车的电子控制单元（ECU）通常会有定制的接口和各种线缆组成CAN总线。尽管如此，领域中已经出现若干机械方面的标准，最常见的是使用9个引脚的D-sub型插头，拥有以下引脚分布：

- 引脚2：CAN-Low （CAN−）
- 引脚3：GND （地线)
- 引脚7：CAN-High （CAN+）
- 引脚9：CAN V+ （供电）

<image>

这个CAN的机械标准可以用于D-sub接口的插头和插座。总线电流从插座流向插头。这遵循了电源在插座处截止的电气工程惯例。采用本标准避免了为将节点连接到同一个D接口而制作定制分离器。非标准(自定义)线束(分离器)，在线缆上分离CAN分支，减少总线的可靠性、消除电缆可交换性、减少线束的兼容性并且增加成本。

完整的物理层规范的缺失（电气和机械方面）减少了CAN总线的限制，降低了实现功能时物理层面的复杂度。但它让CAN总线在交互时因为机械原因不兼容。为了提高互用性，许多汽车制造商制定了描述可兼容使用的CAN接收器的一套参数规范。最大寄生电容包括电容本身以及静电保护（ESD）（静电保护在ISO 7637-3中定义）。除了寄生电容、12V和24V系统因为最大电压不同有不同的标准。事实上，在助推启动（jump start）时，轻型车辆的先电压可以达到24V，而卡车系统可以达到36V。新的解决方案，允许同样的元件使用于CAN和CAN FD(详见）即将投入市场。

ISO11898-2:2003中的噪声免疫是通过在总线两端使用低电阻值（120欧姆）维持总线两条线间的差分阻抗实现的。然而，当处于休眠状态时，例如CAN总线的低阻值总线会比其他基于电压的信号总线消耗更多电流。在CAN总线系统中，当一条信号线中的电流于另一条反方向电流值一样时，该平衡传输线为接收器提供稳定的0V参考电压。最好的做法是在已经有很嘈杂的射频干扰的汽车内，对CAN总线使用带屏蔽层的双绞线，以尽量减少射频信号的发射，降低干扰的敏感性。

ISO11898-2在发信器和接收器之间提供一定的共模电压免疫。通过一个0V的通路保持节点间的电压关联。此外，在上述的现有机械结构里，包含一个将电力分配到各个节点的收发器的供电轨通道。该设计为所有收发器提供了一个共用的电源。总线上应用的实际电压由使用的收发器决定，并没有统一规范。常见设计是，通过CAN总线为每个与自身节点电气隔离的收发器提供电压驱动5V变压器。这通常提供足够多的冗余度来保证节点间的互用性。这种网络的典型供电电压在7V到30V之间。但是，通用标准的缺失导致系统的设计者要为供电轨道的兼容性负责。

ISO 11898-2 中描述的电气实施方法构建了一个在总线两端使用终端电阻组成的多站单端平衡线路布局。在这个结构中，显性状态由一个或多个传输器将CAN_L切换至0V，同时将CAN_H切换至5V总线电压来形成通过终端电阻的电流通路。终端电阻在这种信号系统中起到限制高频反射波形的核心作用。

在隐性状态时，信号线和电阻相对于高低轨道保持在高阻抗状态。CAN_H和CAN_L轨道的电压趋向于中立。隐性状态仅在总线上没有任何传输器宣布显性状态时出现。

在显性状态时，信号线和电阻相对于高低轨道变为低阻抗状态，因此电流能够流过电阻。CAN_H电压趋向于5V，同时CAN_L趋向于0V。

不管总线上信号是什么状态，信号线在线缆两端因为电阻的存在，相互之间总是保持低阻抗。

这个信号策略与例如RS-422/3和RS-485等等的其他平衡线路传输技术由显著的不同。RS-422/3和RS-485拥有差分线缆驱动但是差分模式下电压为一正一负。在这样的系统多路通信通常依靠在时域中支持三种状态（高电平有效、低电平有效和不活动三种状态）的介质。在CAN总线上进行多路通信只需要系统的电逻辑支持两个状态，在概念上与“由线缆构成的与门(wired AND)”网络相似。

## 帧

CAN网络可以配置为使用两种不同的消息（或“帧”）格式：标准或基本帧格式（在CAN 2.0 A和CAN 2.0 B中描述）和扩展帧格式（仅由CAN 2.0 B描述）。两种格式之间的唯一区别是，“CAN基本帧”支持标识符长度为11位，“CAN扩展帧”支持标识符长度为29位，由11位标识符（“基本标识符”）和一个18位扩展（“标识符扩展”）组成。CAN基本帧格式和CAN扩展帧格式之间的是通过使用IDE位进行区分的，该位在传输显性时为11位帧，而在传输隐性时使用29位帧。支持扩展帧格式消息的CAN控制器也能够发送和接收CAN基本帧格式信息。所有的帧都以开始位（SOF）作为信息传输的起始。

CAN有4种帧类型：

- 数据帧：包含用于传输的节点数据的帧
- 远程帧：请求传输特定标识符的帧
- 错误帧：由任何检测到错误的节点发送的帧
- 过载帧：在数据帧或远程帧之间插入延迟的帧

### 数据帧

数据帧是唯一用于实际数据传输的帧。它有两种信息结构：

- 基本帧格式：有11个标识符位
- 扩展帧格式：有29个标识符位

CAN标准要求必须接受基本帧格式并可能接受扩展帧格式，但必须能承受扩展帧格式。

#### 基本帧格式

<image>

帧格式如下：位值是用于描述CAN-LO信号的。

字段名｜字长 （位）｜作用

起始位（SOF）｜1｜表示帧的传输开始

辨识码（ID\green）｜11｜唯一识别码，同样代表了优先级

远程传输请求（RTR\蓝色）｜1｜数据帧时一定是显性（0），远程请求帧时一定是隐性（1）（详见远端影格章节）

标志码拓展位（IDE）｜1｜对于只有11位标志码的基本帧格式，此段一定为显性（0）

预留位（R0）｜1｜预留位一定是显性（0），但是隐性（1）同样是可接受的

数据长度代码（DLC\黄色）｜4｜数据的字节数（0-8字节）

数据段（Data field\红色）｜0–64 (0-8 字节)｜待传输数据（长度由数据长度码DLC指定）

循环冗余校验（CRC）｜15｜循环冗余校验

循环冗余校验定界码｜1｜一定是隐性（1）

确认槽（ACK）｜1｜发信器发送隐性（1）但是任何接收器可以宣示显性（0）

确认定界码（ACK delimiter）｜1｜一定是隐性（1）

结束位(EOF)｜7｜一定是隐性（1）

#### 拓展帧格式

帧的格式如下表所示：

字段名｜字长 （位）｜作用

起始位（SOF）｜1｜表示帧的传输开始

标志符A（ID A\green）｜11｜唯一识别码的第一部分，同样代表了优先级

替代远程请求（SRR）｜1｜数据帧时一定是显性（0），远程请求帧时一定是隐性（1）

标志符拓展位（IDE）｜1｜对于有29位标志符的拓展帧格式，此段一定为隐性（1）

标志符B（ID B\green）｜18｜唯一识别码的第二部分，同样代表了优先级

远程传输请求（RTR\蓝色）｜1｜数据帧时一定是显性（0），远程请求帧时一定是隐性（1）（详见远端影格章节）

预留位（r1，r0）｜2｜预留位一定是显性（0），但是隐性（1）同样是可接受的

数据长度代码（DLC\黄色）｜4｜数据的字节数（0-8字节）

数据段（Data field\红色）｜0–64 (0-8 字节)｜待传输数据（长度由数据长度码DLC指定）

循环冗余校验（CRC）｜15｜循环冗余校验

循环冗余校验定界符｜1｜一定是隐性（1）

确认槽（ACK）｜1｜发送器发送隐性（1），任何接收器都可以发送显性（0）

确认定界符（ACK delimiter）｜1｜一定是隐性（1）

结束位(EOF)｜7｜一定是隐性（1）

两个定位符区域A和B共同组成29位定位符。

### 远程帧

- 通常数据传输是在数据源节点（例如传感器）发出数据帧的情况下自主执行的。但是，目标节点也可以通过发送远程帧来从信息源请求数据。
- 数据帧和远程帧之间有两个区别。首先，RTR位在数据帧中作为显性位传输，其次在远程帧中没有数据段。DLC字段表示所请求的消息的数据长度，而不是发送的数据长度。

也就是说：

RTR = 0；数据帧中为显性

RTR = 1；远程帧中位隐性

在数据帧和具有相同标识符的远程帧同时发送的情况下，由于数据帧标识符之后的RTR位是显性，它将赢得仲裁。

### 错误帧

错误帧由两个不同的字段组成：

- 第一段由不同站点提供的错误标志（6-12个显性位/隐性位）的叠加给出。
- 接下来的第二段是错误帧定界符（ERROR DELIMITER，8个隐性位）。

错误标志也有两种：

主动错误标志:六个显性位 - 由网络上错误状态为“主动错误”的出错的节点传送。

被动错误标志:六个隐性位 - 由网络上错误状态为“被动错误”的出错的节点传送。

CAN有两种错误计数器：

```
    1.传输错误计数器（Transmit error counter，简称TEC）
    2.接受错误计数器（Receive error counter，简称REC）
```

- 当传输错误计数器TEC或接受错误计数器REC大于127且小于255时，将在总线上传输被动错误帧。
- 当传输错误计数器TEC或接受错误计数器REC小于128时，将在总线上传输主动错误帧。
- 当传输错误计数器TEC或接受错误计数器REC大于255时，节点进入主线离线状态，不会传输帧。

### 过载帧

过载帧包含两个位字段：过载标志（Overload Flag）和过载定界符（Overload Delimiter）。有两种过载条件可导致过载标志的传输：

- 接收器的内部条件，要求延迟下一个数据帧或远程帧。
- 中断检测到一个显性位。

由于情况1引起的过载帧只允许在预期中断的第一位时间开始，而由情况2引起的过载帧在检测到显性位后一位开始。过载标志由六个显性位组成，其整体形式与主动错误标志的形式相对应。过载标志的形式破坏了中断区的固定形式。因此，所有其他站点也会检测到过载情况，并在它们自己的部分开始传输过载标志。过载定界符由8个隐性位组成，与错误分隔符的形式相同。

## 侦错机制

CAN提供了五种调试机制，使其错误发生率低于4.7×10−11。当一个以上的上述错误发生时，发送中的传输将会失败中止并且产生错误数据包，发讯端则会试着重新发送消息数据包。各个节点将会重新争取优先权。

CAN的五种侦测错误机制

循环冗余校验（CRC）｜CRC在讯息结尾处加上一个FCS（frame check sequence）来确保讯息的正确。接收讯息端会将其FCS重新演算并与所接收到的FCS比对，如果不相符，表示有CRC错误。

Frame check｜检查封包中几个固定值的字段以验证该封包是否有被讯号干扰导致内容错误。

ACK errors｜接收端在收到封包后会告知发讯端，发讯端若没有收到确认讯息，ACK错误便发生。

Monitoring｜传输一位到网络上，再从网络读取来检查是否一致。

Bit stuffing｜用于消息同步。

## 确认槽（ACK）

确认插槽用于确认收到的CAN帧有效。接收到帧而没有发现错误的每个节点在ACK槽中发送显性水平，来覆盖发射机的隐性水平。如果发射机在ACK时隙中只检测到隐性电平，它就知道没有任何接收器获得有效的帧。接收节点可以发送隐性信号来指示它没有接收到有效帧，但是确实接收到有效帧的其它节点可以用显性信号覆盖它。发送节点无法知道CAN网络上的是否所有节点都收到了该消息。

## 帧间内容

数据帧和远程帧通过称为帧间空间的区域与前面的帧分开。帧间空间由至少三个连续的隐性（1）位组成。之后，如果检测到一个显性位，它将被视为下一帧的“起始位”。过载帧和错误帧不比帧间空间重要，并且多个过载帧也不由帧间空间分隔。帧间空间包含了字段中断和总线空闲，并且如果前一消息的发送器是被动错误站点，会将总线暂挂。

## 位填充

<image>

传输器会在相同极性的五个连续位之后插入一个相反的极性的位，以确保足够的转换来保持同步。这种做法被称为位填充，并且对于CAN这样的不归零（NRZ）编码是必要的。填充的数据帧由接收器去掉填充。

除了CRC定界符，ACK字段和结束位这样固定字长的区域之外，帧中其他所有字段都会被填充，这些字段是固定大小且未被填充。在使用位填充的字段中，具有相同极性的六个连续位（111111或000000）被视为错误。当检测到错误时，节点可以发送主动错误标志。主动错误标志由六个连续的显性位组成，违反了位填充规则。

位填充意味着数据帧可能比上述表中列举的预期的要长。CAN帧（基本格式下）的最大尺寸的情况是

11111000011110000...

被填充为：（填充位用粗体显示）

111110000011111000001...

填充位本身可能成为五个连续相同位中的第一个，所以在最坏的情况下，每四个原始位有一个填充位。

长度由下面公式给出：

$$8n + 47 + \left\lfloor \frac{34 + 8n - 1}{4} \right\rfloor$$

其中$8n + 47$是填充前帧的长度，在最坏情况下，原数据除了第一个4位后，在每个4位后增加一位（所以分子减去1），同时由于位的结构，固有的47位中只有34位能够被填充。

## CAN低层标准

ISO 11898系列规定了用于道路车辆的CAN串行通信技术的物理层和数据链路层（ISO/OSI模型的第一和第二层），支持分布式实时控制和多路复用。

有如下几个CAN物理层及其他层的标准：

ISO 11898-1:2015规定了控制器局域网（CAN）的数据链路层（DLL）和物理信令。该文档根据ISO/IEC 7498-1中建立的开放系统互连（OSI）的ISO参考模型，描述了CAN总线层级通用架构，并提供了在模块之间建立数字信息交换实现CAN数据链路层的特性，和逻辑链路控制（LLC）次层和介质访问控制（MAC）次层的详细参数。

ISO 11898-2:2003规定了高速（传输速率高达1 Mbit / s）介质访问单元（MAU）和一些介质相关接口（MDI）特性（根据ISO 8802-3），共同组成了控制局域网的物理层。ISO 11898-2使用双线平衡传输线信令体系，是车用动力总成应用和工业控制网络中最常用的物理层。

ISO 11898-3:2006规定了在道路车辆电子控制单元之间建立的低速、容错、依赖介质的接口的数字信息交换设置，其传输速率在40kBit/s至125kBit/s之间。

ISO 11898-4:2004规定了在CAN中的时间触发通信（TTCAN）。它适用于在配备CAN的道路车辆的电子控制单元（ECU）之间建立时间触发的数字信息交换，并且根据ISO11898-1规定了与逻辑链路和介质访问控制协调的帧同步，提供了时间触发的通讯时间表。

ISO 11898-5:2007规定了道路车辆内传输速率高达1 Mbit/s的CAN网络物理层。它根据ISO 8802-2描述了介质访问单元的功能以及一些与介质相关的接口功能。它是ISO 11898-2的扩展，应对没有主动主线通讯但是要求低功耗特性的系统。

ISO 11898-6:2013规定了道路车辆内传输速率高达1 Mbit/s的CAN网络物理层。它根据ISO 8802-2描述了介质访问单元的功能以及一些与介质相关的接口功能。它是ISO 11898-2和ISO 11898-5的扩展，描述了一种可选的，利用可配置的CAN网络帧的选择性唤醒机制。

ISO 16845-1:2004提供了用于检查CAN是否符合ISO 11898-1规定所必需的方法和简要测试套件。

ISO 16845-2:2014设立测试案例和测试要求，验证具有选择性唤醒功能的CAN收发器是否符合指定的功能。ISO 16845-2：2014中定义的测试类型称为一致性测试。

## 基于CAN的高层协议

由于CAN标准不包括例如数据流量控制、设备寻址、传输多条消息的数据块和应用数据等应用层协议的工作，许多高层协议被指定出来。尽管这些协议都能被制造商扩展，但其中只有几个为商用领域标准化。对于乘用车，每个制造商都有自己的标准。其中包括：

### 标准化的方法

- ARINC 812或ARINC 825（航空工业）
- CANopen - EN 50325-4（工业自动化技术）
- DeviceNet（工业自动化技术)
- EnergyBus - CiA 454（轻型电动汽车）
- ISOBUS - ISO 11783（农用机械）
- ISO-TP - ISO 15765-2（机动车诊断用传输协议）
- SAE J1939（公车和卡车的车用网络）
- MilCAN
- NMEA 2000 - IEC 61162-3（航海工业）
- 统一诊断服务（UDS） - ISO 14229 （汽车诊断）

### 其他方法

- CANaerospace - Stock (航空工业)
- CAN Kingdom - Kvaser (嵌入式系统)
- CCP/XCP（汽车ECU校正校准）
- GMLAN - General Motors（通用汽车）
- RV-C - RVIA（娱乐用载具）
- SafetyBUS p - Pilz（工业自动化技术）
- UAVCAN（航空航天及机器人）

## CANopen电梯

CANopen特别兴趣组织（SIG）“电梯控制”成立于2001年，为电梯控制系统开发了CiA 417 CANopen应用配置。CiA 417的第一个版本于2003年夏发布。2.0版本于2010年2月在CiA网站公布。SIG致力于扩展CANopen电梯系统的功能，改进技术内容并确保满足当前对电梯控制系统的法律标准。2.1.0版本于2012年7月发布，于2015年12月发布2.2.0版本（CiA成员可以获得）标准草案提案。目前（2016年）SIG正在开发2.3.0版本（CiA成员可以获得）。

SIG的主席是Jörg Hellmich（ELFIN GmbH），它同时是CANopen电梯社区维基的管理员。

## 安全性

CAN是低级协议，不支持任何内在的安全功能。在标准的CAN中也没有加密，这使得这些网络数据能被截取。在大多数应用中，应用程序需要部署自己的安全机制，例如认证传入命令或网络上某些设备的存在。若不执行适当的安全措施，其他人可能设法在总线上插入消息。尽管一些安全关键功能（如修改固件，编程键或控制防抱死制动）存在密码，但这些系统并未普遍实施，并且密钥对的数量有限。

## 开发工具

在开发CAN总线或排除故障时，检查硬件信号非常重要。可以使用逻辑分析仪和总线分析仪来收集、分析、解码并储存高速波形信号。此外，还有CAN总线监视器及其它特殊工具。

CAN总线监视器是一个分析工具，通常是硬件和软件的组合，用于开发使用在CAN总线上的硬件。

通常，CAN总线监视器将监听CAN总线上的通信量，以便将其显示在自身的用户界面中。它通常也能将CAN帧发送到总线来模拟CAN总线活动。因此，CAN总线监视器可用于验证来自待测设备的预期CAN流量或模拟CAN流量以验证测试设备连接到CAN总线时的反应。

## 许可

博世公司拥有该技术的专利，生产兼容CAN的微处理器的制造商需要向博世公司支付许可费，这些费用通常加在芯片价格中传递给客户。生产兼容CAN的定制特殊应用积体电路（ASICs）或现场可编程逻辑门阵列（FPGA）模块的制造商需要为CAN协议许可证支付费用。

## 参见

- Byteflight
- 车用音响
- CANopen - 嵌入式系统的通信协议
- CANpie – CAN的开源设备驱动
- CAN FD – 新的具有更快传输的CAN
- Can4linux – CAN的开源Linux设备驱动程序
- FlexCAN – 另一种实现方法
- FlexRay – 另一种较高规格的车用网络
- 网络总线列表
- LIN总线 – 另一种低成本的车用网络
- MOST
- OBD-II PID – 参数ID列表
- OSEK
- SAE J1939 - 卡车和公共汽车的通信协议
- SocketCAN – 大众汽车研究院为Linux内核开发的一系列开源CAN驱动程序和网络堆栈。
- DBC档 (CAN)

## 外部链接

- Bosch参数 （旧文件 - 在某些方面略有含糊/不明确，被标准取代）
- 博世公司CAN FD参数v1.0
- 控制器局域网（CAN）可调度性分析：反驳，重访和修订
- 常用的CAN总线连接器引脚
- 独立讨论平台CANLIST
- 关于车用CAN安全性的网页
- 具有FIFO队列的控制器局域网（CAN）可调度性分析
- 控制器局域网（CAN）实施指南
- 教程：控制器局域网（CAN）简介和基础知识
- Windows系统位时序计算器免费软件，支持许多单片机。例如Atmel, STM32, Microchip, Renesas (压缩文件)
- 汽车CAN和CAN-FD保护
- “CAN简介”免费电子学习模块
- ARINC-825教程（视频）来自Excalibur Systems公司。
- ISO - 国际标准化组织
- 了解和使用的控制器局域网，来自加州大学伯克利分校
- Full fledged professional CAN course