前言
CAN(Controller AreaNetwork)属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。较之目前许多RS-485基于R线构建的分布式控制系统而言,基于CAN总线的分布式控制系统在以下方面具有明显的优越性:
首先,CAN控制器工作于多主方式,网络中的各节点都可根据总线访问优先权(取决于报文标识符)采用无损结构的逐位仲裁的方式竞争向总线发送数据,且 CAN协议废除了站地址编码,而代之以对通信数据进行编码,这可使不同的节点同时接收到相同的数据,这些特点使得CAN总线构成的网络各节点之间的数据通信实时性强,并且容易构成冗余结构,提高系统的可靠性和系统的灵活性。而利用RS-485只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行,系统的实时性、可靠性较差;
其次,CAN总线通过CAN控制器接口芯片82C250的两个输出端CANH和CANL与物理总线相连,而CANH端的状态只能是高电平或悬浮状态,CANL端只能是低电平或悬浮状态。这就保证不会出现象在RS-485网络中,当系统有错误,出现多节点同时向总线发送数据时,导致总线呈现短路,从而损坏某些节点的现象。而且CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现象在网络中,因个别节点出现问题,使得总线处于“死锁”状态。
而且,CAN具有的完善的通信协议可由CAN控制器芯片及其接口芯片来实现,从而大大降低系统开发难度,缩短了开发周期,这些是只仅仅有电气协议的RS- 485所无法比拟的。另外,与其它现场总线比较而言,CAN总线是具有通信速率高、容易实现、且性价比高等诸多特点的一种已形成国际标准的现场总线。这些也是目前 CAN总线应用于众多领域,具有强劲的市场竞争力的重要原因。
硬件电路设计
CAN遵循ISO的标准模型,分为数据链路层和物理层。在工程上,这两层通常由CAN控制器和收发器实现的。当前,市面上有两种CAN总线器件可供选择:一种是带有片上CAN的微控制器,如P8XC591/2、87C196CA/CB、MC68376、PowerPC555等,使用这种集成器件方便用户制作印制板,电路图也更紧凑;另外一种是独立的CAN控制器,如Philips SJA1000、Intel公司82526以及MCP2510(具有SPI接口,方便MCU连接)等, 使用独立的CAN控制器的潜在优势是,系统开发人员可以根据所需从众多种类的单片机中选择最理想的系统设计方案。
节点微控制器选用单片机80C196KC,CAN接口由独立控制器SJA1000和CAN控制器接口芯片82C250组成。SJA1000在软件上和引脚上都是与它的前款PCA82C200独立控制器兼容的,并增加了许多新功能:标准帧数据结构和扩展帧数据结构,并且这两种帧格作为式都具有单/双接收过滤器;64字节的接收FIFO;可读写访问的错误计数器和错误限制报警以及只听方式等等。
SJA1000有两种工作模式:Basic CAN模式和PeliCAN模式,其中PeliCAN模式全面支持CAN2.0B协议。SJA1000作为微控制器的片外扩展芯片,其片选引脚CS接在微控制器的地址译码器上,从而决定了CAN控制器各寄存器的地址。SJA1000通过CAN控制器接口芯片82C250连接在物理总线上。82C250器件提供对总线的差动发送能力和对CAN控制器的差动接受能力,完全和“ISO11898”标准兼容。其引脚8允许选择三种不同的工作方式:高速、斜率控制和待机。在低速和总线长度较短时,一般采用斜率控制方式,限制上升和下降斜率,降低射频干扰,斜率可通过由引脚8至地连接的电阻进行控制。斜率正比于引脚8 上的电流输出。为进一步提高系统抗干扰能力,在CAN控制器SJA1000和CAN控制器接口82C250之间加接6N137光电隔离芯片,并采用DC- DC变换器隔离电源。通信信号传输到导线的端点时会发生反射,反射信号会干扰正常信号的传输,因而总线两端接有终端电阻R1、R2,以消除反射信号,其阻值约等于传输电缆的特性阻抗。
软件设计
CAN总线节点要有效、实时地完成通信任务,软件的设计是关键,也是难点。它主要包括节点初始化程序、报文发送程序、报文接收程序 以及CAN总线出错处理程序等等。CAN控制器芯片SJA1000的内部寄存器是以作为微控制器的片外寄存器存在并作用的。微控制器和SJA1000之 间状态、控制和命令的交换都是通过在复位模式或工作模式下对这些寄存器的读写来完成的。在初始化CAN内部寄存器时注意使得各节点的位 速率必须一致,而且接、发双方必须同步。报文的接收主要有两种方式:中断和查询接收方式。
为提高通信的实时性,文中采用中断接收方式,而且这样也可保证接收缓存器不会出现数据溢出现象。SJA1000的Basic CAN工作模式是与其前一款PCA82C200独立控制器相兼容的模式, 而PeliCAN工作模式支持CAN协议中的更多功能,它的程序设计也与之有所不同。下面给出SJA1000工作在模PeliCAN式下的节点初始化、报文发送、报文接收的196汇编源程序。
INITIALIZE: 初始化子程序
LDB AL, #09H; 初始化模式寄存器进入复位模式
STB AL, MODE; 选择单滤波方式
LDB AL, #88H; 时钟分频器
STB AL, CDR; 选Peli CAN模式
LDB AL, #00H
STB AL, ACR0; 初始化接收代码寄存器
LDB AL, #60H
STB AL, ACR1
LDB AL, #00H
STB AL, AMR0; 初始化接屏蔽寄存器
LDB AL, #3FH; 只接收标识符为2,3的报文
STB AL, AMR1
LDB AL, #8FH
STB AL, IER; 中断使能寄存器
LDB AL, #01H; 总线定时寄存器0、1的设置
STB AL, BTR0;
LDB AL, #1CH; 在16MHz晶振情况下
STB AL, BTR1; 波特率设置为250
LDB AL, #0AAH
STB AL, OCR; 输出控制器寄存器设置
LDB AL, #0H; 接收缓存器起始地址设为0
STB AL, RBSA;
LDB AL, #01H;
ORB AL, MODE;
STB AL, MODE; 返回工作模式
RET TRANSMIT:; 发送子程序
LDB AL, SR
SRCVE: JBS AL,4, SRCVE;正接收?
STRSV: JBC AL,3, STRSV;发送成功?
STBF: JBC AL, 2, STBF; 发送缓存器锁定否
WID: LDB AL, #08H
LD BX, #TXB; 发送缓存的首址
STB AL,[BX]+; 传送两个字节的标识符
LDB AL,#ID0
STB AL,[BX]+
LDB AL,#ID1
STB AL,[BX]+
LDB COUT,#08H; 8个字节数据
TDATA: LDB AL,[DATA]+ CPU内的发送数据缓存区首址
STB AL,[BX]+;
DJNZ COUT,TDATA; 8个字节发完否?
LDB AL,#01H;
STB AL,CMR; 发送
RET
RECEIVE: ; 接收中断程序
PUSHF; 保护现场
LDB AL,IR
JBC AL,0,OTHER; 接收中断否?
LD BX,#RXB; 接收缓存器首址
LDB AL,[BX]+
JBC AL,6,RCDATA;标识符的RTR=1?
LDB AL,#04H; 是远程帧,释放接收缓存区
STB AL,CMR;
LCALL TRANSMIT; 相应远程帧,发送相应数据
SJMP BACK
RCDATA:
ANDB AL,#0FH; 取低四位数据长度
ADDB AL,#03H;
STB AL,R1; 该报文含有的字节数
LD BX,#RXB; 接收缓存器的首地址
LD CX,#CRBF; CPU内的接收数据缓存区首址
RECE:
LDB AL,[BX]+
STB AL,[CX]+
INCB R1
DJNZ R1,RECE; 接收完否?
LDB AL,#04H
STB AL,CMR; 释放接收缓存区
BACK;
POPF
RET
结语
CAN总线已被公认为是最有前途的几种现场总线之一。因其高性能价格比、实现简单等突出优点深得越来越多的研发人员的青睐。