2. CAN总线基础:CAN 2.0与CAN FD的物理层、数据链路层详解

好,咱们开始聊CAN总线。说实话,CAN总线是我职业生涯里打交道最多的通信协议之一。从早期的车身控制到现在的域控制器,它几乎无处不在。这一章,咱们就把它最核心的物理层和数据链路层掰开揉碎了讲清楚。

2.1 物理层:信号是怎么在线上跑的?

物理层,说白了就是电信号怎么在两根线上传输。你想想看,车里环境那么嘈杂,电机、点火线圈各种干扰,CAN总线凭什么还能稳定通信?

核心秘密在于差分信号。CAN总线用两条线:CAN_H和CAN_L。它不测单根线的电压,而是看两根线的电压差。

显性电平(Dominant):CAN_H比CAN_L高约2V(CAN_H≈3.5V,CAN_L≈1.5V),逻辑上代表"0"。

隐性电平(Recessive):CAN_H和CAN_L都约为2.5V,电压差接近0V,逻辑上代表"1"。

我在项目里遇到过一个问题:某次台架测试,总线偶尔出现错误帧。查了半天,发现是线束太长,终端电阻没匹配好。嗯,这里要注意,终端电阻是物理层的命门。标准CAN总线两端各需要120Ω电阻,用来消除信号反射。少了它,波形会振铃,通信直接崩。

我的经验:调试CAN总线时,先用示波器看CAN_H和CAN_L的波形。如果发现信号过冲或者台阶,十有八九是终端电阻或者线束阻抗出了问题。

2.2 CAN 2.0的数据链路层:帧结构详解

物理层搞定了,数据怎么组织?这就轮到数据链路层了。CAN 2.0定义了两种帧格式:标准帧(11位ID)扩展帧(29位ID)

我个人习惯把CAN帧拆成几个关键部分来看:

  • SOF(帧起始):一个显性位,告诉所有节点"我要发数据了"。
  • 仲裁场:包含ID和RTR位。ID决定了消息的优先级——数字越小,优先级越高。
  • 控制场:包含IDE位和DLC(数据长度码)。DLC告诉接收方后面跟了多少字节数据。
  • 数据场:0-8字节,真正要传的数据。
  • CRC场:15位CRC校验码,加上1位CRC界定符。用来检测传输错误。
  • ACK场:接收节点如果正确收到,会在ACK槽位拉低电平,告诉发送方"我收到了"。
  • EOF(帧结束):7个隐性位,表示帧结束。

你可能会问:为什么CAN总线能实现多主通信?答案就在仲裁机制里。当多个节点同时发送时,它们通过ID进行"线与"仲裁。显性位(0)会覆盖隐性位(1)。ID最小的节点,显性位最多,最终赢得总线控制权。

避坑指南:我曾经在一个项目中,把两个节点的ID设成了相同值。结果总线一直报错,通信完全瘫痪。记住:同一总线上,每个消息的ID必须唯一,否则仲裁会出问题。

2.3 CAN FD:为什么需要它?

CAN 2.0虽然稳定,但有个硬伤:数据场最多8字节,波特率最高1Mbps。放在今天,刷个固件、传个诊断数据,8字节根本不够用。

CAN FD(Flexible Data-Rate)就是来解决这个问题的。它保留了CAN 2.0的物理层和仲裁机制,但在数据段做了重大升级:

特性 CAN 2.0 CAN FD
最大数据长度 8字节 64字节
最大波特率 1 Mbps 8 Mbps(数据段)
CRC校验 15位 17位或21位
兼容性 - 与CAN 2.0兼容

说白了,CAN FD就是在仲裁段用标准速率(比如500kbps),等拿到总线控制权后,在数据段切换到高速率(比如2Mbps甚至更高)。这样既保证了仲裁的可靠性,又提升了数据传输效率。

2.4 CAN FD的帧格式变化

CAN FD的帧结构和CAN 2.0基本一致,但有几个关键区别:

  • FDF位:在控制场中新增了FDF位。FDF=1表示这是CAN FD帧,FDF=0表示是传统CAN帧。
  • BRS位:比特率切换位。BRS=1表示数据段切换到高速率,BRS=0表示全程用仲裁速率。
  • ESI位:错误状态指示位。发送节点如果处于被动错误状态,会置位ESI。
  • DLC编码变化:CAN FD的DLC值9-15不再表示8字节,而是对应12、16、20、24、32、48、64字节。

我的建议:设计CAN FD网络时,仲裁段速率建议用500kbps,数据段速率建议用2Mbps。这个组合在大多数车载场景下,兼顾了可靠性和吞吐量。我曾经试过数据段跑到5Mbps,结果线束稍微长一点就出错,得不偿失。

2.5 错误处理与总线状态

CAN总线的可靠性,很大程度上归功于它的错误处理机制。每个节点都有两个计数器:发送错误计数器(TEC)接收错误计数器(REC)

节点根据计数值,会进入三种状态:

  • 主动错误(Error Active):TEC<128且REC<128。节点可以正常收发,检测到错误时发送主动错误帧。
  • 被动错误(Error Passive):TEC≥128或REC≥128。节点可以收发,但检测到错误时只能发送被动错误帧。
  • 总线关闭(Bus Off):TEC≥256。节点完全退出总线,不再参与任何通信。

嗯,这里要注意:总线关闭状态只能通过硬件复位或用户干预才能恢复。我在一个项目中,某个节点因为软件bug导致频繁发送错误帧,TEC一路飙升到256,直接把自己踢出了总线。排查了很久才发现是发送缓冲区溢出导致的。

核心要点:CAN FD的物理层和CAN 2.0完全兼容。这意味着你可以把CAN FD节点和CAN 2.0节点混接在同一总线上。但要注意,CAN FD节点在发送FD帧时,CAN 2.0节点会把它当成错误帧处理。所以实际部署时,要么全用CAN FD,要么在混合模式下只发CAN 2.0帧。

2.6 小结

这一章我们聊了CAN总线的物理层和数据链路层。从差分信号到帧结构,从仲裁机制到错误处理,再到CAN FD的升级。说白了,CAN总线之所以能在汽车领域屹立30年不倒,靠的就是它简单、可靠、实时的特性。

下一章,我们会深入多协议网关的设计,看看如何把CAN、LIN、以太网这些协议揉在一起。到时候,我会分享一些实际项目中的架构设计经验,保证干货满满。