3. 物理层与数据链路层:CAN收发器、差分信号、帧结构
好,咱们进入第三讲。这一章,说白了就是CAN通讯的“硬核”部分——信号怎么在线上跑,报文怎么打包发送。很多刚入行的朋友觉得CAN协议就是调调波特率、发发数据,其实物理层和数据链路层才是坑最多的地方。我当年在实验室调第一块CAN板子,就因为收发器供电没处理好,折腾了整整两天。
3.1 CAN收发器:物理层的“翻译官”
CAN收发器,比如TJA1050、SN65HVD230这些,干的事其实很简单:把控制器输出的逻辑电平(通常是3.3V或5V的TTL/CMOS电平)转换成差分信号,扔到CAN总线上。反过来也一样,把总线上的差分信号还原成逻辑电平。
我个人习惯把收发器看作一个“翻译官”。MCU说“我要发0”,收发器就在CAN_H和CAN_L上产生对应的电压差。MCU说“我要发1”,收发器就让两根线电压相等。
关键参数:
- 速率: 常见的有125kbps、250kbps、500kbps、1Mbps。线控转向系统我建议用500kbps或1Mbps,响应快。
- 共模电压范围: 一般-2V到+7V。我在项目里遇到过共模干扰导致丢帧的情况,后来加了共模扼流圈才解决。
- 待机模式: 有些收发器支持低功耗待机,唤醒靠总线活动。这个在休眠唤醒策略里很有用。
注意: 收发器的电源和地一定要处理好。我曾经因为地线回路太长,导致总线信号畸变,通讯时好时坏。建议在收发器附近加一个100nF的去耦电容。
3.2 差分信号:为什么CAN这么抗造?
CAN总线用的是差分信号,也就是CAN_H和CAN_L两根线。逻辑“显性”(Dominant)对应CAN_H比CAN_L高,逻辑“隐性”(Recessive)对应两根线电压相等。
你想想看,如果外界有电磁干扰,它同时作用在两根线上,电压差基本不变。这就是差分信号抗干扰的核心原理。说白了,干扰是“共模”的,而我们关心的是“差模”。
我记得有一次在EMC实验室做测试,辐射干扰打到CAN总线上,单端信号早就乱套了,但差分信号纹丝不动。嗯,这就是CAN能用在汽车这种恶劣环境里的底气。
避坑指南: 我曾经在布线时把CAN_H和CAN_L走线拉得太长,还绕了个大弯。结果信号反射严重,通讯速率上不去。后来改成等长、差分走线,问题解决。记住:CAN总线要尽量短,尽量直,尽量成对走。
3.3 帧结构:数据链路层的“快递单”
CAN的帧结构,就像寄快递时填的单子。咱们以最常用的标准数据帧为例,逐段拆解。
SOF | ID (11位) | RTR | IDE | r0 | DLC (4位) | Data (0-8字节) | CRC (15位) | CRC Delimiter | ACK Slot | ACK Delimiter | EOF
别被这一长串吓到,核心就几个部分:
- SOF(Start of Frame): 1位显性位,告诉所有节点“我要发数据了”。
- ID(Identifier): 11位(标准帧)或29位(扩展帧)。ID决定了优先级,数值越小优先级越高。线控转向的转向角报文,我一般给个高优先级ID,比如0x100。
- DLC(Data Length Code): 4位,表示数据场有多少字节。范围0-8。注意:DLC可以大于8,但数据场最多8字节,多余的部分接收器会忽略。
- Data: 0-8字节,真正要传的数据。比如转向角、转速、扭矩等。
- CRC(Cyclic Redundancy Check): 15位CRC校验码 + 1位CRC界定符。用于检测传输错误。我见过有人CRC算错,导致通讯失败,后来发现是多项式没选对。
- ACK(Acknowledge): 1位ACK槽 + 1位ACK界定符。发送节点发隐性位,接收节点如果正确收到,就在ACK槽拉成显性位。这就是“应答”机制。
实战经验: 我在调试线控转向时,发现转向角数据偶尔跳变。后来用CAN分析仪抓包,发现是CRC校验失败,接收器丢弃了错误帧。嗯,问题出在总线终端电阻匹配上,导致信号反射,CRC算出来不对。加上120Ω终端电阻后,一切正常。
3.4 帧类型:不只是数据帧
CAN总线有四种帧类型,咱们简单过一下:
| 帧类型 | 用途 | 说明 |
|---|---|---|
| 数据帧 | 发送数据 | 最常用,线控转向的报文都用它 |
| 远程帧 | 请求数据 | 节点可以发远程帧,让另一个节点发数据回来。我很少用,因为数据帧也能实现类似功能 |
| 错误帧 | 报告错误 | 当节点检测到总线错误时,主动发错误帧。我曾经被错误帧刷屏,原因是总线短路 |
| 过载帧 | 延迟发送 | 节点忙不过来时,发过载帧让其他节点等一等。实际项目中很少遇到 |
说白了,你平时打交道最多的就是数据帧。远程帧偶尔用,错误帧是调试时的“报警器”,过载帧基本用不上。
3.5 知识体系总览
下面这张图,把物理层和数据链路层的核心逻辑串起来了。你可以把它当作本章的“地图”。
这张图里,物理层负责“怎么传”,数据链路层负责“传什么、传对了没”。两者缺一不可。你想想看,如果物理层信号质量差,数据链路层再好的协议也白搭。反过来,如果数据链路层协议有漏洞,物理层再稳定也传不出正确数据。
个人建议: 调试CAN通讯时,先用示波器看物理层波形,确认CAN_H和CAN_L的差分电压是否正常(显性约2V,隐性约0V)。波形没问题,再抓包分析数据链路层。这样能快速定位问题。
好,这一章就到这里。物理层和数据链路层是CAN通讯的基石,搞懂了它们,后面的应用层解析就水到渠成了。