基于CAN总线的开关控制电路设计与实现

2018-03-23 03:45徐志山
关键词:发送数据收发器寄存器

徐志山

(宣城职业技术学院 机械与汽车工程系,安徽 宣城 242000)

1 CAN总线概述

CAN(Controller Area Network)为控制器局域网之意,是基于工业控制的现场总线(Field bus)的一种形式[1],称为CAN总线.CAN总线最早由德国Bosch公司开发用于汽车上多个电子控制模块间的通信,目的是提高通信可靠性,实现了汽车电控系统由分散控制向网络控制的转变,形成了车载网络通信系统[2].早在1993年国际标准化组织(ISO)就通过了CAN总线通信协议.CAN总线通信协议包括两部分,即CAN2.0A和CAN2.0B,它们的主要区别在于信息报文的格式不同,CAN2.0A提供11位的报文地址,而CAN2.0B提供29位的报文地址,所以,CAN2.0A被称为BasicCAN,而CAN2.0B被称为PeliCAN[3].

实际的CAN总线通信是发生在单片机之间的串行通信,但不是单片机之间的直接通信,而是发生在以单片机为核心的通信设备物理层和数据链路层之间的信息传输,其中,物理层是CAN总线的硬件层,主要实现物理信号传输、译码、位定时、位同步和位驱动,而数据链路层能够实现数据的总线仲裁、信息分段以及数据拆封、数据应答、错误检测、超载通知等功能[4].要实现CAN总线通信,关键是CAN总线通信的硬件设计和软件设计,在硬件设备上有的采用8位单片机,如PIC16F877[5],有的采用16位单片机,如MC9S12X128[6],而SJA1000和TJA1050一直是作为CAN总线通信的控制器和收发器.江苏启东计算机厂生产的DVCC-51NET单片机开发板装有SJA1000和TJA1050芯片,在开发板上插入STC89C52芯片作为主控芯片,将TJA1050的端子CAN-H(端子7)和CAN-L(端子6)用双绞线与其他有同样装置的开发板连接起来,就可以进行CAN总线开关控制设计.

2 CAN总线开关控制电路硬件设计

按照CAN总线通信物理层协议要求,CAN总线通信就是通过专用的通信线(一般是屏蔽双绞线)将若干个通信模块并联起来,每个通信模块叫做CAN节点.对于非集成式CAN节点至少包括3部分,即:节点主控单元(单片机)、CAN控制器、CAN收发器.节点主控单元负责与CAN控制器联络,并不断地采集和处理外围信息;CAN控制器类似于节点主控单元的外部RAM设备,它不仅具有存储功能,而且还具有控制功能,主要负责信息成帧与解帧,再通过串行传输方式与CAN收发器联系,将信息发送或接收;CAN收发器是CAN控制器的“端口”,负责转换和传输信息.

图1 CAN总线通信节点控制电路局部示意图

3 CAN总线开关控制电路软件设计

3.1 CAN总线通信软件设计规则

3.1.1 数据信息规则

CAN总线通信信息在节点内是0、1代码组成的数据,通过TJA1050向总线发送时转变成电压信号.TJA1050具有传输速度高(最高可达1兆波特)、电磁辐射低、电磁干扰小和输入范围宽的特性.在发送端,对于高速CAN(如500千波特),当节点向总线发送“0”位时,CAN-H线电压为3.5 V,CAN-L线电压为1.5 V,称“显性”状态;当发送“1”位时,CAN-H线与CAN-L线电压近乎相等,约为2.5 V,称“隐性”状态.对于低速CAN(如100千波特),当节点向总线发送显性位“0”时,CAN-H线电压为3.6 V左右,CAN-L线为1.4 V左右;发送隐性位“1”时,CAN-H线电压为0 V,而CAN-L线为5 V.在接收端,TJA1050将CAN总线上的电压信号还原成0、1数据位.

3.1.2 数据发送规则

CAN总线上的节点可主动向网络上其他节点发送数据,为了防止总线上多节点间发送数据产生冲突,CAN总线通信协议规定:数据成帧发送,称为数据帧,每个数据帧包括7个域(起始域、仲裁域、控制域、数据域、校验域、应答域和结束域),节点发送数据帧时,先发送起始域,再发送仲裁域.当节点发送数据出现竞争时,只有获得仲裁权的节点才可以发送控制域、数据域、校验域,直至一帧数据发送完毕.仲裁权是根据仲裁域数值的大小来确定的,其数值越小优先级越高.实际上,总线上的节点都有自己的仲裁域,根据需要可以将各个节点设定为不同的值,这样避免了数据发送时出现的竞争现象.一帧数据被发送完毕,发送节点CAN控制器的状态寄存器自动产生“发送中断”信号,有利于节点主控单元的中断或查询处理.

3.1.3 数据接收规则

TJA1050采用“差分式”接收数据,按“位”以串行的方式送到SJA1000,在SJA1000内经物理同步后被解除填充位,自动进行错误检测,以“并行”方式通过验收滤波器,验收过的数据移入SJA1000的RXFIFO(接收缓冲区)区.这时,在STC89C52指令的作用下可将RXFIFO中有用数据读出,同时执行输出指令,将接收到的有用数据对外输出,并释放SJA1000内接收缓冲区,为下一次接收新的数据做准备.

