CAN/CAN FD PHY 特点:差分信号、隐性/显性电平、位定时与同步
各位,聊到 CAN 和 CAN FD 的物理层,很多人第一反应就是“差分信号”——没错,这是最核心的底子。但我见过不少硬件工程师,画板子时把 CAN_H 和 CAN_L 走线拉得乱七八糟,结果链路死活协商不上。说白了,你连差分对的基本规矩都没摸透,PHY 怎么可能正常工作?
这一章我就带大家把这三个关键点掰开揉碎:差分信号怎么传、隐性显性电平到底啥意思、位定时和同步为什么能决定你的总线能跑多快。这些都是我平时做故障诊断时反复验证的东西,实用得很。
差分信号:抗干扰的“双绞线兄弟”
CAN 总线用一对差分线——CAN_H 和 CAN_L。信号不是对地测量的,而是看两根线的电压差。我打个比方:两根线就像双胞胎兄弟,外界噪声来了,同时干扰他俩,但兄弟俩的差距基本不变。这样抗干扰能力就比单端信号强很多。
具体来说:
- 隐性电平(Recessive):CAN_H 和 CAN_L 电压接近,差值为 0V 左右。此时总线处于空闲状态,允许任何节点发送。
- 显性电平(Dominant):CAN_H 比 CAN_L 高约 2V(标准 CAN 为 2.5V vs 1.5V,差值为 1V)。主动拉低总线,覆盖隐性电平。
为什么显性能覆盖隐性?我习惯用“线与”逻辑理解:多个节点同时发送时,只要有一个发显性,总线就是显性。隐性相当于高阻态,显性相当于强下拉。这个特性是实现总线仲裁的基础。
隐性/显性电平:仲裁与位填充的秘密
隐性电平代表逻辑“1”,显性电平代表逻辑“0”。仲裁时,发送节点不断监测总线电平,如果自己发的隐性被别人的显性覆盖,就自动退出。这个机制我特别喜欢——没有主从,完全靠电平斗智斗勇。
电平的具体数值(以标准 CAN 为例)
| 参数 | 隐性 | 显性 |
|---|---|---|
| CAN_H 电压 | 2.5V | 3.5V |
| CAN_L 电压 | 2.5V | 1.5V |
| 差分电压 | ≈0V | ≈2V |
| 逻辑值 | 1 | 0 |
注意,CAN FD 的显性电平跟标准 CAN 一样,但为了支持更高数据速率,收发器对共模电压要求更严格。我见过有的设计把 CAN FD 收发器用在标准 CAN 节点上,结果因为共模范围不匹配,偶尔出现位错误。
位定时与同步:决定你能跑多快
CAN 总线的位定时决定了通信速率。为什么有时候明明选了 500kbps 的波特率,实际却连不上?因为采样点位置不对。我教你一个口诀:“采样点,7/8;边沿同步,防漂移”。
位定时结构:
- 同步段 (Sync_Seg):用于检测边沿,固定 1 个时间量子 (Tq)。
- 传播段 (Prop_Seg):补偿物理延迟,通常 1~8 Tq。
- 相位缓冲段 1 (Phase_Seg1):用于重同步,采样点前调整。
- 相位缓冲段 2 (Phase_Seg2):采样点后调整。
- 采样点:位于 Phase_Seg1 和 Phase_Seg2 之间。
标准推荐采样点在位时间的 70%~90%。CAN FD 数据段由于速率更高,采样点通常设在 80% 附近。我一般把采样点设置在 87.5%,容错性好。
同步机制分两种:
- 硬同步:总线从空闲变忙时,每个节点检测到下降沿(隐性转显性)后,立即复位位定时计数器。只发生在帧起始 (SOF)。
- 重同步:帧传输过程中,如果边沿不在预期位置,通过调整 Phase_Seg1/2 来对齐。说白了就是“追边沿”。
我建议你查一下 CAN 控制器的寄存器,里面通常有 SJW(同步跳转宽度)参数。SJW 最大能调多宽?一般限制在 1~4 Tq。如果总线时钟偏差大,就把 SJW 设大一点,但注意会降低抗干扰能力。
位时间 (t_bit) = (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × Tq
波特率 = 1 / t_bit
采样点位置 = (Sync_Seg + Prop_Seg + Phase_Seg1) / (同步段+传播段+相位1+相位2) × 100%
一张图看懂 CAN PHY 特点
下面这张 SVG 图总结了差分信号、电平状态和位定时的关系,我做故障诊断时经常拿来对照。
实战案例:采样点设置不当导致链路协商失败
有一次客户反馈,他们的一款车载网关在换用 CAN FD 收发器后,只能通信 100kbps,选 500kbps 就报错。我远程让他们读控制器寄存器,发现采样点设在 62.5%——太靠前了。高速 FD 数据段的位时间短,采样点必须靠后,否则采样到不稳定的边沿。
我给出的方案:
- 调整位时间配置:Prop_Seg = 2 Tq, Phase_Seg1 = 7 Tq, Phase_Seg2 = 2 Tq(总 12 Tq,采样点 83.3%)
- SJW 设为 2 Tq,允许更大时钟偏差。
- 检查晶振精度:必须 ±0.5% 以内,CAN FD 高速时要求更严。
调整后通信恢复正常。你看,位定时这东西,不是你随便写个参数就行的。我习惯用工具计算,比如 ST 的 CAN Bit Timing Calculator。你如果手算,务必核对采样点是否在范围内。