近期导师接了个汽车电子相关的项目,虽然博主对汽车并不太感兴趣,但牛马还是要当的嘛……于是乎便花了一些时间研究了一下CAN bus协议,跑了点半实物仿真,在实车调试前先码点字唠嗑唠嗑。
协议栈?
熟悉TCP/IP的小伙伴都门清,网络协议栈一般分为5层,依次是应用层、传输层、网络层、数据链路层和物理层。
而标准的CAN bus协议只定义了物理层和数据链路层,并没有严格的高层协议定义。
不过根据不同的领域倒是各有主流的的高层协议定义,比如ISO-TP这样的传输层协议,以后有机会的话也可以聊一聊高层协议相关的内容。本文(其之一)只谈谈物理层。下一章(其之二)会展开讲讲数据链路层。
物理层
电平标准
高速CAN bus采用一对差分信号线,分别为CAN_L和CAN_H,人如其名,CAN_L的逻辑0为1.5V;CAN_H的逻辑0为3.5V,二者的逻辑1都是2V。
CAN协议规定通过计算两者的电平差值来判断逻辑0/1。而这就引出更为形象的两个称呼了:
隐性电平是CAN_H - CAN_L == 0V的情况,为逻辑1显性电平是CAN_H - CAN_L == 2V的情况,为逻辑0
为了消除电磁干扰,CAN_H和CAN_L两根线使用双绞线连接。双绞线让干扰噪声耦合在了两根线上,在计算差值的时候便几乎完全被抵消了。
系统电路框图
高速CAN bus采用闭环网络的结构,CAN_H和CAN_L的两端由两个120Ω的电阻连接到了一起。
除了减小回波反射,平稳波形之外,这两个终端电阻还有一个非常精妙的作用:在没有信号的时候,将两端的电压拉成相同。
这意味着隐性电平就相当于是什么操作都不需要做的状态,只需要在信号为0的时候拉一下总线就可以了。

使用draw.io绘制
驱动电路
一般高速CAN bus使用的驱动芯片多为TJA1050,其内部集成了120Ω的终端电阻,因此在使用的时候不需要再额外加电阻了。
TJA1050通过MOSFET上拉或下拉,把MCU输出的TTL电平转化为CAN bus的电平标准。
实物波形
在实际做项目的时候,因为被要求用指定的芯片STC32G128K,我直接使用该芯片内置的CAN控制器发送和接收了一些报文,下面是拍摄的波形:
CAN_H:
CAN_L:
结尾
我并不喜欢把一篇文章写的很长,而是更喜欢分为多个文章,分块把每个部分分成独立的小文章,因此数据链路层的杂谈会放在下一篇中。