0.前言
这是我为公司写的一个关于CAN总线的入门文章,对全面理解CAN总线特性很有帮助,拿出来分享给大家。
1. 简介
CAN总线由德国BOSCH公司开发,最高速率可达到1Mbps。CAN的容错能力特别强,CAN控制器内建了强大的检错和处理机制。另外不同于传统的网络(比如USB或者以太网),CAN节点与节点之间不会传输大数据块,一帧CAN消息最多传输8字节用户数据,采用短数据包也可以使得系统获得更好的稳定性。CAN总线具有总线仲裁机制,可以组建多主系统。
2. CAN标准
CAN是一个由国际化标准组织定义的串行通讯总线。最初是用于汽车工业,使用两根信号总线代替汽车内复杂的走线。CAN总线具有高抗干扰性、自诊断和数据侦错功能,这些特性使得CAN总线在各种工业场合广泛使用,包括楼宇自动化、医疗和制造业。
CAN通讯协议ISO-11898:2003标准介绍网络上的设备间信息是如何传递的,以及符合开放系统互联参考模型(OSI)的哪些分层项。实际通讯是在连接设备的物理介质中进行,物理介质的特性由模型中的物理层定义。ISO11898体系结构定义七层,OSI模型中的最低两层作为数据链路层和物理层,见图2-1。
图2-1:ISO 11898标准架构分层
在图2-1中,应用程序层建立了上层应用特定协议,如CANopenTM协议的通讯链路。这个协议由全世界的用户和厂商组织、CiA维护,详情可访问CiA网站:can-cia.de。许多协议是专用的,比如工业自动化、柴油发动机或航空。另外的工业标准例子,是基于CAN的协议的,由KVASER和Rockwell自动化开发的DeviceNetTM。
3. 标准CAN和扩展CAN
CAN通讯协议是一个载波侦听、基于报文优先级碰撞检测和仲裁(CSMA/CD+AMP)的多路访问协议。CSMA的意思是总线上的每一个节点在企图发送报文前,必须要监听总线,当总线处于空闲时,才可发送。CD+AMP的意思是通过预定编程好的报文优先级逐位仲裁来解决碰撞,报文优先级位于每个报文的标识域。更高级别优先级标识的报文总是能获得总线访问权,即:标识符中最后保持逻辑高电平的会继续传输,因为它具有更高优先级。
ISO-11898:2003标准,带有11位标识符,提供的最高信号速率从125Kbps到1Mbps。更迟一些的修订标准使用了扩展的29位标识符。标准11位标识符位域参见图3-1,提供2048个不同的报文标识符,扩展29位标识符位域参见图3-2,提供537百万个不同报文标识符。
3.1 标准CAN
标准CAN只有11位标识符,每帧的数据长度为51+(0~64)=(51~117)位。注:不计位填充(位填充将在本文第5节描述)。
图3-1:标准CAN---11位标识符
SOF - 帧起始,显性(逻辑0)表示报文的开始,并用于同步总线上的节点。
标识符 - 标准CAN具有11位标识符,用来确定报文的优先级。此域的数值越小,优先级越高。
RTR - 远程发送请求位,当需要从另一个节点请求信息时,此位为显性(逻辑0)。所有节点都能接收这个请求,但是帧标识符确定被指定的节点。响应数据帧同样被所有节点接收,可以被有兴趣的节点使用。
IDE - 标识符扩展位为显性时表示这是一个标准CAN格式,为隐形表示这是扩展CAN格式。
r0 - 保留位(可能将来标准修订会使用)
DLC - 4位数据长度代码表示传输数据的字节数目,一帧CAN最多传输8字节用户数据
数据0~8 – 最多可以传输8字节用户数据
CRC - 16位(包括1位定界符)CRC校验码用来校验用户数据区之前的(包含数据区)传输数据段。
ACK - 2位,包含应答位和应答界定符。发送节点的报文帧中,ACK两位是隐性位,当接收器正确地接收到有效的报文,接收器会在应答位期间向发送节点发送一个显性位,表示应答。如果接收器发现这帧数据有错误,则不向发送节点发送ACK应答,发送节点会稍后重传这帧数据。
EOF – 7位帧结束标志位,全部为隐性位。如果这7位出现显性位,则会引起填充错误。
IFS – 7位帧间隔标志位,CAN控制器将接收到的帧正确的放入消息缓冲区是需要一定时间的,帧间隔可以提供这个时间。
3.2 扩展CAN
扩展CAN具有29位标识符,每帧数据长度为71+(0~64)=(71~135)位。注:不计位填充(位填充将在本文第5节描述)。
图3-2:扩展CAN---29位标识符
扩展CAN消息相对于标准CAN消息增加的内容如下:
SRR – 代替远程请求位,为隐性。所以当标准帧与扩展帧发送相互冲突并且扩展帧的基本标识符与标准帧的标识符相同时,标准帧优先级高于扩展帧。
IDE – 为隐性位表示标志位扩展帧,18位扩展标识符紧跟着IDE位。
r1 – 保留
4.CAN消息
4.1仲裁
典型CAN的基本原理见图4-1所示,从图中可以看出,总线逻辑状态与驱动器输入和接收器输出逻辑是相反的。正常情况下,逻辑高电平为1,逻辑低电平为0,但是CAN总线却是逻辑高电平为0,称为显性,逻辑低电平为1,称为隐性。所以很多收发器的驱动器输入端都会内置上拉电阻,在没有任何输入时,CAN总线就会表现为隐性(逻辑低电平)。
图4-1:反转的CAN总线逻辑
在总线空闲时,最先开始发送报文的节点获得发送权。
如果多个节点同时访问总线,CAN使用非破坏式、逐位仲裁的方式决定哪个节点使用总线:各发送节点从仲裁域(标识符和RTR域)的第1位开始进行仲裁,连续输出显性电平(0)最多的节点可以继续发送。因此标识符数值越低的CAN报文,优先级越高。标识符数值为0的CAN报文,具有最高优先级,因为它输出的显性电平最多。
4.2消息类型
CAN有四种不同的报文类型:数据帧、远程帧、错误帧和过载帧。
5.位填充机制
帧起始、仲裁域、控制域、数据域以及CRC校验和域,均通过位填充方法编码。位填充是指,无论何时,发送器只要检测到位流中有5个连续相同逻辑的位,便会自动在位流中插入一个补码位。举例来说,如果连续5个显性位,则在5个显性位之后自动插入1个隐性位。接收器会自动删除这个插入的填充位。
数据帧或远程帧的剩余位域(CRC界定符、应答域和帧结尾域)形式固定,不填充。错误帧和过载帧也不填充。
CAN网络同步需要足够多的上升沿,这是CAN协议规定位填充的目的之一。位填充的其它作用:确保数据帧不会被当作错误帧(由6个连续的显性或隐性位组成)、确保正确识别帧结束标志(7个连续隐性位)。
6. 错误检测和故障界定
CAN总线具有很高的健壮性,这可能要归功于CAN具有多种错误检查机制。CAN协议制定了5种错误检测方法:三种位于报文层,两种位于位流层。如果一个数据帧出现错误,那么这个帧会被丢弃,并且接收节点还会发送一个错误帧。这会强制发送节点重复发送出错的报文,直到接收节点正确接收。如果同一个报文重复出错,达到一定次数后,发送节点可以关闭发送功能以降低对总线的影响。
报文层的错误检测包括CRC和ACK。16位的CRC域包含15位校验和、1位界定符。ACK域包括1位应答位、1位界定符。
CRC校验错误很好理解,它对数据域以及数据域之前的位生产CRC校验。由于一帧CAN报文数据流很小(最多8个用户数据),所以15位CRC的侦错能力非常优秀。
ACK域是怎么起作用的呢?这是由CAN协议规定的,即发送节点发送一帧数据后,接收节点必须向发送节点应答,如果发送节点没有收到接收节点的应答信号,就会认为自己发送失败,从而重传数据。
报文层的第三种错误检查方法是格式检查。这种检查会监控报文中那些一定为隐性位的域,如果这些域中出现显性位,则检测到格式错误。这些域包括SOF、EOF、ACK的界定符和CRC的界定符。
位流层的错误检测之一是发送到总线上的每一个数据位,都会被监视,如果发现发送的位和总线上的位不相同时,产生位错误。这种监视机制并不会监视仲裁域的位,这是因为多个节点同时竞争总线时,优先级高的节点可能会覆写总线上的仲裁域位。
位流层的另外一个错误检测机制是位填充规则:5个连续相同逻辑位之后,如果第6个位的逻辑还和前五个相同,则产生位填充错误。
7.网络拓扑
CAN使用差分信号,需要一对信号线,推荐使用双绞线,网络拓扑如图7-1所示。使用差分信号可以抑制共模干扰、能够增加系统可靠性,允许使用更高的速率。
高速ISO 11898标准规定了CAN传输最高速率为1Mbps,在这个速率下,传输距离最长40米(挂接30个节点,CAN信号不隔离)。推荐节点分支长度最大为0.3米、推荐使用带屏蔽或不带屏蔽的双绞线,线缆特性阻抗为120欧姆。
图7-1:CAN总线网络拓扑结构图
8. 终端匹配
终端匹配电阻大小等于传输电缆特性阻抗,传输电缆特性阻抗由电缆供应商提供,一般近似为Z=√(L/C)。其中L为电缆单位长度感抗,C为电缆单位长度电容。
由于CAN收发器结构,从隐性变成显性由晶体管驱动,所以都是很陡的,但是从显性回到隐性,却需要终端电阻来放电,否则就会由于导线分布电容,缓慢放电,导致位宽错误。所以所谓的近距离、低波特率CAN总线不加终端电阻的做法,都是错误的。
RS485与CAN总线不同,由于RS485收发器中一般都内置失效保护电路,在近距离、低波特率下允许不加终端匹配电阻。
9. 电缆与接线
CAN总线采用差分信号传输,如果使用带屏蔽双绞线,屏蔽层应单点接地。
图9-11列出带单屏蔽层的CAN电缆剖析与连接线示范。
图9-1:电缆信号分配、接地和终端匹配
通常电缆截面积越小,其分布电容、分布电感和直流电阻越大。当通讯距离较远时,电容、电感和直流电阻会引起信号衰减,波形失真和抖动。
一般情况下,电缆供应商会提供信号衰减图表。图9-2所示的曲线显示了24-AWG电缆衰减和频率的关系。
图9-2:信号衰减
10. 差分信号电压幅值
如图10-1所示,两条信号线CAN_H和CAN_L静态时均为2.5V左右,此时状态表示逻辑1,称作隐性;CAN_H比CAN_L高表示逻辑0,称为显性,此时通常CAN_H电压3.5V、CAN_L电压1.5V。
图10-1:CAN电平幅值
CAN标准规定,CAN总线上的差分电压>0.9V才能被识别成显性电平,<0.5V才能被识别成隐性电平,0.5~0.9之间的电平不能确定电平极性。如表10-1所示。
表10-1:差分电压幅值与电平极性关系
在实际项目布线时,容易漏加或者多加终端匹配电阻。我们可以通过测量CAN差分电压幅值来评估是否漏加或多加终端匹配电阻。如果不计导线电阻,终端电阻固定为120欧姆,单节点CAN总线差分电压如表10-2所示。
表10-2:终端匹配电阻数目与差分电压幅值关系
11. 电缆截面积与通讯距离
电缆截面积对通讯距离影响很大,特别是远距离通讯。远距离传输线上的分布电容、分布电感和直流参数会引起信号衰减。很多CAN通讯应用都具有距离远、波特率低的特性。比如本公司的KTC161通讯控制系统使用10kpbs,传输距离要不小于3km。这种情况下,传输电缆的直流电阻对传输距离影响非常大,因为这个直流电阻会和终端匹配电阻分压。
如图11-1所示,1号节点与2号节点相隔5km,使用的传输电缆直流电阻12.8欧姆/km,终端匹配电阻为124欧姆。1号节点发送的波形差分电压幅值为2V,经过5km传输电缆到2号节点时,差分电压幅值大约为1V,信号衰减了一半!我们在上文第10节中提到过:CAN总线上的差分电压>0.9V才能被识别成显性电平,现在2号节点只有1V差分电压,其可靠性已经变的较低。
为了保证可靠的数据通讯,一个有用的经验法则是:最末端节点差分电压幅值不小于1.2V。
注意图中故意忽略了分布电容和分布电感的影响,因此传输的波形没有畸变。
图11-1:传输电缆直流电阻分压示意图
对于双绞线,假设其终端匹配电阻与电缆特性阻抗相同,则截面积与最大通讯距离可参考表11-1:
表11-1:截面积与最大通讯距离关系
为了把电缆直流电阻引起的电压衰减降到最小,较大的终端电阻值(150~300欧姆)有助于增加总线长度。比如使用截面积为1.5 mm2的双绞线电缆,电缆特性阻抗为120欧姆。传输波特率为5kpbs的数据时,使用120欧姆的匹配电阻最远可以传输5km,但使用300欧姆的匹配电阻则可以传输7km!
12. 波特率、终端匹配电阻与通讯距离
图12-1:波特率、终端匹配电阻和通讯距离关系图
13. 信号延迟与通讯距离
高波特率情况下,制约CAN通讯距离的,是信号延迟。信号经过隔离光耦、传输电缆、ESD器件时,都会引起信号延迟。如果CAN的重同步也不足以弥补这个延迟,就会导致采样错误,最终CRC校验错误。
图12-1给出了截面积为1.5mm2传输电缆,在不同波特率和终端匹配电阻下的最大通讯距离。其中当波特率为1Mbps时,通讯距离大约为30米。30米的通讯电缆,其传输损耗可以忽略不计,此时影响通讯距离的主要是信号延迟。
通常,传输电缆延时为5ns/m、高速光耦延时可达25ns、磁耦合隔离器件延迟3~5ns。在CAN通讯系统中,一个优良的延迟标准是:
其中:
t l_MAX:最大延迟时间
tBIT:位时间
以1Mbps为例,其位时间为1us,则tl_MAX < 0.245 × tBIT = 0.245 × 1us = 245ns。信号在1.5mm2传输电缆上传输49米就能达到这个延迟时间,另外再加上信号上升/下降沿时间以及隔离器件、ESD器件、PCB走线延时,实际项目中,1Mbps波特率在1.5mm2传输电缆上只能传输30米。
这也是为什么RS485波特率可以达到10Mbps甚至50Mbps,而CAN标准最大速率只有1Mbps的原因。
表13-1给出了判定延迟的参考标准,在实际项目中,推荐信号延迟处于良好一栏标准。
表13-1:最大延迟参考标准
14. 节点最小间距
CAN总线是分布式参数电路,其电气特性和响应主要由沿物理介质分布的电感和电容所决定。这里物理介质包括连接电缆、连接器、终端和沿总线挂接的CAN设备。
图14-1:负载不均衡的CAN总线原理示意图
CAN总线阻抗不匹配会产生信号反射,雪上加霜的是CAN的仲裁机制:在仲裁期间,两个或更多个节点可能同时发送多个显性位。如图14-1所示,当开关S1在t=0时刻从显性状态切换到隐性状态,CAN驱动器差分输出电压为Vs,总线上的差分信号会由显性状态(Vs)变成稳定的隐性状态(0V)。这个信号波形会沿着总线向下传播,到达总线的负载区时,阻抗不匹配引起的反射电压将返回到源端。
负载与负载之间的最小安全距离d是设备集总负载电容CL和电缆的单位长度分布电容C的函数,定义如下:
设备集总负载电容CL包括CAN收发器引脚、连接器、隔离器件、保护器件、印制电路板走线以及其它物理连线的电容总和。
3.3V的CAN收发器一般能达到16pF电容,具体可以参考收发器数据手册;印制板走线一般0.5pF~0.8pF/cm,这取决于电路板的材质和结构;连接器和保护装置(比如ESD器件)的电容值可能范围会很大,具体要参考设备数据手册;非屏蔽双绞线介质的分布电容大约在40pF/m~70pF/m。
图14-2给出了更明了的图表显示.
图14-2:最小CAN设备间距
15. 信号位采样点位置
信号位采样点是指CAN节点识别一个电平逻辑的位置。CAN标准把总线上的每一位都细分为不同的阶段,如图15-1所示。在图中可以看到,每个位被分为同步段、传播段、相位缓冲段1和相位缓冲段2四个连续部分。其中采样点位于相位缓冲段1之后,同步段、传播段、相位缓冲段1和相位缓冲段2的持续时间都是可以编程的,因此采样点位置也是间接可编程的。
图15-1:每一个数据位的分段示意图
一般CAN节点是每个位采样一次(也可以采样3次,多用于低速场合),采样点位置都在一个位的50%以后的区域,这是为了让信号电平趋于稳定。采样点越靠后,波形越稳定。但也不是越靠后越好,采样点位置超过95%时,因为传输过程中的位偏差,可能会引起错误。CIA推荐采样点为一个位时间的87.5%处,实际项目中,一般设置为70%~90%,大部分汽车厂商规定采样点为70~80%。
采样点略靠后,比如80~90%,有利于远距离传输。提高节点波特率寄存器中的同步跳转宽度SJW值(加大到3个单位时间),可以加大位宽度和采样点的容忍度。
16. 波特率偏差
由于受到晶振影响,CAN通讯波特率实际值与理论值会有偏差。如果两个节点之间波特率偏差较大,容易造成误码率增大或通讯失败等问题。
CAN标准规定,设定的理论波特率与实际波特率偏差不得超过±1%;节点需要容忍的波特率偏差不得小于±3%。
17. 节点容抗
在CAN通讯电路设计过程中,节点容抗是容易被忽略的。节点容抗包括收发器引脚电容、PCB走线电容、ESD器件电容以及其它连线电容。
CAN标准对节点容抗有严格定义,容抗影响上升沿下降沿斜率,节点容抗增大,上升沿和下降沿会变缓,导致位时间畸变,误码率增加。上升沿和下降沿变缓会使得信号延迟变大,在高波特率下,影响信号传输质量和通讯距离。
节点容抗不易测量,需要专门仪器。在电路设计时,要对结合数据手册中给出的典型值,对CAN接口电路使用的器件总电容值进行估算。对于高波特率情况下,单节点电容推荐<100pF,多节点电容推荐值见表17-1所示。低波特率应用可以放宽要求。
表17-1:单节点电容最大值
18. 节点数量
可以连接到网络上的节点数量由收发器可以驱动的最小负载阻抗来决定。最大节点数量由下面的公式给出(考虑最坏情况):
其中:
Rdiff_min:收发器差动输入阻抗最小值
RL_min:收发器可驱动的负载电阻最小值
RT_min:终端匹配电阻最小值
在上式中,收发器差动输入阻抗最小值(Rdiff_min)和收发器可驱动的负载阻抗最小值(RL_min)由收发器芯片决定,终端匹配电阻最小值(RT_min)由传输电缆特性阻抗以及具体应用决定。
以本公司使用的PCA82C251收发器为例,其收发器差动输入阻抗最小值Rdiff_min = 20K欧姆,收发器可驱动的负载阻抗最小值RL_min = 45欧姆,假设终端匹配电阻最小值RT_min = 120欧姆,则最大节点数量为112个。
19. 共模电压范围
共模电压是指总线上的发送节点地和接收节点地之间的电势差。过高的共模电压会对系统造成影响,可能造成间歇重启、死锁、误码率增高甚至损害设备。在远距离通讯系统中,共模干扰的问题会更加突出,因为随着通讯线距离的增加,地环路会拾取更多的噪声,使得共模电压增大。
目前的CAN收发器都可以容忍一定的共模电压,ISO 11898标准规定,CAN收发器必须能容忍-2V~7V的共模电压。对于长达数千米的CAN通讯系统来说,标准规定的共模电压容忍能力远远达不到实际要求,因此电流隔离对于远距离数据传输系统来说仍是必须的。
20. 总线短路保护和热关断保护
总线短路保护是指总线与电源或地短路后,CAN收发器不会损坏,短路故障解除后,CAN收发器能继续工作。这个特性可以在总线极性反接、电缆绝缘层失效、意外短路到高压源时对收发器提供保护。
热关断电路用于帮助CAN收发器防御因短路产生破坏性电流和高温。一旦激活热关断电路,设备会进入关断模式。当设备冷却到正常操作温度时,设备自动恢复运行。
本公司使用的PCA82C251收发器具有短路保护和热关断保护。短路保护允许总线与24V电源短接。
21. 电流隔离
远距离数据传输可能会有较大的地电势差、地环流等问题,会在CAN总线上形成高共模电压。如果共模电压超出CAN收发器容忍的最大限度,数据链路就会不正常。
图21-1:远距离通讯电流隔离电路示意图
22. CAN接口电路与RS485接口电路
CAN总线和RS485总线都是采用差分信号传输数据,它们在总线拓扑、终端匹配、信号衰减、隔离与接地、波特率与通讯距离关系等方面都是相似的。但是CAN有自己的一些特性,在接口设计中,不能照抄RS485接口电路。
CAN总线对信号延迟敏感,因此信号隔离必须使用高速光耦或者磁耦合器件,以减少信号延迟。公司大量使用的TLP521光耦因为延迟时间过大(微秒级)不可以用于CAN接口电路。
CAN总线对电容敏感,在设计CAN接口电路时,需要使用CAN专用共模电感、专业ESD器件;需要根据应用的最大波特率和通讯距离,来决定是否在CAN总线上增加滤波电容以及滤波电容的大小。