3. CAN物理层原理

3.1 为什么需要分层?

很多刚接触CAN总线的朋友,上来就盯着帧格式看。我个人习惯是先搞清楚协议的分层结构。你想想看,一个数据从发送节点到接收节点,中间要经过多少环节?

CAN协议参考了OSI七层模型,但实际只实现了两层:物理层和数据链路层。上层应用协议(比如CANopen、J1939)则是在这两层之上构建的。

核心观点:CAN协议的分层设计,把「怎么传」和「传什么」分开了。物理层管信号,数据链路层管帧。这样上层应用不用关心底层细节。

3.2 CAN协议分层模型

我画了一张分层模型图,你看一眼就明白了:

CAN协议分层模型 应用层(Application Layer) CANopen / J1939 / DeviceNet 等 数据链路层(Data Link Layer) LLC子层:帧过滤、报文管理 MAC子层:帧封装、仲裁、错误检测 PLS子层:位编码/解码、位时序 物理层(Physical Layer) PMA子层:收发器、差分信号 MDI子层:连接器、电缆 CAN 总线(双绞线) 软件实现 硬件实现 CAN控制器(数据链路层) + CAN收发器(物理层) = 标准节点硬件方案

这张图里,我特意把数据链路层拆成了三个子层。为什么?因为实际项目中,你调试CAN总线时遇到的问题,往往就出在某个子层上。

3.3 数据链路层与物理层的关系

这两层的关系,说白了就是「约定」与「实现」。

  • 物理层:负责把0和1变成总线上的差分电压。它不管这些位是什么意思,只保证「发出去」和「收进来」。
  • 数据链路层:负责把位组合成帧,做仲裁、校验、应答。它不关心电压是多少伏,只关心位流对不对。

我的经验:有一次项目里CAN通信偶尔丢帧,我查了三天应用层代码,最后发现是物理层的问题——收发器的共模电压范围不够。从那以后,我调试CAN总线总是先确认物理层是否正常。

数据链路层内部又分三个子层:

子层 全称 职责 我遇到过的坑
LLC 逻辑链路控制 帧过滤、报文管理、恢复通知 验收滤波配置错了,该收的没收
MAC 介质访问控制 帧封装、仲裁、错误检测、应答 位填充规则没搞懂,调试时一脸懵
PLS 物理信令 位编码(NRZ)、位时序、同步 波特率偏差导致同步失败

你可能会问:为什么要把PLS放在数据链路层而不是物理层?嗯,这个问题我当年也困惑过。后来想明白了——位编码和位时序是逻辑层面的东西,跟具体的收发器硬件无关。NRZ编码、位填充这些,都是MAC层和PLS层配合完成的。

3.4 CAN2.0A 与 CAN2.0B 的区别

这是面试高频题,也是实际选型时必须搞清楚的问题。

CAN2.0A 是1991年的标准,定义了11位标识符的标准帧。CAN2.0B 是1995年的扩展,引入了29位标识符的扩展帧。

我直接列个对比表:

对比项 CAN2.0A(标准帧) CAN2.0B(扩展帧)
标识符长度 11位 29位(11位基础ID + 18位扩展ID)
IDE位 显性(0) 隐性(1)
帧长度 较短,实时性好 较长,标识符空间大
兼容性 CAN2.0B节点可收标准帧 CAN2.0A节点无法收扩展帧
典型应用 简单系统、实时控制 复杂系统、多节点网络

注意:CAN2.0B控制器可以发送和接收标准帧,但CAN2.0A控制器无法处理扩展帧。选型时如果网络中有老节点,必须确认兼容性。

我记得有一次做车载项目,客户要求用CAN2.0B扩展帧。结果有一批ECU用的是老款CAN控制器,只支持CAN2.0A。那批ECU看到扩展帧就直接报错,整个网络乱套了。后来全部换成支持CAN2.0B的控制器才解决。

还有一个容易忽略的点:扩展帧的仲裁场更长。标准帧仲裁场只有12位(11位ID + RTR),扩展帧有32位(11位基础ID + SRR + IDE + 18位扩展ID + RTR)。这意味着扩展帧的仲裁时间更长,对总线实时性有影响。

3.5 如何区分标准帧和扩展帧?

看帧起始后的第一个控制位——IDE位(Identifier Extension Bit)。

  • IDE = 0(显性):标准帧,后面直接跟RTR位
  • IDE = 1(隐性):扩展帧,后面还有18位扩展ID

实际抓波形时,我习惯先看IDE位。如果IDE位是显性,那就是标准帧,11位ID之后就是控制场和数据场。如果是隐性,那就是扩展帧,29位ID要分两段解析。

一句话总结:CAN2.0A是基础版,CAN2.0B是升级版。升级版向下兼容,但老设备用不了新功能。选型时别只看成本,要考虑整个产品生命周期。

3.6 实际项目中的选择建议

我个人建议:

  1. 新项目一律选CAN2.0B控制器。成本差不了几块钱,但扩展帧的灵活性是标准帧比不了的。
  2. 如果网络中有CAN2.0A节点,只能用标准帧通信。扩展帧会被老节点当成错误帧处理。
  3. 标识符规划要留余地。11位ID最多2048个可用标识符(去掉保留位),29位ID有5亿多个。但别以为空间大就可以乱用,ID分配还是要按功能分组。
  4. 实时性要求高的场合,优先用标准帧。帧短,总线占用时间少,延迟更低。

嗯,这一章的内容就这些。分层模型是理解CAN协议的基础,物理层和数据链路层的关系要搞清楚,CAN2.0A和CAN2.0B的区别要记牢。后面讲帧格式时,你会反复用到这些概念。