3.2 CAN总线通信软件设计步骤

CAN总线通信系统软件设计包括:SJA1000初始化、SJA1000中断处理、数据发送、数据接收及输出、数据输入和主程序.

3.2.1 SJA1000初始化

SJA1000的初始化可按下列步骤进行.

第一步,复位.STC89C52对SJA1000片外寻址,赋予SJA1000控制寄存器(CR)的初值为01H,这时SJA1000控制寄存器“复位请求”位(CR.0)置1,即可使SJA1000进入复位状态.

第二步,CAN总线波特率的设置.波特率的大小反映了位传输速率,CAN总线波特率的设置要考虑CAN通信驱动设备的能力.SJA1000有两个定时寄存器:BTR0和BTR1,BTR0用于确定位传输速率的预设值,而BTR1用于确定位定时,由BTR0和BTR1就可以确定位传输速率及其允许的变化范围.

第三步,设置接收报文标识符.CAN通信协议没有明确规定标识符的分配,任何一个节点发送的数据都是有用的,总有其他节点接收.为了明确表示数据的传输方向,对于采用11位标识符的通信节点来说,将接收数据节点的标识符数据高8位存放在发送节点验收代码寄存器(ACR)中,同时在发送数据缓冲区起始的两个字节空间中存放接收节点的标识符和控制域,以确定接收节点及其应该接收的数据字节的个数.

第四步,输出控制寄存器的设置.输出控制寄存器的设置取决于SJA1000和TJA1050的连接情况,由于SJA1000的TX0、RX0分别通过一个定值电阻(390 Ω)连接到TJA1050的TXD和RXD端,为此采用正常输出模式,推挽输出,数据位为“0”时输出极性为“高”,数据位为“1”时输出极性为“低”.

第五步,时钟分频寄存器的设置.将时钟分频寄存器的最高位赋0值,在此采用CAN2.0A模式;将该寄存器的次高位置1,只需激活SJA1000的RX0端子,RX1端子接地;时钟分频寄存器BIT5位为0,无需用TX1端子中断输出;“关闭时钟”位(BIT3)置位,禁用SJA1000的时钟引脚CLKOUT,频率选择位CD2~CD0取值不受限制.

第六步,进入工作模式.回到SJA1000的控制寄存器(CR),将CR.0位赋0值,即可进入工作模式.由于采用单字节的输入输出信号,不会产生溢出和错误中断,所以只需允许SJA1000的接收中断和发送中断,赋予控制寄存器的值为06H符合要求.

3.2.2 SJA1000中断处理子程序

SJA1000中断寄存器对于STC89C52来说是只读寄存器,可产生中断标志.STC89C52把SJA1000的中断信号作为外部中断来处理,当SJA1000有接收中断或发送中断发生时,中断寄存器中相应的位被置“1”,使STC89C52产生中断,STC89C52随即去执行中断服务——处理中断子程序.若发生SJA1000接收中断,STC89C52立即从SJA1000接收缓冲区接收数据;若发生SJA1000发送中断,STC89C52会从输入设备接收新的数据,为下一次发送做准备.接收中断和发送中断不会同时发生,但有先后顺序.

3.2.3 数据发送子程序

数据采用定时发送,利用STC89C52定时器的定时功能,每隔一定时间向SJA1000启动一次数据发送指令.若选择LED灯做输出设备,应选择不高于40 ms的时间间隔,可以避免LED灯的闪烁现象,但是发送数据的间隔时间应高于发送数据的时间.发送数据时,应将存放在STC89C52发送缓冲区的数据传送到SJA1000的发送缓冲区,先发送接收节点仲裁域的高8位,紧接着发送其低3位、控制域和数据域,直至数据发送完毕,再向SJA1000启动数据发送指令,一旦SJA1000出现“发送中断”信号,表示一帧数据发送完毕.

3.2.4 数据接收及输出子程序

CAN节点接收数据有两种方法:中断接收和查询接收,在此启用中断接收方式.由于CAN总线数据采用“广播式”发送,按照仲裁规则,只有获得仲裁权的节点方可接收数据,获得仲裁的节点将数据的仲裁域、控制域和数据域依次有序接收到SJA1000的接收缓冲区,并向接收节点STC89C52产生接收中断信号.接收节点STC89C52收到中断信号后,就可以采用片外寻址的方式将接收节点SJA1000接收缓冲区中有用数据(对方8255A输入数据)存储下来,并送到接收节点STC89C52的接收缓冲区保存,同时接收节点STC89C52向己方8255A输出,在LED上显示从总线接收的有用信号.

8255A输出数据子程序如下.

8255A_OUT:

MOV DPTR, #9003H ;向8255A写指令

MOV A, #90H

MOVX @DPTR, A

MOV R0, #RCV_BUFF3 ;有用数据存放位置

MOV A, @R0

MOV DPTR, #9001H ;指向8255A的PB口

MOVX @DPTR, A ;向8255A的PB口输出

