CAN通信
参考文档
一、CAN总线结构
没有时钟线,半双工异步通信,CAN总线上的所有节点没有主从之分。任何节点都可以在总线空闲时主动向总线上发送消息,灵活性极高。
CAN总线网络的结构有闭环和开环两种形式。
下图所示,是闭环结构的CAN总线网络,总线两端各连接一个120欧的电阻,两根信号线形成回路。这种CAN总线网络由ISO 11898标准定义,是高速、短距离的CAN网络,通信速率为125kbit/s到1Mbit/s。在1Mbit/s通讯速率时,总线长度最长达40m。

下图是开环结构的CAN总线网络,两根信号线独立,各自串联一个2.2k欧的电阻。这种CAN总线网络由ISO11519-2标准定义,是低速、远距离的CAN网络,通信速率最高125kbit/s。在40kbit/s速率时,总线最长距离可达1000m。

CAN总线的两根信号线通常采用的是双绞线,如下图4所示,传输的是差分信号,通过两根信号线的电压差CANH-CANL来表示总线电平。以差分信号传输信息具有抗干扰能力强,能有效抑制外部电磁干扰等优点,这也是CAN总线在工业上应用广泛的一个原因。
与传输的逻辑信号1或0对应。对应于逻辑1的称为隐性电平,对应于逻辑0成为显性电平。
上半部分为实际CANH和CANL的电平,下半部分对于的逻辑电平

CAN总线上的一个终端设备称为一个节点,在CAN网络中,没有主设备和从设备的区别。一个CAN节点的硬件部分一般由CAN控制器和CAN收发器两个部分组成。CAN控制器负责CAN总线的逻辑控制,实现CAN传输协议;CAN收发器主要负责MCU逻辑电平与CAN总线电平之间的转换。
线与逻辑:CAN总线具有“线与”的特性,也就是当由两个节点同时向总线发送信号时,一个是发送显性电平(逻辑0),另一个发送隐性电平(逻辑1),则总线呈现为显性电平。这个特性被用于总线总裁,也就是哪个节点优先占用总线进行发送操作。

二、波特率
三、CAN各类型帧
3.1 数据帧
主动发送包含ID和数据的帧,用于**发送单元 **向 接收单元 传送数据的帧。
1. 标准数据帧
- ID长度:11位标识符
- ID范围:2的11次方 = 2048个不同的报文ID
- 仲裁场结构:11位ID+RTR位
- IDE状态:显性(0),位于控制场
- SRR位:不存在
- 优先级规则:只比较11位ID,ID值越小优先级越高
- 兼容性:所有CAN控制器

2. 扩展数据帧
ID长度:29位标识符(11位基ID 和 新增的18位扩展ID)
ID范围:2的29次方 = 5.36亿个不同的报文ID
仲裁场结构:11位ID+SRR位+IDE位+18位扩展ID+RTR位
IDE状态:隐性(1),位于仲裁
SRR位:隐性(1),取代了标准帧中RTR的位置
优先级规则:先比较11位基ID,再比较18位扩展ID,ID值越小优先级越高
兼容性:仅CAN 2.0B主动控制器完全支持

3. 标准数据帧与扩展数据帧的优先级
假设有一个标准帧(ID=0x123)和一个扩展帧(基ID=0x123)。
- 它们开始同时发送各自的ID。
- 前11位(0x123)完全相同,无法分出胜负。
- 接下来,标准帧要发送的是RTR位(显性0),而扩展帧要发送的是SRR位(隐性1)。
- 根据“显性覆盖隐性”的规则,**显性 (0) 赢得隐性 (1)**。
- 因此,标准帧赢得了仲裁,优先级更高。
结论:一个标准数据帧总是会优先于一个具有相同11位基ID的扩展数据帧。
3.2 遥控帧(远程帧)
请求数据,向网络上的其他节点发出的某个ID的数据请求,发送节点收到 遥控帧 后就可以发送相应ID的数据帧
1. 标准遥控帧
ID长度:11位标识符
ID范围:2的11次方 = 2048个不同的报文ID
仲裁场结构:11位ID+RTR位
RTR位:隐性(1)
IDE状态:显性(0),位于控制场
SRR位:隐性(1),取代了标准帧中RTR的位置
数据场:无
DLC字段的作用:指定希望收到的数据帧的数据长度
优先级规则:只比较11位ID,ID值越小优先级越高

2. 扩展遥控帧
ID长度:29位标识符(11位基ID 和 新增的18位扩展ID)
ID范围:2的29次方 = 5.36亿个不同的报文ID
仲裁场结构:11位ID+SRR位+IDE位+18位扩展ID+RTR位
RTR位:隐性(1)
IDE状态:隐性(1),位于仲裁场
SRR位:隐性 (1),取代了标准帧中RTR位的位置
数据场:指定希望收到的数据帧的数据长度
DLC字段的作用:指定希望收到的数据帧的数据长度
优先级规则:先比较11位基ID,ID值越小优先级越高

