江协科技 CAN总线入门课程(CAN简介硬件电路)
首先,我们将CAN总线协议的特点与之前学习过的主流通信协议进行对比如下:
接下来首先看CAN的硬件电路,下面这两个图就是CAN总线的电路接法,左图为闭环CAN总线,是高速CAN的接法;右图为开环CAN总线,是低速CAN的接法。
•每个设备通过CAN收发器挂载在CAN总线网络上,CAN收发器就是一个芯片,主要实现电平转换、输出驱动和输入采样这几个功能;
•CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连。最下面的两根线就是串连各个节点的CAN总线,CAN总线里走的是差分信号,一般会用双绞线为载体,避免干扰;
•高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻,其主要作用有两个:1.防止回波反射,尤其是高频信号、远距离传输的场景,回波反射是不能忽略的问题;2.在没有设备操作时,将两根差分线的电压收紧,使其电压一致,意思就是在没有设备操作总线的情况下,电阻就像一根弹簧一样,会将两根线的弹簧拉到同一水平。因为CAN总线是差分信号,有两根线,所以两边的终端电阻可以将两根线收紧至电压一致状态,代表的就是默认的1状态,并且这两个电阻的阻值并不大,所以这个收紧的速度是非常快的,使得CAN总线支持的最大速率也比较快。所以当某个设备想发送0时,它就会操作总线,把总线“拉开”,使其呈现0状态,当设备想要发送1时,就不去碰总线,总线在终端电阻的收缩下自动归位默认状态1;一定要注意,当设备想发送1时,它无需对总线进行任何操作,因为总线的默认状态就是1。这就是高速CAN的电路以及高速CAN如何发送0和1的操作方式。
•低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
现在来看一下它的具体规定:首先,高速CAN的规定是电压差为0V时表示逻辑1(隐性电平),电压差为2V时表示逻辑0(显性电平),这里注意一下,逻辑1又称隐性电平,逻辑0又称显性电平,这个定义是反直觉的,为什么要这样定义呢?我们对照下面的图来理解一下。

当CAN_H和CAN_L对地(相对于GND)的电压都为2.5V时,两线电压相等,电压差为0V,表示当前CAN总线处于逻辑1的状态,当CAN_H对地电压3.5V,CAN_L对地电压1.5V时,两线电压差为2V,表示当前CAN总线处于逻辑0的状态,比如CAN总线想发送101的数据流,那么CAN总线就会呈现出两线收紧、两线张开、两线收紧这样的状态。当然这里,逻辑表示和差分表示完全等效,CAN总线里,实际传输的是差分电平,而在STM32的引脚以及常见的时序画法里会出现逻辑电平表示。显性和隐性,表示的是总线的状态,两线收紧,没有电压差,是默认状态,所以叫隐性;两线张开,产生电压差,是需要设备干预的状态,所以叫显性。这样定义显性隐性是符合常识的。在和逻辑电平的对应上,因为电路约定俗成的习惯,就是默认状态为高电平1,所以默认的隐性电平就和逻辑1绑定了,显性和0绑定。另外,显性电平和隐性电平同时出现时,总线会表现出显性电平状态,这也能对应电路中,0强于1的规定。这就是1对应隐性,0对应显性的设计原因。
这些就是高速CAN的电平标准定义,之后继续是低速CAN的电平规定,电压差为-1.5时表示逻辑1(隐性电平),电压差为3V时表示逻辑0(显性电平),在规定上其实和高速CAN差不多,但是低速CAN传输距离更远,考虑到线路会有压降,所以把1和0电平电压的差距加大了,也就是1和0变化的行程更长了,这样即使有一些压降,也能明显地区分出1和0的电平差异。同时我们也看出低速CAN默认的逻辑1,隐性电平,CAN_H和CAN_L的电压并不相等,所以对应其电路,总线两端就不能用终端电阻闭合连在一起。
接着简单看一下CAN收发器的内部框图,刚才我们提到,每个CAN设备,都得通过CAN收发器挂载在总线上,那CAN收发器有什么用,可以干哪些工作呢?我们看一下下面这个框图就知道了。这里介绍的CAN收发器型号是TJA1050,是一个高速CAN的收发器



该芯片的TXD和RXD与设备的CAN控制器相连,CAN_H和CAN_L与CAN总线相连,Vref是参考电压输出,可以不用;S用来选择是高速模式还是静默模式。再看一下芯片内部,首先右边CANH和CANL就是CAN总线,左侧的接收器可以时刻检测总线电压差,如果总线有电压差就输出1,如果总线没有电压差就输出0,这个1和0通过两个场效应管的输出驱动器输出到RXD引脚,这两个管就当作是电子开关,右边为1时,上管断开,下管导通,输出0;右边为0时,上管导通,下管断开,输出1。最终整体上看,当CAN总线有电压差时,输出RXD引脚为低电平,表示显性电平;当CAN总线没有电压差时,输出RXD引脚为高电平,表示隐性电平。所以RXD这一块就是输入部分,那么上面TXD这一块就是输出部分了,当TXD给1时,后面的驱动器就会让后面两个场效应管都断开,相当于不对总线进行任何操作,总线在外边终端电阻的收紧作用下呈现默认的隐性;当TXD给0时,后面的驱动器就会让后面的两个场效应管都导通,上面的Vcc将CANH电压拽高,下面的GND将CANL的电压拽低,这样两线就会分开,产生电压差,总线呈现显性电平0的状态这就是发送0的操作