第3章:CAN通信基础
各位同学,咱们今天聊聊CAN通信的基础。说实话,这部分内容我刚开始学的时候也觉得挺枯燥的,不就是两根线嘛?但后来在项目里吃过亏,才明白这些基础有多重要。
3.1 CAN总线物理层与数据链路层
CAN总线,全称是Controller Area Network。它最早是博世公司为汽车开发的。现在几乎所有车载ECU之间都在用这个协议。
物理层说白了,就是信号怎么在线上跑。CAN总线用两根线:CAN_H和CAN_L。它们是一对差分信号线。为什么要用差分?抗干扰能力强啊。你想想看,发动机舱里电磁干扰那么严重,单端信号早就被干趴下了。
关键点:CAN总线的电平逻辑是"显性"和"隐性"。显性电平(逻辑0)对应CAN_H比CAN_L高2V左右,隐性电平(逻辑1)对应两线电压差接近0V。总线空闲时是隐性状态。
数据链路层呢,负责把物理层的信号组织成有意义的帧。CAN协议定义了四种帧类型:数据帧、远程帧、错误帧和过载帧。咱们做UDS诊断,最常用的是数据帧。
我记得第一次调CAN通信时,示波器上波形看着都对,但就是收不到数据。查了半天,原来是CAN_H和CAN_L接反了。嗯,这种低级错误,犯过一次就记住了。
3.2 CAN报文格式:标准帧与扩展帧
CAN报文格式,这是面试必考题。标准帧有11位标识符,扩展帧有29位。为什么要有两种?因为11位只能表示2048个ID,对于现代汽车来说不够用。
来看一个标准帧的结构:
SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF
扩展帧的区别在于:IDE位为1,后面跟着18位扩展ID。总共有29位ID。
| 字段 | 标准帧 | 扩展帧 |
|---|---|---|
| ID长度 | 11位 | 29位 |
| IDE位 | 0 | 1 |
| 数据长度 | 0-8字节 | 0-8字节 |
| 仲裁场 | 12位 | 32位 |
个人经验:做UDS诊断时,我习惯用扩展帧。因为29位ID可以灵活分配,比如把源地址和目标地址都编码到ID里。标准帧的话,地址分配容易打架。
这里有个坑:CAN报文的字节序。Motorola格式和Intel格式,搞反了数据就全乱了。我曾经在项目里,因为字节序问题,ECU发出来的车速值怎么算都不对。后来发现是文档里写的是Motorola格式,我代码里按Intel解析了。
3.3 CAN控制器与收发器
CAN控制器和收发器,这两个东西分工明确。控制器负责协议处理,比如帧的组装、错误检测、仲裁这些。收发器负责电平转换,把控制器的逻辑电平转成CAN总线上的差分信号。
常用的CAN控制器有:NXP的SJA1000、TJA1040系列。现在很多MCU都内置了CAN控制器,比如NXP的S32K系列、MPC57xx系列。外部再接一个收发器就行。
收发器选型要注意几点:
- 工作电压:5V还是3.3V
- 速率支持:最高到1Mbps还是5Mbps(CAN FD)
- 待机模式:是否需要低功耗
- 总线引脚保护:ESD、浪涌防护等级
避坑指南:我曾经在一个项目里,收发器选的是TJA1050,但MCU是3.3V的。结果发现TJA1050的VIO引脚需要接5V,跟MCU电平不匹配。后来换了TJA1043才解决。选型时一定要看数据手册的VIO范围。
3.4 CAN通信速率与终端电阻
CAN总线的通信速率,常见的有125kbps、250kbps、500kbps、1Mbps。速率越高,总线长度越短。1Mbps时,总线长度最好不要超过40米。
终端电阻,这个很多人容易忽略。CAN总线两端各需要接一个120欧姆的电阻。为什么是120欧姆?因为CAN总线的特性阻抗大约是120欧姆。接上匹配电阻,可以消除信号反射。
我见过一个案例:某车型的CAN总线偶尔丢帧,查了几个月。最后发现是终端电阻焊错了,焊成了12欧姆。你想想看,12欧姆和120欧姆差了一个数量级,信号反射得一塌糊涂。
计算公式:总线长度与速率的关系:L_max = (t_prop * v) / 2。其中t_prop是传播延迟,v是信号速度(约5ns/m)。说白了,速率越高,允许的总线长度越短。
实际项目中,我一般这样配置:
- 动力CAN:500kbps,终端电阻120Ω
- 车身CAN:125kbps,终端电阻120Ω
- 诊断CAN:通常用250kbps或500kbps
嗯,这里要注意:终端电阻不是随便焊上去就完事了。电阻的精度要选1%的,功率0.25W以上。有些便宜的电阻温度系数大,高温下阻值漂移,总线通信就不稳定了。
最后说一句:CAN总线的基础,说白了就是物理层怎么传信号、数据链路层怎么组帧、控制器和收发器怎么配合、速率和电阻怎么选。这些搞明白了,后面做UDS协议栈就顺了。
下一章咱们开始讲UDS协议本身,包括服务ID、子功能、诊断会话这些。到时候会用到今天讲的CAN报文格式,所以这一章的内容一定要吃透。