打造国内最大的IC交易平台
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
基于SJA1000的CAN总线系统智能节点设计
类别:通信网络  
 
作者:华东地质学院 邹继军 饶运涛 来源:《单片机与嵌入式系统应用》

摘要:CAN总线上的节点是网络上的接收和发送站。智能节点能通过编程设置工作方式、ID地址、波特率等参数。它主要由单片机和可编程的CAN通信控制器组成。本文介绍这类节点的硬件设计和软件设计。软件设计包括SJA1000的初始化、发送和接收等应用中的最基本的操块子程序。 关键词:总线 节点 CAN控制器 引言 CAN(Controller Area Network)总线,又称控制器局域网,是Bosch公司在现代汽车技术中领先推出的一种多主机局域网。由于其卓越的性能,极高的可靠性,独特灵活的设计和低廉的价格,现已广泛应用于工业现场控制、智能大厦、小区安防、交通工具、医疗仪器、环境监控等众多领域。CAN已被公认为几种最有前途的现场总线之一。CAN总线规范已被ISO国际标准组织制订为国际标准。CAN协议也是建立在国际标准组的开放系统互联参考模型基础上的,主要工作在数据链路层和物理层。用户可在其基础上开发适合系统实际需要的应用层通信协议,但由于CAN总线极高的可靠性,从而使应用层通信协议得以大大简化。 CAN总线与其它几种现场总线比较而言,是最容易实现、价格最为低廉的一种,但其性能并不比其它现场总线差。这也是目前CAN总线在众多领域被广泛采用的原因。节点是网络上信息的接收和发送站。所谓智能节点是由微处理器和可编程的CAN控制芯片组成,它们有两者合二为一的,如芯片P8XC59;有如本文介绍的独立的通信控制芯片与单片机接口。后者的优点是比较灵活。当然,也有不要微处理器的节点。下面以CAN通信控制器SJA1000为例,对CAN总线系统智能节点硬件和软件设计作一下全面的介绍。 一、CAN通信控制器SJA1000功能简介 CAN的通信协议主要由CAN控制器完成。CAN控制器主要由实现CAN总线协议的部分和实现与微处理器接口部分的电路组成。对于不同型号的CAN总线通信控制器,实现CAN协议部分电路的结构和功能大多相同,而与微处理器接口部分的结构和方式存在一些差异。这里主要以SJA1000为代表对CAN控制器的功能作一个简单介绍。 SJA1000是一种独立CAN控制器。它是PHILIPS公司的PCA82C200 CAN控制器的替代产品。SJA1000具有Basic CAN和Peli CAN两种工作方式。PeliCAN工作方式支持具有很多新特性的CAN 2.0B协议。 SJA1000在软件和引脚上都是与它的前一款PAC82C200独立CAN控制器兼容的(SJA1000引脚功能如表1所列),在此基础上增加了很多新的功能。为了实现软件兼容,SJA1000采用了两种工作方式:Basic CAN方式(PCA82C200兼容方式)和Peli CAN方式(扩展特性方式)。工作方式通过时钟分频寄存器中的CAN方式位来选择。上电复位默认工作方式是Basic CAN方式。Basic CAN和PeliCAN方式的区别如下: 在PeliCAN方式下,SJA1000有一个重新设计的含很多新功能的寄存器组。SJA1000包含PCA82C200中的所有位,同时增加了一些新的功能位。PeliCAN方式支持CAN2.0B协议规定的所有功能(29位的标识符)。

