2. CAN物理层基础:差分信号原理、CAN_H与CAN_L电平定义、显性与隐性位
好,咱们正式开始啃CAN总线的物理层。很多工程师一上来就撸代码、配寄存器,结果板子一上电,通信就是不通。查来查去,最后发现是收发器电平不对,或者总线端接电阻焊错了。说白了,物理层是CAN通信的基石,这层搞不定,上层协议再漂亮也白搭。
我个人习惯,设计任何总线接口前,先把物理层的几个核心概念吃透。CAN物理层最关键的三个东西:差分信号、CAN_H/CAN_L电平、显性与隐性位。咱们一个一个来。
2.1 为什么CAN要用差分信号?
你想想看,汽车里发动机点火、空调压缩机、雨刮器电机,哪个不是强干扰源?如果用普通的单端信号(比如UART的TX/RX,参考GND),干扰一上来,电平就跳变,数据就错。
差分信号就不一样。它用两根线传输:CAN_H 和 CAN_L。接收器不关心单根线对地的绝对电压,只关心两根线之间的电压差。
核心公式:
Vdiff = V(CAN_H) - V(CAN_L)
接收器只根据 Vdiff 的正负和大小来判断是“1”还是“0”。
干扰信号通常是共模的——同时叠加在CAN_H和CAN_L上。差分接收器一相减,共模干扰就被抵消了。这就是CAN能在发动机舱那种恶劣环境下稳定通信的根本原因。我在项目中遇到过,有一次客户板子在电机驱动器旁边,用RS485死活丢包,换成CAN收发器,问题立马解决。差分抗干扰,真不是吹的。
2.2 CAN_H与CAN_L的电平定义
CAN总线定义了两种逻辑状态:显性(Dominant) 和 隐性(Recessive)。这两种状态对应着不同的差分电压。
咱们先看标准ISO 11898-2定义的高速CAN(High-Speed CAN)电平:
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 Vdiff | 逻辑值 |
|---|---|---|---|---|
| 隐性 | 2.5V | 2.5V | ≈ 0V | 逻辑“1” |
| 显性 | 3.5V | 1.5V | ≈ 2V | 逻辑“0” |
记忆小技巧:
隐性 = 两根线“躺平”,电压一样,差为0。
显性 = CAN_H“拉高”,CAN_L“拉低”,差为2V。
总线空闲时,就是隐性状态。
嗯,这里要注意:显性位会覆盖隐性位。也就是说,只要有一个节点发送显性位,总线就是显性。这个特性是实现CAN总线仲裁的基础,后面章节会细讲。
2.3 显性与隐性位的“线与”机制
为什么会这样?因为CAN收发器的输出级是开漏结构(准确说是开集电极)。隐性时,收发器输出级高阻,总线靠终端电阻拉到2.5V。显性时,收发器内部驱动CAN_H上拉、CAN_L下拉。
我画个简化的逻辑关系图,你一看就明白:
你看,节点A发显性(逻辑0),节点B和C发隐性(逻辑1)。结果总线上所有节点读到的都是显性。这就是“线与”——显性位赢。
2.4 收发器内部结构速览
为了让你对电平产生有更直观的理解,我简单说一下收发器内部干了什么。以经典的TJA1050为例:
- TXD引脚:来自CAN控制器。TXD=0(低电平)→ 收发器输出显性;TXD=1(高电平)→ 输出隐性。
- RXD引脚:输出给CAN控制器。总线显性 → RXD=0;总线隐性 → RXD=1。
- CAN_H/CAN_L:连接到总线。
我曾经踩过的坑:
有一次,我设计的板子CAN通信时好时坏。用示波器一抓,发现CAN_H波形幅度只有2.8V,CAN_L只有1.8V,差分电压才1V。查了半天,发现是收发器的VCC供电脚滤波电容焊错了,导致供电有纹波,收发器驱动能力不足。换了个低ESR的电容,波形立马正常。
教训:收发器的电源质量直接影响总线电平。VCC脚必须紧挨着放一个0.1μF陶瓷电容,最好再加一个10μF电解电容。
2.5 常见CAN收发器电平对比
不同标准、不同速率下,电平定义略有差异。我整理了一个表格,方便你选型时参考:
| 标准/类型 | 隐性 CAN_H | 隐性 CAN_L | 显性 CAN_H | 显性 CAN_L | 典型速率 |
|---|---|---|---|---|---|
| ISO 11898-2 (高速CAN) | 2.5V | 2.5V | 3.5V | 1.5V | 125k ~ 1Mbps |
| ISO 11898-3 (容错CAN) | 0V (近似) | 5V | 5V | 0V | ~125kbps |
| CAN FD (灵活数据速率) | 2.5V | 2.5V | 3.5V | 1.5V | 最高8Mbps |
选型建议:
绝大多数工业控制和汽车应用,用ISO 11898-2兼容的收发器就行,比如TJA1050、SN65HVD230、MCP2551。容错CAN主要用于对可靠性要求极高、但速率不高的场景,比如车身控制模块。
2.6 动手验证:用示波器看CAN波形
理论说再多,不如动手测一次。我建议你找个CAN收发器评估板,接上120Ω终端电阻,用单片机发一组数据,然后用示波器探头勾CAN_H和CAN_L。
你会看到什么?
- 总线空闲时,两根线都是2.5V,重合在一起。
- 有数据时,CAN_H向上跳变到3.5V,CAN_L向下跳变到1.5V。
- 用示波器的数学通道(CH1 - CH2),你会看到一个清晰的2V差分信号。
嗯,这里有个小技巧:示波器探头的地线夹子要尽量短,最好用接地弹簧。否则地线太长会引入噪声,波形看起来毛刺很多。我刚开始用长地线夹子测CAN波形,看到一堆毛刺还以为收发器坏了,折腾了半天。
好,物理层的基础就这些。差分信号、CAN_H/CAN_L电平、显性隐性,这三个概念贯穿整个CAN设计。下一层,咱们要开始讲总线终端匹配和拓扑结构了——那又是另一个容易踩坑的地方。