- CAN(Controller Area Network 控制器局域网,简称CAN或者CAN bus)是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。
- CAN 是异步半双工差分串行通信。
- 它基于消息传递协议(传输的信息里面有对应的标识),设计之初在车辆上复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。
- CAN拥有良好的弹性调整能力,可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外,消息的传递不基于特殊种类的节点,增加了升级网络的便利性。
如图所示:

CAN物理层:
CAN网络节点:

- CAN网络节点发数据:
- 当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器。
- 收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络
- CAN网络节点收数据:
- 而通过收发器接收总线上的数据到控制器时,则是相反的过程。
- 收发器把总线上收到的CAN_High及CAN_Low信号转化成普通的逻辑电平信号。
- 通过CAN_Rx输出到控制器中。
- CAN网络节点发数据:
CAN总线网络:
当CAN线上接入多个设备时,就构成了CAN总线网络。
根据接法不同,总线网络分2种:
- 闭环总线网络
- 开环总线网络
闭环总线网络:

开环总线网络:

CAN通信流程:

差分信号:
CAN_High及CAN_Low中走的是一对差分信号。
传统的单端信号传输:一根信号线一根地线。
差分传输是一种信号传输的技术,差分传输在这两根线上都传输信号,这两个信号的振幅相同,相位相反
信号接收端通过比较这两个电压的差值来判断发送端发送的逻辑状态(高电平还是低电平)。
在电路板上,差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。

- 差分信号优缺点:
- 优点:
- **抗干扰能力强:**干扰噪声一般会等值、同时的被加载到两根信号线上,而其差值为0,即,噪声对信号的逻辑意义不产生影响。
- 能有效抑制电磁干扰(EMI):由于两根线靠得很近且信号幅值相等,这两根线与地线之间的耦合电磁场的幅值也相等,同时他们的信号极性相反,其电磁场将相互抵消。因此对外界的电磁干扰也小。
- 缺点:
- 差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小,走线比较紧张的情况下,给布线带来挑战。
- 差分信号线具有这些优点,在USB协议、RS485协议、以太网协议及CAN协议的物理层中,都使用了差分信号传输。
- 优点:
CAN协议层:
CAN的帧(报文)种类:
- CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。
- CAN使用短报文结构,最大实用负载是94位。报文中没有任何明确的地址;相反,可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定了地址。
- CAN总线上有5种不同的报文类型(或“帧”):数据帧、远程帧、错误帧、过载帧和帧间隔。
- 数据帧:是最常见的报文类型,用于发送单元向接收单元发送数据。
- **远程帧(遥控帧):**用于接收单元向具有相同id的发送单元请求发送数据(请求发送数据)。
- **错误帧:**当检测出错误时向其他单元通知错误的帧。
- **过载帧:**并不常用,因为当今的CAN控制器会非常智能化地避免使用过载帧。
- **帧间隔:**用于将数据帧和遥控帧与前面的帧分离开来的帧。
- 其中错误帧、过载帧、帧间隔都是由硬件自动完成的,没有办法用软件来控制,对于一般使用者来说,只需要掌握数据帧与遥控帧。
- 数据帧和遥控帧有标准格式与扩展格式,标准格式有11位标识符,扩展格式有29位标识符。
数据帧介绍:
标准格式有11位标识符,扩展格式有29位标识符。
标准帧:
帧起始:
- 1bit,显性信号(逻辑0)。
- 表示数据帧(或远程帧)的开始。
- 只能在总线空闲的时候才可以发送帧起始。
仲裁段:(包括两部分)
- 标识符位 ( lD ):
- 长度为11位(11 bits),ID10
ID0。按照ID10ID0的顺序进行传输。 - 是一个功能性的地址,CAN接收器通过标识符来过滤数据帧。
- 不同节点的标识符位是不能相同的。
- 长度为11位(11 bits),ID10
- 远程发送请求位 ( RTR ):
- 长度为1位 (1 bits) 用于区分该帧是数据帧还是远程帧
- 隐性信号 ( 1 ) 代表 远程帧
- 显性信号 ( 0 ) 代表 数据帧
- 标识符位 ( lD ):
控制段:(一共六位)
- IDE位:
- 1位。区分标准格式与扩展格式。
- 显性电平时表示标准格式。
- 隐性电平时表示扩展格式。
- R0位:
- 1位,保留位,以后使用。
- DLC段:
- 4位,表示本报文中的数据段含有多少个字节。
- 用于DLC段表示的数字为0~8。
- IDE位:
数据段:
- 数据帧的核心内容,它是节点要发送的原始信息。
- 由 0~8个字节组成,高位先行。
CRC段:(包含两部分)
- CRC校验码:15位,用于校验输出是否正确。
- CRC界定符:1位,隐性位,表示校验码的结束。
ACK段:(包含两部分)
- ACK确认位:
- 发送端的ACK确认位是隐性位。
- 接收端收到正确的CRC校验位后,把这一位置为显性位。
- ACK界定符:1位,隐性位,用于与后面的帧结束隔开。
- ACK确认位:
EOF段:(帧结束)
7位,表示帧结束,帧结束段由发送节点发送的7个隐性位表示结束。

扩展帧:

- SRR替代远程请求位(RTR),固定就是隐性信号。
- IDE表示扩展帧还是标准帧,18位扩展ID。
- RTR表示数据帧还是远程帧。
- R1、R0 是保留位。
远程帧介绍:
远程帧与数据帧相比没有数据段。