表1 SJA1000引脚功能 符 号 引 脚 功 能 AD0AD7 2,1,2823 地址/数据复用总线 ALE 3 ALE信号(INTEL方式)或AS信号(MOTOROLA方式) CS 4 片选输入,低电允许访问SJA1000 RD 5 微控制器的读信号(Intel方式)或E信号(MOTOROLA式) WR 6 微控制器的写信号(Intel方式)或读写信号(MOTOROLA方式) CLKOUT 7 SJA1000产生的提供给微控制器的时钟输出信号,此信号由内部振荡器经可编程分频器得到。可编程禁止该引脚 VSS1 8 逻辑电路地 XTAL1 9 振荡放大器输入,外部振荡放大器信号经此引脚输入 XTAL2 10 振荡放大器输出,使用外部振荡信号时此引脚必须开路 MODE 11 方式选择输入端:1=Intel方式,0=MOTOROLA方式 VDD3 12 输出驱动器5V电源 TX0 13 由输出驱动器0至物理总线的输出端 TX1 14 由输出驱动器1至物理总线的输出端 VSS3 15 输出驱动器地 INT 16 中断输出端,用于向微控制器提供中断信号 RST 17 复位输入端,用于重新启动CAN接口(低电平有效) VDD2 18 输入比较器5V电源 RX0,RX1 19,20 由物理总线至SJA1000输入比较器的输入端。显性电平将唤醒处于睡眠方式的SJA1000。当RX0高于RX1时,读出为隐性电平,否则为显性电平 VSS2 21 输入比较器地 VDD1 22 逻辑电路5V电源 SJA1000的主要新功能如下: *标准结构和扩展结构报文的接收和发送; *64字节的接收FIFO; *标准和扩展帧格式都具有单/双接收滤波器(含接收屏蔽和接收码寄存器); *可进行读/写访问的错误计数器; *可编程的错误报警限制; *最近一次的错误代码寄存器; *每一个CAN总线错误都可以产生错误中断; *具有丢失仲裁定位功能的丢失仲裁中断; *单发方式(当发生错误或丢失仲裁时不重发); *只听方式(监听CAN总线,无应答,无错误标志); *支持热插拔(无干扰软件驱动位速率检测); *硬件禁止CLKOUT输出。 二、智能节点硬件电路设计 本文中所设计的CAN总线系统智能节点,采用89C51作为节点的微处理器。在CAN总线通信接口中,采用PHILIPS公司的SJA100082C250芯片。SJA1000是独立CAN通信控制器,82C250为高性能CAN总线收发器。 图1所示为CAN总线系统智能节点硬件电路原理图。从图1中可以看出,电路主要由四部分构成:微控制器89C51、独立CAN通信控制器SJA1000、CAN总线收发器82C250和高速光电耦合器6N137。微处理器89C51负责SJA1000的初始化,通过控制SJA1000实现数据的接收和发送等通信任务。

