STM32学习和实践笔记(43):CAN通信实验(1)
1.CAN总线介绍
CAN 是Controller Area Network 的缩写,中文意思是控制器局域网络,是ISO国际标准化的串行通信协议。它是德国电气商博世公司于1986年面向汽车而开发的CAN 通信协议。
此后,CAN 通过ISO11898 及ISO11519 进行了标准化。CAN是国际上应用最广泛的现场总线之一,在欧洲已是汽车网络的标准协议。
CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
CAN通信只具有两根信号线,分别是CAN_H和CAN_L,CAN 控制器根据这两根线上的电位差来判断总线电平。
总线电平分为显性电平和隐性电平,二者必居其一。
发送方通过使总线电平发生变化,将消息发送给接收方。
(什么是显性电平和隐性电平?
在CAN通信中,隐性电平和显性电平是两种不同的逻辑状态,它们通过CAN_H和CAN_L两线之间的差分电压,来表示不同的逻辑值。
隐性电平(Recessive Level) : 隐性电平代表逻辑“1”。 在总线空闲或发送隐性位时,CAN_H和CAN_L的对地电压都约等于2.5V,两条线之间的电压差为0V 。 当所有节点都输出隐性电平时,总线上即为隐性电平 。 隐性电平具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平 。很明显,只有所有节点的CAN_H和CAN_L都输出2.5V时,总线上两线之电压差才为0.
显性电平(Dominant Level) : 显性电平代表逻辑“0”。 当某个节点要发送信号时,会将CAN_H的电压拉高到约3.75V左右,将CAN_L的电压拉低到约1.25V左右,这样两条线之间的电压差为2.5V 。 在总线上执行逻辑上的“与”运算时,显性电平的逻辑值为“0”,隐性电平为“1” 。 “显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平 。
这个显与隐可以这样记忆:显是显示出来,无论有多少个1,只要他们与0相与,那么结果就将为0.所以,0是很容易在众多个1中显示出来的,所以显示电平,表示逻辑0.
总结来说,隐性电平和显性电平是CAN通信中的两种基本电平状态。隐性电平对应逻辑“1”,当所有节点都输出隐性电平时,总线才表现为隐性电平;而显性电平对应逻辑“0”,当至少有一个节点输出显性电平时,总线表现为显性电平。这种设计使得CAN总线具有很强的抗干扰能力,并能有效保证通信的可靠性)
CAN协议特点:
(1)多主控制。
多主控制,是指多个节点都可以作为主机来使用总线。优先级是根据各节点的ID号来决定的。
(前面学的RS485,传统上一般是一主多从模式。即整个系统中只有一个主节点负责轮询各个从节点以实现通信。但是现代技术,也已经能够使用RS485,支持并实现多主多从模式。)
CAN协议的多主控制是其核心设计思想之一,它构建了一种去中心化的网络架构。为了让你快速把握其与传统主从模式的核心区别,请看下表:
| 对比维度 | 传统主从模式 (如Modbus RTU) | CAN多主控制模式 |
|---|---|---|
| 控制权 | 集中于主设备,存在单点故障风险 | 分散于所有节点,无单一控制中心 |
| 通信发起 | 只能由主设备发起,从设备被动响应 | 任何节点在总线空闲时均可主动发起通信 |
| 故障影响 | 主设备故障可能导致整个网络瘫痪 | 单个节点故障不影响其他节点通信,可靠性高 |
| 灵活性 | 增加或减少从设备需重新配置主设备 | 新增节点可直接接入,无需修改现有节点软硬件 |
🔌 工作原理与仲裁机制
多主控制的实现,依赖于两个关键机制:“载波侦听” 和“非破坏性位仲裁”。
-
载波侦听(CSMA):在发送消息前,每个节点都会持续检测总线状态。只有当总线处于空闲状态(表现为连续的“隐性”位,即逻辑1)时,节点才会尝试开始发送消息。这就像十字路口的司机,都要先观察路面是否空旷再决定是否通过。
-
非破坏性位仲裁(NDBA):当多个节点恰好同时开始发送时,冲突如何解决?CAN协议通过仲裁机制优雅地处理了这一点。在传输消息的标识符(ID) 段时,所有节点会一边发送自己的ID位,一边读取总线上的实际电平。
-
CAN总线采用“线与”逻辑:显性位(逻辑0)会覆盖隐性位(逻辑1)。
-
这意味着,ID值越小(其二进制表示中前导0越多),优先级越高。当某个节点发送一个隐性位(1),但检测到总线上是显性位(0)时,它立即意识到有更高优先级的消息正在发送,于是主动停止发送并转为接收模式,等待总线空闲后自动重试。(漂亮!!)
-
关键优势:这个仲裁过程发生在瞬间,高优先级的消息不受任何影响,仿佛没有发生冲突一样继续传输,保证了总线带宽的高效利用和关键数据的实时性。
-
💡 为何需要多主控制?
这种设计主要是为了满足汽车、工业控制等场景对高可靠性和强实时性的苛刻要求。
-
提升可靠性:没有“主节点”这个单一故障点。任何一个节点(比如车窗控制器)失效,都不会影响发动机控制、刹车系统等关键节点之间的通信,系统容错能力极强。
-
保证实时性:紧急消息(如碰撞检测信号)可以赋予最高优先级(最小的ID),确保其总能立即获得总线使用权,几乎无延迟地送达,这对于安全至关重要。
-
增强灵活性:系统扩展变得非常简单。增加新功能或新节点时,只需将其接入总线即可,无需改动网络中原有的任何其他节点。
总而言之,CAN的多主控制机制通过巧妙的仲裁规则,在实现去中心化、高可靠性的同时,也确保了高优先级数据的实时传输能力,这是它成为汽车和工业领域主流总线技术的关键原因之一。
(2)系统的柔软性。
这是指挂接在can总线上的各节点,并没有像前面的IIC一样,每个器件有一个地址码。
CAN协议的“系统柔软性”是其核心设计优势之一,它主要描述了系统在增加或减少节点时的高度灵活性和便捷性。简单来说,这意味着当您需要扩展或调整一个基于CAN总线的网络时,无需修改现有节点的硬件或软件,新节点可以直接接入总线并开始通信。
为了更直观地理解它与传统总线架构的区别,请看下表:
| 对比维度 | 传统总线(如主从式RS-485) | CAN总线 |
|---|---|---|
| 寻址方式 | 依赖唯一的硬件节点地址(如从机地址1、2、3...) | 基于消息标识符(ID),标识消息内容和优先级,与发送节点“地址”无关 |
| 添加新节点 | 必须为新增节点分配一个未被占用的唯一地址,并可能需要配置主机以识别该地址,改动较大。 | 新节点只需接入总线,并配置好与总线相同的通信速率即可。只要其发送的消息ID是唯一的,就能正常收发数据。 |
| 数据流动 | 通常为主设备轮询从设备,通信路径固定。 | 多主控制,任何节点可在总线空闲时主动发送数据,支持广播,使数据流动更灵活。 |
💡 柔软性的核心:基于消息标识符的通信
这种柔软性的根源在于CAN协议废除了传统的“站地址”概念。在大多数总线中,每个设备都有一个独一无二的地址,通信时需要指定目标地址。
而CAN协议采用了一种基于消息内容的标识符(ID)。这个ID并不代表消息要发送到哪个节点,而是标识了消息本身的含义和优先级。例如,一个ID可能代表“发动机转速”,另一个ID代表“车门开关状态”。任何需要“发动机转速”数据的节点,都会去接收并处理这个特定ID的消息。
这种方式带来了两大关键好处:
-
即插即用:新增一个传感器节点时,您只需确保它发送的消息ID在网络中是唯一的,且其通信速率与总线一致即可。其他需要该数据的节点会自动接收,完全不需要为它分配地址或修改现有节点的程序。
-
数据共享高效:一条消息(如“车速”)可以被多个需要它的节点(如仪表盘、ABS系统、发动机控制器)同时接收,实现了高效的数据广播,非常适合分布式控制系统。
🛠️ 实际应用中的体现
这种柔软性在以下场景中价值巨大:
-
系统扩容:在工业生产线中,若要增加一个温度监测点,只需将新的温度传感器接入CAN总线,并让其报告一个唯一的温度消息ID。原有的控制器和显示单元无需任何改动就能获取这个新数据。
-
功能升级:在汽车电子中,为高端车型增加一个新功能(如盲区监测),只需将相应的控制单元接入现有的CAN网络。它可以通过广播消息与其他系统(如车身控制器、仪表盘)进行交互,而无需改动这些现有系统的基础配置。
💎 总结
总而言之,CAN协议的“系统柔软性”特点使其成为一种非常模块化和易于扩展的通信解决方案。它通过基于消息ID的通信模式,实现了节点的“即插即用”,极大地降低了系统集成、维护和升级的复杂性。这正是它在汽车、工业自动化等需要高度灵活性的领域备受青睐的重要原因之一。
(3)通信速度较快,通信距离远。
在5Kbps的速度下,距离可以达到10公里!
CAN总线的通讯速度和通讯距离之间确实存在一个非常明确的反比关系,这是其物理特性决定的。简单来说,通讯速度越高,有效的通讯距离就越短;反之,若要传得更远,就必须降低速度。
下表清晰地展示了在不同通讯速率下,CAN总线典型的最大无中继传输距离 。
| 通讯速率 (kbps) | 最大通讯距离 (米) | 典型应用场景 |
|---|---|---|
| 1000 | 约 40 | 汽车动力系统(发动机、ABS等),工业实时控制 |
| 500 | 约 130 | 工业自动化、车身控制 |
| 250 | 约 270 | 工业网络、车辆诊断 |
| 125 | 约 530 | 低速容错CAN,车身舒适系统(车窗、座椅) |
| 100 | 约 620 | |
| 50 | 约 1300 (1.3公里) | |
| 20 | 约 3300 (3.3公里) | |
| 10 | 约 6700 (6.7公里) | |
| 5 | 约 10000 (10公里) | 超长距离低速监测 |
🔧 核心原理:为何速度与距离不可兼得?
这种反比关系主要由两个物理层面的因素决定:
-
信号衰减与畸变:电信号在导线中传输时,会随着距离的增加而逐渐减弱(衰减),并且由于线路的电容和电感效应,信号的波形会变得圆钝(畸变)。速率越高,信号变化的频率就越快,波形越容易失真。当传输距离过长时,失真会变得严重,导致接收端无法正确识别“0”和“1” 。
-
位定时同步:CAN总线上的所有节点需要保持同步,以便在正确的时刻采样数据位。总线长度增加意味着信号从发送端到接收端的传播延迟也会增加。在高速通信时,这个延迟可能占据一个位宽(bit time)的相当大部分,留给各个节点调整同步的余量就非常小,容易造成采样错误 。
因此,为了保证通信的可靠性,在长距离传输时,必须降低速率,给信号衰减和传播延迟留出足够的容错空间。
💡 工程实践中的要点与对策
了解这一关系后,在实际项目中需要注意以下几点:
-
确定实际需求:首先明确你的项目对实时性(速度) 和覆盖范围(距离) 哪个要求更高。例如,控制机器人关节需要高速短距离,而监控分布式农田传感器则可能需要低速长距离。
-
遵守布线规范:为了最大限度保证信号质量,应使用特性阻抗约为120Ω的双绞线,并在总线的最远两端各并联一个120Ω的终端电阻,以消除信号反射 。
-
突破距离限制:如果项目既需要高速度,又需要长距离,单段CAN总线无法满足。此时可以使用中继器(Repeater) 或 CAN网关(Gateway) 将长距离分割成几个较短的网段,或者在CAN总线和其他适合长距离的通信方式(如光纤、以太网)之间进行转换 。
💎 总结
总而言之,CAN总线的通讯速度与距离是此消彼长的关系,这是其物理特性决定的。在设计系统时,您需要根据实际应用场景在速度和距离之间做出权衡,并遵循正确的布线规范。对于极端的需求,可以通过添加网络设备来扩展能力。
(4)具有错误检测、错误通知和错误恢复功能。
所有节点,都有错误检测功能,一旦检测到错误,即通知所有节点。而正在发送的节点会停止当前发送而重新发送,直到重新发送成功为止。
(5)故障封闭功能。
是指故障是完全分类的,不存在不可识别的故障。
(6)连接节点多。
这与通讯速度有关。节点越多,速度越慢。
高速can协议可挂最多30个设备。
低速can协议最多可挂20个设备。
CAN 已通过ISO11898 及ISO11519 进行了标准化,这两种标准在物理层的主要不同点如图


