200字
车载高速CAN bus开发杂谈1 底层协议其之一 物理层
2025-11-29
2025-11-29

近期导师接了个汽车电子相关的项目,虽然博主对汽车并不太感兴趣,但牛马还是要当的嘛……于是乎便花了一些时间研究了一下CAN bus协议,跑了点半实物仿真,在实车调试前先码点字唠嗑唠嗑。

协议栈?

熟悉TCP/IP的小伙伴都门清,网络协议栈一般分为5层,依次是应用层传输层网络层数据链路层物理层

而标准的CAN bus协议只定义了物理层数据链路层,并没有严格的高层协议定义。

不过根据不同的领域倒是各有主流的的高层协议定义,比如ISO-TP这样的传输层协议,以后有机会的话也可以聊一聊高层协议相关的内容。本文(其之一)只谈谈物理层。下一章(其之二)会展开讲讲数据链路层

物理层

电平标准

高速CAN bus采用一对差分信号线,分别为CAN_LCAN_H,人如其名,CAN_L的逻辑0为1.5V;CAN_H的逻辑0为3.5V,二者的逻辑1都是2V。

逻辑电平

CAN_L

CAN_H

0

1.5V

3.5V

1

2V

2V

CAN协议规定通过计算两者的电平差值来判断逻辑0/1。而这就引出更为形象的两个称呼了:

  • 隐性电平CAN_H - CAN_L == 0V的情况,为逻辑1

  • 显性电平CAN_H - CAN_L == 2V的情况,为逻辑0

为了消除电磁干扰,CAN_HCAN_L两根线使用双绞线连接。双绞线让干扰噪声耦合在了两根线上,在计算差值的时候便几乎完全被抵消了。

系统电路框图

高速CAN bus采用闭环网络的结构,CAN_HCAN_L的两端由两个120Ω的电阻连接到了一起。

除了减小回波反射,平稳波形之外,这两个终端电阻还有一个非常精妙的作用:在没有信号的时候,将两端的电压拉成相同。

这意味着隐性电平就相当于是什么操作都不需要做的状态,只需要在信号为0的时候拉一下总线就可以了。

CAN电路框图
使用draw.io绘制

驱动电路

一般高速CAN bus使用的驱动芯片多为TJA1050,其内部集成了120Ω的终端电阻,因此在使用的时候不需要再额外加电阻了。

TJA1050通过MOSFET上拉或下拉,把MCU输出的TTL电平转化为CAN bus的电平标准。

实物波形

在实际做项目的时候,因为被要求用指定的芯片STC32G128K,我直接使用该芯片内置的CAN控制器发送和接收了一些报文,下面是拍摄的波形:

CAN_H
CANH波形

CAN_L:
CANL波形

结尾

我并不喜欢把一篇文章写的很长,而是更喜欢分为多个文章,分块把每个部分分成独立的小文章,因此数据链路层的杂谈会放在下一篇中。

评论