RET

3.2.5 数据输入子程序

输入数据来自于拨码开关的位置信息,首先将接收方的状态域和控制域存入STC89C52的发送缓冲区,紧接着向8255A写入命令字,设置8255A各个端口的状态,将PA口作为输入端口,PB口作为输出端口.读入双掷开关状态(高电平、低电平)的位置信息,存入控制域之后的发送缓冲区内.

8255A数据输入子程序如下.

8255A_IN:

MOV R0, #SEND_BUFF1 ;R0指向发送缓冲区

MOV @R0, #02H ;接收节点仲裁域高8位

INC R0

MOV A, #01H ;发送数据个数

MOV @R0, A ;将A的值送到SEND_BUFF2

MOV DPTR, #9003H ;指向8255A控制口

MOV A, #90H

MOVX @DPTR, A ;发送指令

MOV DPTR, #9000H ;指向8255A的PA口

MOVX A, @DPTR

MOV SEND_BUFF3, A ;输入数据送到指定的存储区

RET

3.2.6 主程序

主程序执行时,节点向总线定时发送数据.为了节省CPU资源,采用STC89C52的定时器T0,设置为工作方式1、定时40 ms,开放定时器T0中断、外部中断0中断及总中断,对SJA1000初始化,当SJA1000进入工作模式后,总线上节点静听CAN总线数据变化.如果某个节点符合接收条件,将总线数据立即保存到节点的SJA1000的RXFIFO,并产生“接收中断”,随后将接收到的对方双掷开关信号通过8255A的PB口输出到LED灯动态显示;当定时器产生中断信号时,STC89C52启动向SJA1000传输数据,并启动发送命令,将数据发送到总线上.数据发送完毕,SJA1000发送缓冲区被释放,STC89C52可以重新接收双掷开关的输入信号,等待下一次数据发送.

4 CAN总线通信开关控制实现

为了实现CAN总线通信,现以两个DVCC-51NET开发板为例,分别称为1号节点和2号节点,每个节点按照图1所示的示意图连接线路.双掷开关K0,K1,…,K7作为输入设备,LED灯L0,L1,…,L7作为输出设备,STC89C52、SJA1000和TJA1050分别为节点主控单元、节点CAN控制器、节点CAN收发器.初始状态1号节点和2号节点的双掷开关全置于高电平(输入值为FFH),程序运行时,两个开发板的LED灯均点亮.当将1号节点的某一双掷开关(如K0)拨到低电平状态(输入为0),此时1号节点接收到输入数据为FEH,1号节点将数据发送到总线上,总线上的2号节点处于接收状态,将接收到的数据送到2号节点8255A的PB口输出,输出端口PB的数据为FEH,经反向驱动器74LS240后,驱动器使L0的控制端为高电平,这时2号节点L0灯熄灭,这样实现了1号节点的开关控制了2号节点相应灯的亮灭,反过来也能实现.

5 总结

由于STC89C52单片机具有通信速度快、可靠性强的特点,采用STC89C52单片机开发CAN总线通信,可实现总线式控制,并可实现多个节点实时控制.在CAN总线通信系统中,CAN控制器是至关重要的芯片,但不能脱离单片机而独立工作,如果说单片机是通信的控制器,则CAN控制器是通信的执行器.CAN总线通信的关键就是单片机对CAN控制器的访问和信息传输,主要是CAN控制器寄存器的设置及其状态查询,只有把握各个寄存器的功能及对寄存器的编程方法,才能有效实现CAN总线通信.CAN收发器是总线的驱动设备,总线并联的节点越多,对收发器的驱动能力要求也越高,收发器还决定了总线的电平状态.8255A在此用作单片机端口的扩展芯片,仅能接收和输出数字信号,双掷开关和LED灯只作为简易的输入和输出设备,如果是模拟输入和大功率输出,还需增加其他电子设备(如模数转换、功率放大电路),同时还要考虑电源的承载能力.

[1] 唐继英.现场总线技术[M].天津:天津大学出版社,2008:161-188.

[2] 刘春晖,刘宝君.汽车车载网络技术详解[M].北京:机械工业出版社,2016:1-5.

[3] 牛跃听,周立功,穆希辉,等.CAN总线应用层协议实例解析[M].北京:北京航空航天大学出版社,2014:33-48.

[4] 李勇.汽车单片机及车载网络技术[M].北京:电子工业出版社,2012:176-180.

[5] 孙鹏,沈显庆,周杰.基于PIC单片机和SJA1000的CAN通信实现[J].机电一体化,2010(4):70-74.

[6] 宋春宁,童广浙,林小峰.磷酸铁锂储能电池管理系统设计[J].电源技术,2015(10):2096-2098.

猜你喜欢
发送数据收发器寄存器
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
光纤收发器故障排除经验谈
一种车载自组织网络的媒体接入控制协议
带标记方式的CRDSA++协议性能分析*
移位寄存器及算术运算应用
Virtex5 FPGA GTP_DUAL硬核两个收发器独立使用的实现
多优先级无时隙CSMA/ CA算法研究
测试软件简介
Lx5280模拟器移植设计及实施