3. CAN物理层特性(差分信号、位时序、终端电阻)
聊到CAN总线,很多人上来就扒报文格式、ID过滤,却忽略了最底层的物理层。我最初啃芯片手册时也跳过这部分,结果调试时波形乱七八糟,找了好几天原因。后来才明白——物理层是地基,地基不稳,上层解析全是扯淡。
这一节咱们就把差分信号、位时序、终端电阻这三个硬骨头啃透。不求背参数,重在理解为什么这么设计,以及实际中怎么用。
3.1 差分信号:为什么CAN要“与众不同”?
CAN用两根线传输:CAN_H和CAN_L。它不靠对地电压,而是靠两根线之间的电压差来表达高低电平。
| 信号状态 | CAN_H电压 | CAN_L电压 | 差分电压(Vdiff) |
|---|---|---|---|
| 显性(Dominant) | 约3.5V | 约1.5V | 约2.0V |
| 隐性(Recessive) | 约2.5V | 约2.5V | 约0V |
我个人的理解:差分信号本质是把“信号参考地”从单端变成了“线对线”。好处很明显——抗共模干扰。比如电机启动瞬间地电位跳变,单端信号直接完蛋,但CAN两根线同时被干扰,差分电压不变。我在一个工厂自动化项目里,控制器和驱动器之间接地回路很长,单端485根本跑不了,换成CAN就好了。
3.2 位时序:CAN通信的时间骨架
CAN的位时序比UART复杂得多。它把一个位时间分成四个段:同步段(SS)、传播段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。
为什么分这么细? 因为CAN是多主总线,节点没有统一时钟,全靠同步和重同步来调整采样点。说白了,就是大家对着同一条总线上的跳变沿不断“对表”。
| 段名称 | 作用 | 典型时间份额(Tq) |
|---|---|---|
| 同步段(SS) | 检测上升沿/下降沿 | 1 Tq |
| 传播段(PTS) | 补偿物理延迟(线缆+收发器) | 1~8 Tq |
| 相位缓冲段1(PBS1) | 采样点前调整 | 1~8 Tq |
| 相位缓冲段2(PBS2) | 采样点后调整 | 1~8 Tq |
这里有个坑:采样点位置很关键。CAN标准推荐采样点在87.5%位时间附近。我曾经接手过一个项目,采样点设在50%,总线长度200米,跑250kbps,结果时不时出现ACK错误。后来把采样点调到80%,问题就消失了。你可以想想看,采样点靠前,容易采到信号还没稳定时的错误电平。
位时序的配置代码(以STM32为例):
// 假设时钟36MHz,目标波特率500kbps,预设Tq=125ns
// 位时间 = 1 / 500k = 2000ns = 16 Tq
CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; // 同步跳转宽度2Tq
CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq; // PBS1 = 13 Tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; // PBS2 = 2 Tq
// 采样点 = (1+13)/(1+13+2) = 14/16 = 87.5%
3.3 终端电阻:防止信号反射的“消音器”
CAN总线两端各需要一只120Ω电阻。为什么?因为信号在线缆上传输,遇到阻抗突变就会反射,反射波叠加原信号会造出奇怪的过冲和振铃。
120Ω怎么来的? CAN总线用的双绞线特性阻抗大约就是120Ω。终端电阻等于特性阻抗时,吸收反射能量,信号平滑。
- 必须接两个: 一个在总线最左端,一个在最右端。中间节点不接。
- 少了会怎样? 反射加重,能通讯但误码率上升,总线长度缩短。
- 多了会怎样? 两个以上终端电阻并联,等效电阻小于60Ω,显性电平降低,通讯困难。
我记得有一次: 帮朋友调试一个测试台架,总线上挂5个节点,通讯时好时坏。我拿万用表一量CAN_H和CAN_L之间的电阻——40Ω。一问才知道,他每个节点板子上都焊了个120Ω跳线,等于5个电阻并联。拆掉3个,只保留两端两个,通讯立刻稳了。
3.4 物理层整体框架
下面这张图把三大要素串起来,你看一遍就能记住各部分的角色:
从图上能看到:两端120Ω电阻把总线“端接”起来,中间节点通过CAN收发器挂到差分线上。位时序则是每个节点内部的采样策略,保证所有节点在正确的时间点读取差分电压。
所以你看,物理层并不只是“两根线加电阻”那么简单。差分信号给了你抗干扰能力,位时序给了你同步基础,终端电阻给了你信号完整性。三个缺一不可。
这一节先到这儿。后面咱们开始真正解码CAN报文,到时候你会发现——理解了物理层,看ID和DLC才不是空中楼阁。