3. 标准遥控帧和扩展遥控帧的仲裁
规则与数据帧一致。
- 前11位(基ID)完全相同。
- 接下来,标准遥控帧发送RTR位(隐性1),扩展遥控帧发送SRR位(隐性1)。两者都是1,无法分出胜负。
- 再下一位,标准帧要发送IDE位(显性0),而扩展帧要发送的也是IDE位(但它是隐性1)。
- 根据“显性覆盖隐性”的规则,**显性 (0) 赢得隐性 (1)**。
- 因此,标准遥控帧赢得了仲裁,优先级更高。
结论:一个标准遥控帧总是会优先于一个具有相同11位基ID的扩展遥控帧
3.3 错误帧
当总线上任何节点检测到任何一种错误时,它不会保持沉默,而是会立即、主动地发送一个错误帧来打断当前正在进行的数据传输,并通知网络上的所有节点:“刚收到的报文有错误!”

主动错误
由检测到错误且错误状态为“主动错误” 的节点发出
这个显性位序列会强烈地破坏总线上正在传输的报文格式(因为正常报文中不可能出现6个连续的显性位),从而确保所有节点都能意识到错误的发生。
被动错误
由检测到错误但错误状态为“被动错误” 的节点发出
如果此时总线上没有其他节点发送主动错误标志(即没有“主动错误”节点检测到错误),这个被动错误标志将不会影响总线传输,因为它会被其他节点发送的显性位覆盖。
错误帧是如何被触发的?
- 位错误
- 填充错误
- CRC错误
- 格式错误
- 应答错误
3.4 过载帧
过载帧 是由接收节点 主动 发出的特殊帧,其目的是为了人为地插入额外的延迟,从而向网络中的其他节点宣告:“我目前太忙了,还没来得及处理上一帧数据,请稍微慢一点,等我准备好再发送下一帧。”

3.5 帧间空间
用于将数据帧、遥控帧与**前后的帧 ** 分隔 开的帧
四、工作模式

1. 正常模式
CAN 模块进行标准通信的模式
可以正常地发送和接收报文,CANTX发送的数据也会发给CANRX
节点可以输出显性电平(逻辑0)来仲裁或应答,从而影响总线状态。
数据流:既处理内部产生的发送数据,也处理从总线接收到的数据。
2. 静默模式
主要用于监听或分析总线流量,而不以任何方式干扰总线
只接收,不发送:可以接收到总线上的报文,并能产生正确的接收中断、更新接收错误计数器等。
不影响总线:节点的发送端只能输出隐性位(逻辑1)。这意味着:
- 它无法成功发送报文(因为无法产生显性位来开始帧、进行仲裁或应答)。
- 它不会破坏总线上其他节点之间的通信。即使它尝试发送,也只会发送一连串的“1”,而其他正常节点发送的“0”会覆盖这个“1”,因此总线不受影响。
数据流:只处理从总线接收到的数据。发送路径被有效禁用。
3. 环回模式
自己发送,自己接收:节点内部将发送端输出直接反馈到接收端输入
与外部总线隔离:在此模式下,CAN 控制器忽略来自外部 CAN 收发器的实际 RX 信号。它只处理自己内部环回的数据。
- 可以影响总线(注意!):虽然它自己不听总线,但它的发送引脚 (TX) 仍然会正常工作,将报文发送到外部收发器上,从而影响物理总线。这是与环回静默模式的关键区别。
数据流:发送的数据同时被内部环回和发送到物理总线上。
4. 环回静默模式
这是环回模式和静默模式的结合,实现了完全的自测试,且与外部总线完全隔离。
自己发送,自己接收:与环回模式相同,内部进行自发自收。
与外部总线完全隔离:与静默模式相同,节点的 TX 引脚只能输出隐性位(逻辑1)。因此,它不会对外部物理总线造成任何影响。
同时,它也忽略外部总线的信号。
五、过滤器
1. 掩码和ID
过滤器的作用就是进行硬件层面的预处理,只允许那些与预设规则匹配的报文进入接收FIFO并产生中断,其他报文被硬件直接丢弃,从而极大地减轻CPU的负担。
- 过滤器ID (Filter ID): 你希望匹配的期望值。
- 过滤器掩码 (Filter Mask): 决定ID中的哪些位必须严格匹配,哪些位“我不关心”(don’t care)。
- 掩码位 = 1: 表示“必须匹配”。对应ID位必须与收到的报文ID位一致。
- 掩码位 = 0: 表示“不关心”。对应ID位无论是0还是1,都允许通过。
2. 两种工作模式

- 标识符列表模式
掩码被当作第二个完整的ID来使用。在这种模式下,过滤器只精确匹配你设置的少数几个特定ID。
示例:你设置:
过滤器ID = 0x123
过滤器掩码 = 0x456
(在此模式下,它被视为另一个ID)
那么控制器只接收ID恰好为 0x123
或 恰好为 0x456
的报文。
能设置的ID数量少。相当于“白名单”模式
- 掩码模式
真正的掩码模式。掩码定义了ID中需要匹配的位。
示例:你希望接收所有ID在 0x5A0
(0101 1010 0000)到 0x5AF
(0101 1010 1111) 范围内的标准帧报文(即低4位任意)。
过滤器ID 设置为 0x5A0
(二进制 0101 1010 0000
)
过滤器掩码 设置为 0x7F0
(二进制 0111 1111 0000
)
解释:
掩码的高7位是 1
,这意味着标准ID的最高7位(11位ID中的高7位)必须与 0x5A0
的高7位(即 0x5A
)完 全匹配。
掩码的低4位是 0
,这意味着低4位可以是任意值(0x0到0xF)。
结果:此过滤器将允许ID为 0x5A0
, 0x5A1
, 0x5A2
, … 0x5AF
的报文通过。
可以用一个过滤器规则匹配一组ID