开发板上使用ISO11898版本讲解。
对ISO11898,隐性时,两根线上电压都为2.5V,所以其标准电压差是0,这表示逻辑1.
显性时,CAN_High为3.5V,CAN_Low为1V,所以两线的标准电压差是2.5V,这表示逻辑0
CAN总线能够实现“显性电平覆盖隐性电平”,进而实现优雅的总线仲裁,主要依赖于其独特的硬件电路设计(“线与”逻辑)和协议规则(非破坏性仲裁机制)。
简单来说,您可以把它想象成一场“礼貌的抢答”:很多人可以同时举手,但一旦看到有人举得更高(显性电平),其他人就会立刻放下手,让那位举得最高的人发言,整个过程没有争吵和混乱。
下面这个表格清晰地展示了实现这一功能的关键基础:
| 关键要素 | 具体说明 |
|---|---|
| 物理逻辑 | “线与”逻辑:总线上的所有CAN收发器输出端是并联的,形成类似“线与”的关系。 |
| 电平定义 | 显性电平 (逻辑0):差分电压 > 0.9V(典型值2V),优先级高。 |
| 电路特性 | 显性电平(逻辑0)在电路上表现为主动驱动到低电平,如同“强力下拉”。而隐性电平(逻辑1)则表现为高阻态(释放总线),仅靠终端电阻拉回。 |
💡 工作机制详解
基于以上基础,其工作流程如下:
-
硬件基础:“线与”连接
所有连接到CAN总线上的节点的CAN_H和CAN_L线分别是并联在一起的。这意味着任何一个节点都可以主动地将总线拉到一个确定的电平上。
-
“覆盖”的瞬间:显性电平的主导作用
当总线处于隐性状态(所有节点都输出1)时,差分电压为0V。此时,如果有任何一个节点开始发送显性电平(0),它的收发器内部的晶体管会导通,将CAN_H拉向高电压(如3.5V),将CAN_L拉向低电压(如1.5V),从而产生一个约2V的差分电压。
由于是“线与”连接,这个强制的低电平(0)会覆盖掉其他节点试图维持的高电平(1)。从电路上看,就好像是“接地”的力量战胜了“上拉”的力量。因此,整个总线会立即呈现出显性电平状态。
-
协议保障:非破坏性仲裁
这一物理特性被CAN协议巧妙地用于解决多节点同时发送的冲突,即“仲裁”。
-
每个节点在发送每一位数据的同时,也在回读总线上的实际电平。
-
仲裁发生在数据帧的标识符(ID)段。ID值越小(其二进制表示前导0越多),优先级越高。
-
当两个节点同时发送时,它们会从ID的最高位开始逐位比较。如果某个节点发送的是隐性位(1),但回读到的却是显性位(0),它就会立即停止发送,并转为接收模式。
-
由于这个退出操作是瞬间完成的,获胜节点(发送显性位的一方)的发送流不会受到任何干扰,可以继续完成整个报文的传输。这就是“非破坏性”的含义——仲裁过程不会损坏高优先级的数据。
-
💎 总结
所以,CAN总线通过其收发器的硬件设计,使得显性电平(0)在电路层面具备强制覆盖隐性电平(1)的能力。这一特性与协议层的实时回读和仲裁规则相结合,共同实现了高效、无冲突的多主通信。这正是CAN总线高可靠性和实时性的基石之一。
CAN总线具有多节点可组网特性,其网络拓扑结构如下所示:节点2到节点N,与节点1有完全相同的结构。

