CAN总线通信接口及程序设计毕业设计.docx
- 文档编号:24797967
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:20
- 大小:86.54KB
CAN总线通信接口及程序设计毕业设计.docx
《CAN总线通信接口及程序设计毕业设计.docx》由会员分享,可在线阅读,更多相关《CAN总线通信接口及程序设计毕业设计.docx(20页珍藏版)》请在冰豆网上搜索。
CAN总线通信接口及程序设计毕业设计
机电工程学院
毕业设计说明书
设计题目:
CAN总线通信接口及程序设计
2012年5月21日
目次
1CAN总线介绍
1.1CAN总线的发展背景
随着汽车产业的发展,需要一种更利于信息数据传输交换的通信协议。
汽车中的各种电子控制系统需要较高的技术支持,而随着汽车的发展,汽车是否安全、是否便利、成本是否低、是否舒适都已成为人们首要考虑的事情。
但是传统的汽车控制技术已不足以满足人们越来越高的要求,也已不适以汽车的发展方向。
20世纪80年代,德国Bosch公司着手研究用于汽车产业的新的通信协议及控制方法,并首先提出了CAN总线控制系统。
这一崭新的网络协议使得汽车产业得到了飞速的发展。
CAN总线最明显的特点是最大程度地减少了汽车控制系统中的线束的数量及长度,另外还大大提高了系统控制的可靠性和稳定性。
在没有CAN总线协议之前,一辆汽车中用于各种控制通信的线束的总长度达3公里之长,严重影响了汽车的通信速度和通信精度。
并且还使汽车的整体结构繁冗复杂,可靠性低,成本高,难以维护。
因此CAN总线的出现无疑具有重大的意义和作用。
作为一种新的网络通信协议,CAN总线不仅减少了汽车中线束的长度,还提高了汽车的整体性能,极大的促进了汽车产业的发展。
CAN总线刚被提出的时候,仅仅应用于汽车产业上,但CAN总线通信协议的性能和可靠性经过多年的检验,已被应用于越来越多的产业,比如航空、船舶、机床等产业设备方面。
仅仅二十多年的发展,CAN总线便已成为自动化领域技术的潮流。
CAN总线是串行通信网络。
传统运用的是基于R线构建分布式控制系统,这种传统的控制系统是基于通信节点的地址编码的,因此其结构复杂,直接导致系统的通信效率不高,并且控制的可靠性能低。
CAN总线通过每个网络节点进行数据通信,每个节点可以互相收发数据,CAN总线协议对通信数据编码,不对节点地址编码,使各个节点可以同时接收到相同的数据,大大增强了数据通信的实时控制及传输性能。
另一方面CAN总线使用起来非常方便。
CAN总线的结构十分简单,仅有2根线(CANH和CANL)和外部设备相连,但CAN总线的内部却有非常复杂和智能的通信模块,可以方便快捷准确无误的进行数据的自由通信。
1.2CAN总线的通信层介绍
CAN总线是串行通信协议,可以实现各个节点在数据传输时的自由通信及互不影响,因此CAN总线应具有标准的通信协议,这样可以使CAN总线更加方便的应用于控制系统中。
为了实现这样的设计理念,根据ISO/OSI参考模型,CAN总线包含ISO/OSI参考模型中的数据链路层(DataLinkLayer)和物理层(PhysicalLayer)。
(1)数据链路层
数据链路层连接硬件和软件的结合层,主要作用是通过各种数据协议而实现数据的传输。
CAN总线中的数据链路层又可以分为两个子层:
逻辑链路控制子层(LLC)和介质方向控制子层(MAC)。
逻辑链路控制子层是数据链路层的核心层,它为远程数据的传输提供服务,控制数据的逻辑传输。
(2)物理层
物理层是OSI参考模型中的最底层,主要作用是规定节点电气方面的特征。
为了实现数据的自由收发,在同一网络中的物理层应该是处处一样的。
1.3CAN总线报文帧格式
CAN总线上的数据信息都是以报文的形式发送的。
报文的格式并不唯一,而是有几种不同的格式,但是报文的长度却受到电气及内部控制的限制。
CAN总线的报文传输也就是帧的传输,帧是CAN总线传送数据单位。
帧也有不同的格式,主要区别在于标识符长度不同。
在CAN2.0A协议下帧具有11位标识符,叫作标准帧;而在最新的CAN2.0B协议下具有29位标识符的帧叫作扩展帧。
为了实现数据的传输和控制,CAN总线报文传输具有4种不同类型的帧结构:
数据帧、远程帧、错误帧、过载帧。
其中数据帧的结构图如图1-1所示。
详细的CAN总线报文帧结构可以参阅参考资料[6].
1.4CAN总线的优势
CAN总线已经成为现在控制领域最流行的控制方案,只所以从CAN总线诞生以来仅仅二十年间便已成为公认的最好的工业生产控制方案,是因为CAN总线相比其他控制总线在通信能力和速度方面具有明显的优势。
虽然现在还有很多基于R线组建的工业控制系统,但它不具备CAN总线的诸多优点。
相比于其他的控制系统,CAN的优势在于:
(1)CAN总线是多主工作方式,CAN总线舍弃了传统控制系统中站地址编码方法,而是对通信的数据进行编码,也就是说,CAN总线的节点是根据传输数据信息确定是否接收数据。
这样可以简化控制系统。
从面增强了CAN总线网络的数据通信能力,也提高了系统的可靠性。
(2)CAN总线的多个节点同时向总线上发送数据时,不会致使总线出现短路现象。
因为CAN总线是通过CAN收发器芯片的两个输出端CANH和CANL和物理总线连在一起的,但CANH端只能是高电平或者悬空状态,CANL只能是低电平或者悬空状态。
这样就使CAN节点同时向总线发送数据时,不会短路。
另外,CAN总线还有节点出现严重错误时自动关闭节点功能,以免其他节点受到影响。
2CAN总线通信芯片简述
2.1CAN总线控制器SJA1000简介
CAN总线只有OSI参考模式中的数据链路层和物理层,但要实现这两层的功能,必须制定相应的协议和控制规则。
通过CAN总线控制器可以实现对CAN总线的控制及数据通信。
CAN总线控制器是一块可编程的芯片,它与微处理器相接。
通过对CAN总线控制器的编程,实现数据的通信。
现在有许多类型的CAN控制器芯片,但工业上的控制系统最常用的还是SJA1000CAN控制器,下面简要介绍SJA1000CAN控制器。
SJA1000是Philips半导体公司研发的一种新型的CAN控制器,也是该公司PCA82C200CAN控制器的替代产品。
SJA1000中还加入了一种新的操作模式,PeliCAN模式,相比于此前的BasicCAN模式,这种模式支持最新的CAN2.0B协议。
为了使SJA1000兼容于PCA82C200芯片,SJA1000和PCA82C200相兼容,即SJA1000CAN控制器既有BasicCAN模式也有PeliCAN模式。
SJA1000的基本特性有:
扩展的64字节接收缓冲器、同时支持CAN2.0A和CAN2.0B协议、同时支持11位和29位标识码、通信速率可以达到1Mbps。
另外,PeliCAN模式下还有一些新的功能,如扩展到8个字节的验收滤波器、自检测等功能。
对于SJA1000工作在BasicCAN模式还是工作在PeliCAN模式,即工作方式的选择是由时钟分频寄存器(CDR)中的CAN模式位控制的。
通电默认的工作方式是BAsicCAN模式。
验收滤波器(AcceptanceFilter)是SJA1000中的核心寄存器,利用它,可以接收到预定中的数据。
验收滤波器又分为验收代码寄存器(ACR)和验收屏蔽寄存器(AMR)。
SJA1000中有4个ACR(ACR0、ACR1、ACR2、ACR3)和4个AMR(AMR0、AMR1、AMR2、AMR3)。
标识符也由原来的11位扩展到29位,而滤波方式也有两种,单滤波模式和双滤波模式(由模式寄存器中的AFM位决定)。
需要接收的报文的标识符存于验收代码寄存器中,相应的屏蔽位存放在验收屏蔽寄存器中。
只有在发送的报文的标识符与节点的标识符和AMR的相应位一致的情况下,节点才会接收报文。
下面主要介绍双滤波模式下扩展帧格式的验收滤波器的设置。
双滤波模式,顾名思义,就是有两个滤波器,滤波器1由ACR0、ACR1和AMR0、AMR1组成;滤波器2由ACR2、ACR3和AMR2、AMR3组成。
接收报文时报文中的标识符信息要与两个滤波器中的值比较,但并不是两个滤波器都必须通过才接收报文,而是只要有一个滤波器通过验收就可以接收报文了。
2.3PCA82C250CAN收发器介绍
CAN总线收发器是CAN控制器与物理总线之间的接口器件,它对总线提供差动发送和接收数据功能。
CAN总线收发器也决定着系统的安全性、可靠性和兼容性的优劣。
PCA82C250具有许多优越的性能。
在本次设计中PCA82C250仅仅用到了短路保护功能。
PCA82C250通过对引脚Rs的不同接法可以得到3种不同的工作模式:
高速模式、斜率控制模式和待机模式。
高速模式时VRs<0.3Vcc,VRs与地之间接1个0-1.8KΩ的电阻可以使PCA82C250工作在高速模式;斜率控制模式时与地之间接1个16.5KΩ-140KΩ的电阻;待机模式时Rs保持高电平,VRs要大于0.75Vcc。
3CAN总线的通信设计及方案
3.1CAN总线通信的技术要求及目标
本次设计主要是利用51单片机和CAN芯片SJA1000实现点对点的相互通信。
SJA1000是CAN控制器,主要用于一般的区域网络控制。
51单片机与SJA1000相连,SJA1000内的数据存储地址相当于51单片机的片外存储器,利用51单片机的片外寻址,对SJA1000内的各个寄存器进行读写,进而控制SJA1000实现CAN总线的点对点的通信。
另外,还需要接入CAN收发器82C250来实现CAN总线的发送和接收功能。
本次设计的目标是将51单片机、CAN控制器SJA1000和CAN收发器82C250连在一起,编写程序,实现点对点通信的收发。
3.2CAN总线通信接口方案
CAN总线的硬件电路的节口非常简单,只需要微处理器和CAN控制器及CAN收发器便可构成。
CAN总线通信接口通常情况下有2种实现方式:
一种是由微处理器、独立的CAN控制器和CAN收发器组成的硬件电路;另一种是集成CAN控制器的单片机和CAN收发器构成的硬件电路。
CAN总线在经过二十多年的发展,已经产生了许多类型的CAN总线协议的芯片,其中有独立的CAN控制器芯片,也有集成CAN控制器的微处理器芯片。
独立的CAN控制器有Philips公司的PCA82C200、SJA1000,Intel公司的82526、82527等。
集成CAN控制器的微处理器也有很多,比如Philips公司的P8XC592/598等。
常用的CAN收发器有Philips公司的PCA82C250等。
方案1:
由51单片机、SJA1000CAN控制器和PCA82C250CAN收发器组成的CAN通信节点
采用AT89C51、SJA1000CAN控制器和PCA82C250CAN收发器设计CAN通信节点。
这种方案的设计思路很简单,控制过程也比较方便。
通过AT89C51单片机编程控制SJA1000的初始化及收发数据。
SJA1000负责CAN总线上的数据的处理,PCA82C250收发器负责传递数据。
方案2:
由P8xC591芯片控制的CAN节点通信
Philips公司的P8xC591是集成CAN控制器的单片机,这个方案中的节点只需要P8xC591和82C250CAN收发器,CAN控制器内置于P8xC591芯片中。
虽然CAN控制器内置于P8xC591中,但P8xC591还保留SJA1000的一切功能,甚至比SJA1000的功能更加强大,这种方案还大大简化了硬件系统电路。
方案比较:
方案2中,集成CAN控制器的单片机P8xC591因为其内部已经内置了CAN控制器,所以不需要再进行电路设计,这样难以深入理解CAN总线的原理。
P8xC591芯片是一种高性能通信芯片,价格比较高。
在一般的系统控制中,实现简单的控制就可满足需要,常采用单片机和独立的CAN控制器作为CAN节点进行通信,这样成本低,也可以更好的了解CAN总线的通信协议。
另外,市场上有大量的单片机,使用独立的CAN控制器SJA1000可以根据控制要求选择适用的单片机,从而更好的达到控制要求。
因此,本设计采用方案1。
3.3CAN通信节点硬件电路设计
节点是网络上信息的接收和发送站。
我们平常所用的节点都是由微处理器、CAN控制器和CAN收发器组成的。
本设计中的硬件电路原理图如图3-1所示。
图3-1CAN总线电路原理图
由图3-1可以看出,电路主要由AT89C51单片机、SJA1000CAN控制器、PCA82C250CAN收发器组成。
由AT89C51控制SJA1000,实现SJA1000的初始化、接收和发送数据。
SJA1000的AD0~AD7分别接到AT89C51的P0口,CS接到AT89C51的P2.0。
当CS为低电平时(P2.0为0),CPU的片外存储器地址可选中SJA1000,这样CPU就可以通过这些地址对SJA1000相应的寄存器进行读/写操作。
SJA1000的WR、RD、ALE分别与AT89C51的对应引脚相连接,INT接AT89C51的INT0引脚。
对于一些较长距离通信的场合,要保证通信的可靠性和准确性,一般不直接将SJA1000的TX0和RX0和82C250的TXD和RXD相接。
而是通过高速光耦6N137后再与82C250相接。
这样的好处是大大增强了CAN总线节点的抗干扰能力。
但在本次设计中并没有采用6N137进行电气隔离,而是直接将SJA1000与82C250相接,因为本次设计不是远距离输送数据,相应的节点的抗干扰能力都可以满足设计要求,所以不需要再接入6N137,这样可以在满足控制要求的情况下简化系统的设计。
对于82C250与CAN总线的接口也要进行一些必要的防护措施。
82C250的CANH和CANL引脚是通过一个5Ω的电阻与CAN总线相接的,这个5Ω的电阻可以起到一定的限流作用,从而保护82C250免以受到过大电流。
4CAN总线通信的软件设计
CAN总线节点的软件设计一般包括三部分,即SJA1000的初始化、报文发送和报文接收。
这三部分是保证CAN总线通信的基础,总程序见附录1。
下面章节将对这三部分的通信设计进行详细的说明。
4.1SJA1000的初始化过程
SJA1000的初始化只能在复位模式下进行。
初始化过程主要是对一些寄存器设定初值,其中包括SJA1000工作方式的设置、AF的设置、波特率的设置和中断允许寄存器的设置。
在CAN总线通信中,只有先进行SJA1000的初始化才能保证CAN总线通信的顺利进行。
完成SJA1000的初始化后,SJA1000还要返回到工作模式,然后开始进行通信。
4.2SJA1000的发送子程序
SJA1000初始化之后,就可以进行通信的收发程序设计了。
发送子程序控制节点报文的发送。
将要发送的报文放在发送缓存区,然后通过中断程序判断是否向总线发送数据。
但是在将报文送入SJA1000的发送缓存区之前,先要对一些寄存器进行判断,然后才能开启发送。
本次设计中当SJA1000接收到报文后,应将接收到的报文放于发送缓存区中,然后再将此报文发送出去并在相应的界面上收到这组报文。
4.3SJA1000的接收子程序
接收子程序负责节点报文的接收。
在处理接收报文的同时,会出现各种情况。
要根据状态寄存器(SR)和命令寄存器(CMR)进行读写操作,然后判断需要接收的数据,完成接收过程。
本次设计中从串口工具界面上输入一组数据,然后发送到总线上,经过验收滤波器验收过滤之后,在相应的节点上接收到这组数据,并存入接收缓冲区。
图4-2SJA1000发送子程序流程图
设计总结
在设计之前,我没有听说过CAN总线通信协议。
自从看到CAN总线通信设计这个设计后,经过多方查阅相关资料和文献,我初步了解了CAN总线通信的有关协议和通信原理。
CAN总线的通信是借助单片机对CAN控制器进行相应的编程,以此实现数据的通信。
通常情况下,CAN总线通信可以达到很高的通信速率,满足大多数工业控制的要求,特别是虽着CAN控制器的发展,以及CAN通信协议的标准化,使CAN总线越来越多地运用于各行各业的控制系统中。
本次设计用AT89C51微处理器、SJA1000CAN控制器、PCA82C250CAN收发器组成CAN通信节点来进行CAN通信节点数据的收发。
经过仔细编程和调试,终于实现了CAN节点之间数据的收发通信。
但本次设计也有不足之处,我所设计的硬件电路图是极其简单的系统,其中没有包含抗干扰能力措施和防护措施,只能进行短距离的数据通信,若进行长距离的数据通信,可能受到各种电磁信号的干扰和辐射。
若要进行长距离的通信,在本次设计的基础上还需要增加一些防护措施,比如在CANH和CANL与地之间各接一个小电容,可以有效的防止电磁辐射。
总之,通过本次设计我还是学到了很多新的知识。
以前根本没有接触过CAN总线,现在我已经能够看懂简单的CAN总线通信程序和进行一些简单的CAN通信设计。
另外我还要感谢张老师在本次毕业设计中对我的指点和帮助,同时也要感谢同学们对我的帮助。
参考文献
[1]倪志莲.单片机应用技术(第2版).北京理工大学出版社.2011.
[2]邬宽明.CAN总线原理和应用系统设计北京:
北京航空航天大学出版社,1996.
[3]邬宽明.现场总线技术应用选编2[M].北京:
北京航空航天大学出版社,2004.
[4]李正军.现场总线及其应用技术[M].北京:
机械工业出版社,2005.
[5]张培人,王洪波.独立CAN总线控制器SJA1000.国外电子元器件,2001.
[6]邹继军.现场总线CAN原理与应用技术.北京:
北京航空航天大学出版社,2007.
[7]阳宪惠.现场总线技术及其应用[M].北京:
清华大学出版社,1999.
[8]万福君,潘松峰.单片微机原理系统设计与应用.中国科学技术大学出版社,2001.
[9]冯博琴,吴宁.微型计算机原理及应用.清华大学出版社.2011.
附录1(源程序)
硬件连接
AD0AD1AD2AD3AD4AD5AD6AD7
P10P11P12P13P14P15P16P17
CSCCANP32
INTCANINT1P33
RSP00
RSTCANP34
ALEP07
WRP36
RDP37
#include
#include
#include
#include
#include
voidmain()
{
unsignedchari;
WDT_CONTR=0x00;//关闭看门狗
P2=0x21;//关显示R接收
UartInital();
delayms(200);
TestCan();
}
voidTestCan();
sbitCANCSC=P3^2;
sbitRSTCAN=P3^4;//=1reset
sbitCANALE=P0^7;
sbitCANWR=P3^6;
sbitCANRD=P3^7;
#defineREG_CAN_CDR31
#defineREG_CAN_MOD0
#defineREG_CAN_BTR06
#defineREG_CAN_BTR17
#defineREG_CAN_OCR8
#defineREG_CAN_IER4
#defineREG_CAN_CMR1
#defineREG_CAN_SR2
#defineREG_CAN_IR3
#defineRBSR16
#defineRBSR117
#defineRBSR218
#defineRBSR319
#defineRBSR420
#defineRBSR521
#defineRBSR622
#defineRBSR723
#defineRBSR824
#defineRBSR925
#defineRBSR1026
#defineRBSR1127
#defineRBSR1228
#defineALC11//11//仲裁丢失捕捉寄存器
#defineECC12//12//误码捕捉寄存器
typedefstructCANPeremeter
{
unsignedcharCanAddr;
};
structCANPeremeterCANPeremeter1;
unsignedcharRXD_flag=0;
unsignedcharRead_SJA1000(unsignedcharAddr)
{
unsignedcharBuf;
CANALE=0;
CANWR=1;
CANCSC=1;
CANRD=1;
CANALE=1;
P1=Addr;
CANALE=0;
CANCSC=0;
CANRD=0;
P1=0xff;
Buf=P1;
CANRD=1;
CANCSC=1;
CANALE=0;
return(Buf);
}
voidWrite_SJA1000(unsignedcharAddr,unsignedcharData)
{
CANALE=0;
CANWR=1;
CANCSC=1;
CANRD=1;
CANALE=1;
P1=Addr;
CANALE=0;//地址锁存
CANCSC=0;//片选
CANWR=0;//写选通
P1=Data;//数据
CANWR=1;//
CANCSC=1;
CANALE=0;
}
voiddelayus(unsignedintt);
voidIO_Init()
{
P0=0XFF;
P1=0XFF;
P3=0XFF;
P4=0XFF;
P0M0=0X00;
P0M1=0X00;
P1M0=0X00;
P1M1=0X00;
P3M0=0X00;
P3M1=0X00;
EX1=1;
IT1=0;//CAN总线接收中断
//IT0=1;//外部中断0负边沿触发
//EX0=1;//打开外部中断0
EA=1;//打开总中断
}
unsignedcharRX_buffer[15];
voidCAN_RXD(void)interrupt2
{//接收数据函数,在中断服务程序中调用
unsignedcharBuf;
EA=0;//关CPU中断
IE1=0;
Buf=Read_SJA1000(REG_CAN_IR);
if(Buf&0x01)
{//IR.0=1接收中断
LED=0;
RX_buffer[0]=Read_SJA1000(RBSR);
RX_buffer[1]=Read_SJA1000(RBSR1);
RX_buffer[2]=Read_SJA1000(RBSR2);
RX_buffer[3]=Read_SJA1000(RBSR3);
RX_buffer[4]=Read_SJA1000(RBSR4);
RX_buffer[5]=Read_SJA1000(RBSR5);
RX_buffer[6]=Read_SJA1000(RBSR6);
RX_buffer[7]=Read_SJA1000(RBSR7);
RX_buffer[8]=Read_SJA1000(RBSR8);
RX_buffer[9]=Read_SJA1000(RBSR9);
RX_buffer[10]=Read_SJA1000(RBSR10);
RX_buffer[11]=R
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAN 总线 通信 接口 程序设计 毕业设计