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

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

总线上的节点是网络上的接收和发送站。智能节点能通过编程设置工作方式、ID地址、波特率等参数。它主要由单片机可编程的CAN通信控制器组成。本文介绍这类节点的硬件设计和软件设计。软件设计包括SJA1000的初始化、发送和接收等应用中的最基本的操块子程序。

引言

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

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved