基于SJA1000的CAN总线系统智能节点设计

2006-05-07 15:50:08来源: 互联网

引言

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公司的SJA1000和82C250芯片。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)的使用在以往的文章中已有介绍。至于其它一些寄存器或位功能的使用,没有在上述例程中体现出来,需要视实际情况而定。

编辑: 引用地址:http://www.eeworld.com.cn/designarticles/network/200605/3067.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部

小广播

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved