摘 要: 分析了CAN总线通信的性能和技术特点,介绍了CAN总线结构的模式及应用趋势。针对采用单片机实现与CAN总线接口的问题,详细探讨了用STC15F2K60S2单片机结合总线控制器SIA1000和总线收发器PCA82C250芯片构成CAN总线接口电路的实现,并介绍了接口驱动软件的编制流程。
关键词: CAN总线; 控制器;收发器;单片机; 通信; 接口;
控制器局域网络CAN(Controller Area Network)是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11898),是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,由于该总线所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。
1 CAN总线通讯原理
CAN总线目前采用2.0规范。CAN 2.0规范分为CAN 2.0A与CAN 2.0B。CAN 2.0A 支持标准的11 位标识符,CAN 2.0B同时支持标准的11位标识符和扩展的29位标识符。
CAN总线的物理层包括物理层信号(PLS)、媒体访问单元(PMA)和介质相关接口(MDI)3部分,主要完成电气连接、驱动器/接收节点特性、位定时、同步、位编码/解码的描述。
在国际标准ISO11898中,对基于双绞线的CAN系统建议了电气连接。为了抑制信号在端点的反射,CAN总线要求在两个端点上安装两个120 Ω的终端电阻。CAN总线的驱动可采用单线上拉、单线下拉和双线驱动,如果所有节点的晶体管均处于关断状态,则CAN总线上呈现隐性状态,如果CAN总线上至少有一个节点发送端的那对晶体管导通,产生的电流流过终端电阻,在CAN_H和CAN_L两条线之间产生差分电压,总线上就呈现出显性状态。CAN总线上的信号接收采用差分比较器,读取差分电压值。
理想发送节点在没有重同步的情况下每秒发送的位数量定义为标称位速率(Nominal Bit Rate)。标称位时间(Nominal Bit Time)定义为标称位速率的倒数,即标称位时间 = 1/标称位速率。位时间指的是CAN总线通信时1 bit数据持续的时间,CAN总线工作时标称位速率是不变的,那么标称位时间也保持不变,即要求每个位在总线上的时间要保持一致。CAN总线的标称位时间可划分为4个同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段1(PSEG1)和相位缓冲段2 (PSEG2)不重叠的时间段。
CAN总线标称位时间中各个时间段都可以根据具体网络情况而重新设置,均由CAN控制器的可编程位定时参数来实现。位时间内时间段的设定能实现CAN总线节点同步、网络发送延迟补偿和采样点定位等功能。
CAN总线的同步使CAN总线系统的收发两端在时间上保持步调一致。从位定时的同步方式考虑,CAN总线实质上属于异步通信协议,每传输一帧,以帧起始位开始,而以帧结束及随后的间歇场结束。这就要求收/发双方从帧起始位开始必须保持帧内报文代码中的每一位严格的同步。CAN 总线的位同步只有在节点检测到“隐性位”到“显性位”的跳变时才会产生,当跳变沿不位于位周期的同步段之内时将会产生相位误差。该相位误差就是跳变沿与同步段结束位置之间的距离。相位误差源于节点的振荡器漂移、网络节点之间的传播延迟以及噪声干扰等。CAN 协议规定了硬同步和重同步两种类型的同步。
硬同步只在总线空闲时通过一个从“隐性位”到“显性位”的跳变(帧起始)来完成,此时不管有没有相位误差,所有节点的位时间重新开始。强迫引起硬同步的跳变沿位于重新开始的位时间的同步段(SYNC_SEG)之内。
重同步在报文的随后位中,每当有从“隐性位”到“显性位”的跳变,并且该跳变落在了同步段之外,就会引起一次重同步。重同步机制可以根据跳变沿加长或者缩短位时间以调整采样点的位置,保证正确采样。
2 CAN总线的接口
CAN总线的接口主要包括电源电路、复位电路、时钟电路和STC15F2K60S2单片机与SJA1000接口电路、CAN总线收发器电路几部分。
2.1 CAN总线控制器SJA1000
SJA1000是NXP公司研制的一款独立CAN控制器,可以完成CAN总线标准中物理层和数据链路层的所有功能,在汽车制造和其他的工业领域得到了十分广泛的应用。SJA1000有BasicCAN 模式和PeliCAN模式两种不同的协议模式。BasicCAN模式是复位时默认模式,这种模式与早期产品PCA82C200兼容,只支持CAN 2.0A协议;PeliCAN模式是新增加的工作模式,支持CAN 2.0B协议的一些新特性。
SJA1000的内部功能结构如图1所示,主要包括接口管理逻辑、发送缓冲器、接收缓冲器、验收过滤器、位流处理器、位定时逻辑和错误管理逻辑等功能单元。
2.2 CAN总线收发器PCA82C250
PCA82C250是NXP公司针对汽车中的高速应用而生产的CAN总线收发器。CAN总线收发器是CAN控制器和物理总线的接口,用于对总线提供差动发送能力和对CAN控制器提供差动接收能力。PCA82C250是目前应用最广泛的CAN总线收发器。设计CAN总线接口时,PCA82C250一般与CAN控制器(例如SJA1000)配合工作。
PCA82C250的内部功能结构如图2所示,主要包括基准电压、发送器、接收器、保护电路和工作模式控制电路等。
PCA82C250的工作模式:通过斜率电阻输入引脚(RS)的3种不同接法,可以设置PCA82C250的工作模式,如表1所示。
⑴高速模式。在高速工作模式下,发送器输出级晶体管将以尽可能快的速度打开和关闭,且不采用任何措施用于限制上升和下降的斜率。采用高速模式时,最好使用屏蔽电缆以避免射频干扰问题。通过把斜率电阻输入引脚(RS)接地选择高速模式。
⑵斜率控制模式。对于较低速度或较短总线长度的应用场合,可使用非屏蔽双绞线或平行线作为总线。此时,为降低射频干扰,应对上升斜率和下降斜率进行控制。上升斜率和下降斜率可通过由斜率电阻输入引脚(RS)接至地的连接电阻进行控制,斜率正比于斜率电阻输入引脚(RS)的电流输出。
⑶待机模式。通过斜率电阻输入引脚(RS)接至高电平选择低电流待机模式。在此模式下,发送器被关闭,而接收器转至低电流。若在总线上检测到显性位,RXD将变为低电平。微控制器应将PCA82C250转回至正常工作状态,以对此信号作出响应。注意:由于处在待机模式下,接收器是慢速的,因此,第一个报文将被丢失。
2.3 STC15F2K60S2单片机
STC15F2K60S2单片机是STC公司生产的单时钟/机器周期(1T)的单片机,指令代码完全兼容传统8051,但速度快8~12倍。内部集成高精度R/C时钟,5 MHz~ 35 MHz范围内可设置,可省掉外部电路的晶振和外部的复位电路,芯片内置2 KB容量的SRAM和60KB容量程序存储器。工作电压范围为3.8 V~5.5 V,是宽电压范围。
2.4 STC15F2K60S2单片机与SJA1000接口电路
stc15f2k60s2单片机与SJA1000接口电路主要包括数据线、地址线和控制线的接线设计,如图2-3所示。SJA1000的MODE接高电平选择Intel接口模式。STC15F2K60S2单片机的P0口接SJA1000的数据/地址总线,8位数据线用于单片机与SJA1000之间的数据传递,低8位地址线用于SJA1000内部的CAN地址寻址。STC15F2K60S2单片机可采用线选法提供片选信号,即SJA1000的片选线接P2口任意一个口线(高8位地址线)。图3中P2.7作为SJA1000的片选线,则片选地址为7F00H,片选地址和CAN地址相加得到SJA1000内部寄存器的地址。单片机和SJA1000的读写允许信号、地址锁存信号控制线对应连接即可。
2.5 CAN总线收发器电路
CAN总线收发器电路是指SJA1000与PCA82C250之间的电路,主要包括串行通信线和模式选择两部分。串行通信线包括串行数据发送线和串行数据接收线,如不采用光电隔离则SJA1000与PCA82C250对应连接即可,如图4所示。PCA82C250若需要使用待机模式时,RS引脚可以连接微控制器的I/O线P2.0;若不使用待机模式时,RS引脚可以经电阻接地(斜率控制模式)。
3 CAN总线接口软件设计
CAN总线接口软件设计主要分为初始化程序、发送子程序和接收子程序3部分。
3.1 SJA1000初始化程序
SJA1000要完成正常的CAN通信,需要进行必要的初始化参数设置。这些初始化参数包括验收过滤器、总线定时寄存器、输出驱动方式和中断系统等。这些设置实际上是对SJA1000内部相关寄存器的写操作。SJA1000初始化的程序流程如图5所示。
3.2 发送子程序
发送子程序主要分为3个流程:⑴判断SJA1000当前的状态是否允许报文发送;⑵将要发送的数据按照CAN协议规定的帧格式组成数据帧,存入SJA1000的发送缓冲器;⑶写发送命令。发送子程序流程如图6所示。发送前,一般检查3个状态位:一是接收状态,如果目前SJA1000正在接收报文,则不能发送,至少等本次接收完成后才能申请发送;二是检查发送完成状态,也即检查 SJA1000是否正在发送报文。如果正在发送,要等本次发送完成,才能启动新的发送任务;三是检查发送缓冲器是否被锁定,发送缓冲器处于不锁定状态,才能发送报文。
3.3 接收子程序
接收子程序的处理比发送子程序要复杂些。在接收子程序中,不仅要对接收数据作出处理,还要对各种错误、数据溢出等进行判断和处理,由于篇幅限制,本文只讨论对接收数据作出处理。接收子程序主要分为3个流程:⑴判断SJA1000是否有报文可以接收;⑵读取SJA1000的接收缓冲器中的报文;⑶写释放接收缓冲器命令。接收数据处理有:查询接收方式和中断接收方式两种。图7为查询方式接收子程序流程图。
本文介绍的采用STC15F2K60S2单片机结合SJA1000和PCA82C250芯片实现CAN总线的接口已经在某钢管厂无损探伤设备上得到了实际应用,原系统采用的是RS-232串行总线的形式,不仅工程安装复杂,成本高,而且数据传输速率低,实时更新慢,经常出现检查跟踪滞后的情况。采用CAN总线后,系统的抗干扰能力明显提高,特别是对微弱信号的分辨,较以前的系统有很大的改善,漏检率明显下降,保证了产品的合格率。
参考文献
[1] 曹小华,赵成. 基于现场总线CAN的实时监控系统研究与设计[J]. 武汉理工大学学报(交通与工程版),2005(6): 910-912.
[2] 李爱军. 四种现场总线的技术特点比较[J]. 城市轨道交通研究,2009(4):67-70.
[3] 邬宽明. CAN总线原理和应用系统设计[M]. 北京:北京航空航天大学出版社,1996.
[4] 孙兵,何瑾,陈广厦.基于DSP的CAN总线与以太网互联系统研制[J].仪器仪表学报,2008,29(2):377—380.
[5] 朱齐丹,汪瞳.CAN通信物理层建模与仿真口[J].计算机工程与应用,2008,44(36):11—15.
[6] 李真花, 崔健.CAN总线轻松入门与实践[M]. 北京:北京航空航天大学出版社, 2011.