1、CAN总线的简介
CAN总线简称 — 控制器局域网络,由德国BOSCH公司开发,是一种串行的差分总线,并且这种差分总线只传递数据信息。
CAN总线已经是国际上的一种通信标准(ISO11519),它具有高可靠性、良好的错误检测能力、总线仲裁等优良特点,被广泛应用在汽车控制系统、环境恶劣场所、电磁辐射强、干扰性大等场所中。
CAN是一种异步的通信方式,它的通讯不需要时钟进行同步。
CAN总线上只有CAN_H、CAN_L两根通信线,数据以差分信号的方式进行传输。
2、CAN的信号电气规则
CAN总线的传输线路上只有两根用于传输信号的信号线 — CAN_H、CAN_L。
CAN总线的数据传输使用的是差分信号的方式进行的。这两根线中的信号振幅相等,相位相反,逻辑 “1”和逻辑 “0”通过两根信号线的电压差值表示出来。
在CAN的应用中,逻辑1也称为隐性电平,逻辑0也称为显性电平。
比如,以高速CAN为例:
逻辑1:CAN_H、CAN_L的电压均为2.5V,电压差为VH - VL = 0V。
逻辑0:CAN_H电压为3.5V,CAN_L电压为1.5V,电压差为 VH - VL = 2V。
示意图如下:
两根信号线的电压值根据标准的不同是有所差异的,如下表所示:
注意:CAN总线上,在同一个时刻只能处于隐性电平(逻辑1)或者显性电平(逻辑0)中的一个状态,且显性电平相比隐性电平具有优先权。比如:CAN总线上有两个节点,在同一个时刻,一个输出隐性电平,一个输出显性电平,这个时候总线上是显性电平状态。
3、CAN总线常见的接线网络
(1)闭环总线网络
CAN的闭环通信网络如下:
闭环通信网络的特点如下:
1)遵照标准为 ISO11898;2)最高速度可达1Mbps,总线最大长度为40m;3)总线的两端要求各有一个120欧姆的电阻。
注意:闭环网络的情况下,CAN总线的两端需要各接一个120欧姆的电阻,用于增加总线的抗干扰能力,提高总线的稳定性。
根据我个人对CAN总线的使用经验,如果CAN总线上的总阻值不为60欧姆,总线的通信质量是会变差的,甚至可能会出现通信不稳定的情况!
(2)开环总线网络
CAN的开环通信网络如下:
开环通信网络的特点如下:
1)遵循ISO11519-2标准;2)最高的通信速度为125Kbps,是一种低速通信的连接方式;3)最大的通信距离可达1Km;4)两根总线独立,且要求每根总线上要串联一个2.2K欧姆的电阻。
4、CAN的通信速率
按照 ISO11898 标准中所规定的,CAN总线的通讯波特率最高为 1Mbps。大多数项目常用的CAN总线波特率有125Kbits/s,250Kbits/s,500Kbits/s,1MKbits/s等。
CAN总线的传输距离与速率的对照表:
5、CAN总线的数据位时序分解
由于CAN总线是异步通信的,它不像IIC、SPI这种同步通行方式一样具有同步时钟,所以总线网络中的节点就需要约定好通信的波特率。
会把每一个数据位的时序进行分解,会分解成SS段、PTS段、PBS1段、PBS2段,这四个段加起来就是一个CAN的数据位长度。分解后的最小时间单位为Tq。它们分别如下:
同步段(SS段):该段的大小固定为1Tq。
当总线上的节点在SS段的范围内检测到总线上信号发生了跳变,就认为该节点与总线的时序是同步的。当节点与总线同步时,在采样点采集到的总线电平即可以确认为该位的电平。
传播时间段(PTS段):该段的大小为 1Tq ~ 8Tq。
这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。
相位缓冲段1(PBS1):该段的大小为 1Tq ~ 8Tq。
主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。
相位缓冲段2(PBS2):该段的大小为 1Tq ~ 8Tq。
是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。
为了方便说明,我就直接用高低电平表示CAN的逻辑1 和 逻辑0 信号,示意图如下:
图:CAN数据位分解图
上图是对CAN通信中的逻辑0进行分解的说明示意图。图中就表示每个数据位的长度为19Tq(SS 段占 1Tq,PTS 段占 6Tq,PBS1 段占 5Tq,PBS2 段占 7Tq),信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以改变采样点的位置。
6、CAN总线的波特率
在CAN总线的通讯中,各个通讯的节点只要确定了1个Tq的时间长度以及每个数据位占多少个Tq,由此就可以算出CAN通讯的波特率。
在CAN中,波特率也就只是约定了每个数据位的长度而已。
比如,上图(图:CAN数据位分解图)中,假设1Tq = 1us,每个数据位由19个Tq组成,则每传输1Bit数据需要的时间为:19Tq = 19us。
则一秒可以传输的数据位(bit)为:
1000000/19=52.6316K(bps)
注意:波特率指的是每秒可以传输的数据位(bit)的个数。