第3章 CAN总线基础:从协议到物理层

大家好,我是老张。做汽车电子这些年,我见过太多工程师在CAN总线上栽跟头。有人搞不清帧结构,有人被物理层坑得欲哭无泪。今天咱们就把CAN总线的基础彻底讲透。

说实话,CAN协议看起来复杂,但核心就那几样东西。你把它拆开了看,其实挺有意思的。

3.1 CAN协议简介

CAN,全称Controller Area Network,控制器局域网。这玩意儿是德国Bosch公司在80年代搞出来的。为什么汽车行业都用它?说白了,就是抗干扰能力强,实时性好。

我记得刚入行那会儿,带我的老师傅说了一句话,我一直记着:「CAN总线就是汽车的中枢神经系统」。各个ECU就像器官,通过CAN总线传递信息。

CAN协议的核心特点:

  • 多主总线:任何节点都可以主动发消息,不需要主节点控制
  • 基于优先级仲裁:谁优先级高谁先发,不会冲突
  • 差分信号传输:抗干扰能力强,适合汽车环境
  • 错误检测机制完善:5种错误检测方式,可靠性极高

你想想看,一辆车上几十个ECU,要是用点对点通信,线束得多复杂?CAN总线用两根线就把所有节点串起来了,这就是它的魅力所在。

3.2 CAN帧结构详解

CAN总线上一共就4种帧:数据帧、远程帧、错误帧、过载帧。咱们一个一个说。

3.2.1 数据帧

数据帧是最常用的,用来传输实际数据。它分标准帧和扩展帧两种。标准帧11位ID,扩展帧29位ID。

我在项目中遇到过一件事:有个同事死活搞不懂为什么他的报文发不出去。我一看,原来是数据帧的DLC设成了0,但后面又跟了8个字节数据。这明显是格式错误。

数据帧的结构是这样的:

帧起始(SOF) + 仲裁场(11/29位ID + RTR + IDE) + 控制场(保留位 + DLC) 
+ 数据场(0-8字节) + CRC场(15位CRC + CRC界定符) 
+ 应答场(ACK槽 + ACK界定符) + 帧结束(EOF)

我的小技巧:用CANalyzer抓数据帧时,重点关注ID和DLC。ID决定了优先级,DLC决定了数据长度。这两个搞错了,后面全白搭。

3.2.2 远程帧

远程帧,说白了就是「请求帧」。一个节点发远程帧,就是告诉另一个节点:「嘿,把你的数据发给我」。

远程帧和数据帧长得差不多,区别在于RTR位。数据帧的RTR=0,远程帧的RTR=1。而且远程帧没有数据场。

我曾经犯过一个低级错误:用远程帧请求数据,结果对方没响应。查了半天才发现,是对方的接收滤波没配置好。嗯,这种坑踩过一次就记住了。

3.2.3 错误帧

错误帧是CAN总线自己发的,不是用户主动发的。当节点检测到总线错误时,就会发错误帧通知大家。

错误帧由两部分组成:

  • 错误标志:6个连续的显性位(主动错误)或6个连续的隐性位(被动错误)
  • 错误界定符:8个连续的隐性位

注意:错误帧发多了,节点会从「主动错误状态」变成「被动错误状态」。再严重下去,节点会进入「总线关闭状态」,彻底不参与通信了。我在调试时见过这种情况,那叫一个头疼。

3.2.4 过载帧

过载帧,就是节点告诉总线:「我忙不过来了,慢点发」。它和错误帧长得有点像,但用途完全不同。

过载帧一般在两种情况下出现:

  1. 节点内部处理不过来,需要延迟下一个帧的发送
  2. 帧间隔期间检测到显性位(这属于异常情况)

说实话,过载帧在实际项目中不太常见。我做了这么多年,也就碰到过一两次。但知道总比不知道好。

3.3 CAN总线物理层

物理层,就是实实在在的硬件。CAN总线用两根线:CAN_H和CAN_L。传输的是差分信号。

为什么用差分信号?你想想看,汽车里电磁干扰那么严重,单端信号很容易被干扰。差分信号就不一样了,两根线受到的干扰差不多,一减就抵消了。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度 40m @ 1Mbps 500m @ 125kbps
显性电平 CAN_H=3.5V, CAN_L=1.5V CAN_H=3.6V, CAN_L=1.4V
隐性电平 CAN_H=2.5V, CAN_L=2.5V CAN_H=0V, CAN_L=5V

这里有个关键点:终端电阻。高速CAN总线两端必须各接一个120Ω的电阻。为什么?为了阻抗匹配,防止信号反射。

避坑指南:我曾经调试一个项目,CAN通信时好时坏。查了两天,最后发现是终端电阻没接好。一个120Ω的电阻,让我折腾了两天。从那以后,我调试CAN的第一件事就是量终端电阻。

物理层还有个重要概念:位时序。CAN总线的每个位由4个段组成:

  • 同步段(SS):1个时间量子,用于同步
  • 传播段(PTS):1-8个时间量子,补偿传输延迟
  • 相位缓冲段1(PBS1):1-8个时间量子,采样点前
  • 相位缓冲段2(PBS2):1-8个时间量子,采样点后

采样点一般设置在85%左右。为什么是这个值?说白了,就是为了在信号稳定的时候采样,避免采到跳变沿。

我记得有次帮一个客户分析CAN通信问题,他们的采样点设在了50%。结果总线速率一高,通信就出错。把采样点调到85%,问题立马解决。

3.4 实战经验总结

讲了这么多,我给大家总结几条实战经验:

  1. 先看物理层:用示波器量CAN_H和CAN_L的波形,看电平对不对,终端电阻在不在
  2. 再看协议层:用CANalyzer抓报文,看ID对不对,数据对不对
  3. 最后看时序:如果通信不稳定,检查位时序配置,特别是采样点位置

我的习惯:每次做CAN项目,我都会在CANalyzer里建一个「黄金模板」。里面配好了常用的DBC文件、滤波设置、触发条件。新项目来了,直接套模板改一改就行。省时省力,还不会漏配置。

好了,CAN总线的基础就讲到这里。下一章咱们聊CANalyzer的界面和基本操作。到时候我会教大家怎么用CANalyzer抓报文、分析数据。这些东西,光看书没用,得上手练才行。

记住一句话:CAN总线不难,难的是细心。每一个细节都可能成为你调试路上的绊脚石。但只要你把基础打牢了,后面就顺了。