CAN总线仲裁:
- 当CAN总线空闲时,多个单元同时开始发送时,从仲裁段(报文id)的第一位开始进行仲裁。连续输出显性电平(0)最多的单元可以继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。也就是从仲裁段第一位开始比,谁先出现 1 ,谁就输掉总线的竞争。
- 竞争失败,会自动检测总线空闲,在第一时间再次尝试发送。
CAN的位时序:
位同步:
- CAN通讯提出了位同步的方式来确保通讯时序。
- 一帧中包含了很多个位。
- CAN把每1位分为4段(从时间角度划分)
- 同步段(SS:Synchronization Segment)
- 传播时间段(PTS:Propagation Time Segment)
- 相位缓冲段1(PBS1:Phase Buffer Segment 1)
- 相位缓冲段2(PBS2:Phase Buffer Segment 2)
- 4段的总时间段构成了位时间(Bit Time),就是传输一个位所需的总时间。
- 位时间通常被分为若干等长的时间单元,称为时间量化器(Time Quanta, Tq)
- 一个Tq的长度可以根据传输速率的需要设置。
- 在STM32的CAN外设中,通过设置波特率分频器的值来确定Tq的大小。
- 同步段:(SS)
- SS 段的大小固定为 1Tq
- 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的。
- 传播时间段:(PTS)
- CAN总线上数据的传输会受到各种物理延迟。
- 比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。
- PTS 段就是用来补偿这些因素产生的时间延迟。
- PTS段长度至少为1个Tq。一般 1-8 Tq。
- 相位缓冲段1:(PBS1)
- 主要用来补偿边沿阶段的误差。
- 它的时间长度在重新同步阶段的时候可以被自动加长。
- PBS1段的初始大小可以为 1~8 Tq。
- 相位缓冲段2:(PBS2)
- 另一个相位缓冲段,也是用来补偿边沿阶段误差的。
- 它的时间长度在重新同步阶段时可以缩短。
- PBS2 段的初始大小可以为 2~8 Tq。
- 采样点:
- 采样点位于PBS1和PBS2的交界处。

数据同步:
- 根据同步方式差异,CAN 的数据同步分为硬同步和再同步。
- 硬同步:
- 当一个节点检测到起始位时,它会执行硬同步,以便将其内部的时间基准与数据帧的时间基准对齐。
- 在硬同步过程中,控制器的时间基准会立即调整为与检测到的边沿对齐。
- 再同步:
- 在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围),通过延长 PBS1 段或缩短 PBS2 段,来获得同步
- 所有的同步都是由CAN控制器硬件自动完成的
CAN的波特率:
- 各个通讯节点约定好 1 个 Tq 的时间长度以及每一位占据多少个 Tq,就可以确定 CAN 通讯的波特率。

CAN的位填充:
- 位填充(Bit Stuffing)是用于确保数据同步和错误检测关键机制。它的主要作用是避免长时间连续相同的位电平,从而帮助接收节点正确识别数据帧的起始、结束及数据内容。
- 填充规则:连续出现5个相同电平的位后,插入 1 个反向位。
- 原始数据:
11111→ 填充后:111110(第 6 位插入0)。 - 原始数据:
00000→ 填充后:000001(第 6 位插入1)。
- 原始数据:
- 在数据帧和遥控帧的特定字段中(从 SOF(帧起始) 到 CRC 序列 之间)才会进行填充。
- 硬件自动完成,对软件透明,不影响应用层开发。
STM32中的CAN外设:
STM32的芯片中具有bxCAN控制器(Basic Extended CAN),它支持CAN协议2.0A 和2.0B Active标准。
CAN控制器的3种工作模式:
CAN控制器有3种工作模式:初始化模式、正常模式、睡眠模式

上电复位后CAN控制器默认会进入睡眠模式,作用是降低功耗。当需要将进行初始的时候,通过配置寄存器相应的位,使其进入初始化模式。当需要通讯的时候,需要进入正常模式。
CAN控制器的3种测试模式:
CAN控制器有3种测试模式:静默模式、环回模式、环回静默模式。当控制器进入初始化模式的时候才可以配置测试模式。



静默模式可以用于检测总线的数据流量。
环回模式可以用于自检(影响总线)。
环回静默模式也是用于自检,不会影响到总线。
功能框图:双CAN框图(互联型产品)

主动内核:
- 含各种控制/状态/配置寄存器,可以配置模式、波特率等,在STM32CubeMx中可以非常方便的配置。
发送邮箱:
- 用来缓存待发送的报文,最多可以缓存3个报文。
- 发送调度决定报文的发送顺序。
接收FIFO:
- 共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。
接收滤波器(过滤器):
作用:对接到的报文进行过滤,最后放入FIFO 0或FIFO 1。
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。
有2种过滤模式:
- 标识符列表模式:它把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
- 掩码模式(屏蔽位模式):它把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收FIFO。
如果使能了过滤器,且报文的ID与所有过滤器的配置都不匹配,CAN外设会丢弃该报文,不存入接收FIFO。
每个CAN提供了14个位宽可变的、可配置的过滤器组(13~0)。每个过滤器组x由2个32位寄存器,CAN_FxR1和 CAN_FxR2组成。

说明:
- 当工作于32位屏蔽位模式时,FR1保存标识符,FR2保存屏蔽。FR2某位是1表示来的ID的这位必须和FR1中对应的位一致,FR2某位是0,表示ID的这位不关心。
- 当工作于32位标识符模式时。FR1和FR2分别保存两个标识符。这意味着将来只有两个ID会匹配成功。
STM32中 CAN的位时序:
STM32 外设定义的位时序与我们前面解释的 CAN 标准时序有一点区别。
标准时序:

STM32的位时序:把传播时间段和相位缓冲段1做了合并。