SJA1000的AD0~AD7连接到89C51的P0口。CS连接到89C51的P2.0,P2.0为0的CPU片外存储器地址可选中SJA1000,CPU通过这些地址可对SJA1000执行相应的读写操作。SJA1000的RD、WR、ALE分别与89C51的对应引脚相连,INT接89C51的INT0。89C51也可通过中断方式访问SJA1000。 为了增强CAN总线节点的抗干扰能力,SJA1000的TX0和RX0并不是直接与82C250的TXD和RXD相连,而是通过高速光耦6N137后与82C250相连,这样就很好地实现了总线上各CAN节点间的电气隔离。不过,应该特别说明的一点是光耦部分电路所采用的两个电源VCC和VDD必须完全隔离,否则采用光耦也就失去了意义。电源的完全隔离可采用小功率电源隔离模块或带多5V隔离输出的开关电源模块实现。这些部分虽然增益了节点的复杂程序,但是却提高了节点的稳定性和安全性。 82C250与CAN总线的接口部分也采用了一定的安全和抗干扰措施。82CF250的CANH和CAHL引脚各自通过1个5Ω的电阻与CAN总线相连。电阻可起到一定的限流作用,保护82C250免受过流的冲击。CANH和CANL与地之间并联了2个30pF的小电容,可以起到滤除总线上的高频干扰和一定的防电磁辐射的能力。另外,在两根CAN总线接入端与地之间分别反接了1个保护二极管,当CAN总线有较高的负电压时,通过二极管的短路可起到一定的过压保护作用。82C250的Rs脚上接有一个斜率电阻,电阻大小可根据总线通信速度适当高调整,一般在16~140kΩ之间。 三、智能节点软件设计 CAN总线节点的软件设计主要包括三大部分;CAN节点初始化、报文发送和报文接收。熟悉这三部分程序的设计,就能编写出利用CAN总线进行通信的一般应用程序。当然要将CAN总线应用于通信任务比较复杂的系统中,还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。下面仅就前面提出的三部分程序的设计作一个描述,以供大家在实际应用中参考。 1.初始化子程序 SJA1000的初始化只有在复位模式下才可以进行。初始化主要包括工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器(AMR)和接收代码寄存器(ACR)的设置、波特率参数设置和中断允许寄存器(IER)的设置等。在完成SJA1000的初始化设置以后,SJA1000就可以回到工作状态,进行正常的通信任务。下面提供了SJA1000初始化的51汇编源程序。程序中寄存器符号表示的是SJA1000相应寄存器占用的片外存储器地址,这些符号可在程序的头部用伪指令EQU进行定义。后文对这一点不再作特别说明。 CANINI: MOV DPTR,#MODE ;方式寄存器 MOV A,#09H ;进放复位模式,对 ;SJA1000进行初始化 MOVX @DPTR,A MOV DPTR,#CDR ;时钟分频寄存器 MOV A,#88H ;选择PeliCAN模式, ;关准备时钟输出(CLKOUT) MOVX @DPTR,A MOV DPTR,#IER ;中断允许寄存器 MOV A,#0DH ;开发发送中断、超 ;载中断和错误警告中断 MOVX @DPTR,A MOV DPTR,#AMR ;接收屏蔽寄存器 MOV R6,#4 MOV R0,#DAM ;接收屏蔽寄存器内容 ;在片内RAM中的首址 AMR:MOV A,@R0 MOVX @DPTR,A ;接收屏蔽寄存器赋初值 INC DPTR DJNZ R6,AMR MOV DPTR,#ACR ;接收代码寄存器 MOV R6,#4 MOV R0,#DACR ;收收代码寄存器内容 ;在片内RAM中的首址 ACR:MOV A,@R0 MOVX @DPTR,A 接收代码寄存器赋初值 INC DPTR DJNZ R6,ACR MOV DPTR,#BTR0 ;总线定时寄存器0 MOV A,#03H MOVX @DPTR,A MOV DPTR,#BTR1 ;总线定时寄存器1 MOV A,#0FFH ;16MHz晶振情况下, ;设置波特率为80kbps MOVX @DPTR,A MOV DPTR,#OCR ;输出控制寄存器 MOV A,#0AAH MOVX @DPTR,A MOV DPTR,#RBSA ;接收缓存器起始 ;地址寄存器 MOV A,#0 ;设置接收缓存器 ;FIFO起始地址为0 MOVX @DPTR, A MOV DPTR,#TXERR ;发送错误计数寄存器 MOV A,#0 ;清除发送错误计数寄存器 MOVX @DPTR,A MOV DPTR,#ECC ;错误代码捕捉寄存器 MOVX A,@DPTR ;清除错误代码捕捉寄存器 MOV DPTR,#MODE ;方式寄存器 MOV A,#08H ;设置单滤波接收方式 ;并返回工作状态 MOVX @DPTR,A RET 2.发送子程序 发送子程序负责节点报文的发送。发送时用户只需将待发送的数据按特定格式组合成一帧报文,送入SJA1000发送缓存区中,然后启动SJA1000发送即可。当然在往SJA1000发送缓存区送报文之前,必须先作一些判断(如下文程序所示)。发送程序分发送远程帧和数据帧两种。远程帧无数据场。下面以发送数据帧为例对发送子程序作一个说明。 TDATA:MOV DPTR,#SR ;状态寄存器 MOVX A,@DPTR ;从SJA1000读入 ;状态寄存器值 JB ACC.4,TDATA ;判断是正在接收, 正在接收则等待 TS0:MOVX A,@DPTR JNB ACC.3,TS0 ;判断上次发送是否完成,未完成则等待发送完成 TS1:MOVX A,@DPTR JNB ACC.2,TS1 :判断发送缓冲区是否 ;锁定,锁定则等待 TS2:MOV DPTR,#CANTXB ;SJA1000发送缓 ;存区首址 MOV A,#88H ;发送数据长度为8个 ;字节的扩展帧格式报文 MOVX @DPTR,A INC DPTR MOV A,#ID0;4个字节的标识符(ID0~ID3), ;依据实际情况赋值 MOVX @DPTR,A INC DPTR MOV A,#ID1 MOVX @DPTR,A INC DPTR MOV A,#ID2 MOVX @DPTR,A INC DPTR MOV A,#ID3 MOVX @DPTR,A MOV R0,#TRDATA;CPU发送数据区首 ;址,数据内容由用户定义 MTBF:MOV A,@R0 INC DPTR MOVX @DPTR,A INC R0 CJNE R0,#TRDATA+8,MTBF;向发送缓 ;冲区写8个字节 MOV DPTR,#CMR ;命令寄存器地址 MOV A,#01H MOVX @DPTR,A ;启动SJA1000发送 RET 3.查询方式接收子程序 接收子程序负责节点报文的接收以及其它情况处理。接收子程序比发送子程序要复杂一些,因为在处理接收报文的过程中,同时要时诸如总线脱离、错误报警、接收溢出等情况进行处理。SJA1000报文的接收主要有两种方式:中断接收方式和查询接收方式。如果对通信的实时性要求不是很强,建议采用查询接收方式。两种接收方式编程的思路基本相同。下面仅以查询方式接收报文为例对接收子程序作一个说明。 SEARCH: MOV DPTR,#SR ;状态寄存器地址 MOVX A,@DPTR ANL A,#0C3H ;读取总线脱离、错误状 ;态、接收溢出、有数据等位 JNZ PROC RET ;无上述状态,结束 PROC:JNB ACC.7, PROCI BUSERR: MOV DPTR,#IR :IR中断寄存器, ;出现总线脱离 MOVX A,@DPTR ;读中断寄存器, ;清除中断位 MOV DPTR,#MODE ;方式寄存器地址 MOV A,#08H ; MOVX @DPTR,A ;将方式寄存器复位, ;清求位清0 LCALL ALARM. ;调用报警子程序 RET NOP PROC1:MOV DPTR,#IR ;总线正常 MOVX A,@DPTR ;读取中断位 JNB ACC.3,OTHER OVER: MOV DPTR,#CMR ;数据溢出中断置位 MOV A,#0CH MOVX @DPTR,A;在命令寄存器中精除数 ;据溢出和释放接收缓冲区 RET NOP OTHER:JB ACC.0,RECE;IR.0=1,接收FIFO ;示满或接收中断使能 LJMP RECOUT ;IR.0=0,接收缓冲区 ;无数据,退出接收 NOP RECE:MOV DPTR,#CANRXB;接收缓冲区首地 ;地(16),准备读取数据 MOVX A,@DPTR ;首字节是接收帧格式字 JNB ACC.6,RDATA ;RTR=1是远程 ;请求帧,无数据 MOV DPTR,#CMR ; MOV A,#04H ;CMR.2=1释放接收缓冲区 MOVX @DPTR,A ;只有接收了数据才能 ;释放接收缓冲区 LCALL TDATA ;发送对方请求的数据 LJMP RECOUT ;退出接收 NOP RDATA:MOV DPTR,#CANRXB; 读取并保存接收 ;缓冲区的数据 MOV R1,#CPURBF ;CPU片内接收 ;缓冲区首址 MOVX A,@DPTR ;读取CAN缓冲区 ;的2个字节 MOV @R1,A ;保存 ANL A,#0FH ;截取低4位是; 数据长度(0~8) ADD A,#4 ;加4个字节的标识符(ID) MOV R6,A RDATA:INC DPTR INC R1 MOVX A,@DPTR MOV @R1,A DJNZ R6,RDATA0 循环读取与保存 MOV DPTR,#CMR MOV A,#04H ;释放CAN接收缓冲区 MOVX @DPTR,A RECOUT:MOV DPTR,#ALC ;释放仲裁丢失捕捉 ;寄存器和错误捕捉寄存器 MOVX A,@DPTR MOV DPTR,#ECC MOVX A,@DPTR NOP RET 结束语 上述介绍的是SJA1000工作在Peli CAN模式下的三种最基本的操作子程序。由于篇幅的关系,这里没有列出和解决SJA1000内部寄存器的地址和位定义。有关接收屏蔽寄存器(AMR)和接收编码寄存器(ACR)的使用在以往的文章中已有介绍。至于其它一些寄存器或位功能的使用,没有在上述例程中体现出来,需要视实际情况而定。