(开发板上使用的CAN收发器是TJA1040)

CAN 通信主要是通过 5 种类型的帧进行,分别是数据帧、遥控帧、错误帧、过载帧和帧间隔。各种帧的用途如图:

以下只详细说明了5种类型中的数据帧。其余帧的构成参考其它资料。
数据帧的构成如图:

D:显性电平
R:隐性电平
①.帧起始是由 1 个位的显性电平表示,标准帧和扩展帧相同。
②.仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图

③.控制段由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图

④.数据段,该段可包含 0~8 个字节的数据。从MSB(最高位)开始输出,标准帧和扩展帧此段相同。如图

⑤.CRC 段,该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成,标准帧和扩展帧此段也是相同的。如图

⑥.ACK 段,此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。标准帧和扩展帧此段也是相同的。如图:

⑦.帧结束,它表示该帧的结束的段,由 7 个位的隐性位构成。标准帧和扩展帧此帧是相同的。如图

CAN 的位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。
一个位可分为 4 段,分别是:
· 同步段( SS)
· 传播时间段( PTS)
· 相位缓冲段 1( PBS1)
· 相位缓冲段 2( PBS2)
这些段又由可称为 Time Quantum(Tq)的最小时间单位构成。
所以1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
(这就与我们平时理解的位不一样了。通常我们理解的位,都是高电平表示1,低电平表示0,但这里的位,构成要复杂得多)
1 个位的构成如下图所示:

其中,采样点是指读取总线电平的点。读到什么值,就认为这一位(这一bit)值是高还是是低。
CAN 协议的仲裁功能
在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。仲裁的过程如图:

以上是关于CAN总线的通用介绍。下面讲的是STM32里的CAN总线的结构实现。
