CAN总线通信接口及程序设计毕业设计

CAN总线通信接口及程序设计毕业设计
CAN总线通信接口及程序设计毕业设计

机电工程学院

毕业设计说明书设计题目: CAN总线通信接口及程序设计

2012 年 5 月21 日

目次

1 CAN总线介绍

1.1 CAN总线的发展背景

随着汽车产业的发展,需要一种更利于信息数据传输交换的通信协议。汽车中的各种电子控制系统需要较高的技术支持,而随着汽车的发展,汽车是否安全、是否便利、成本是否低、是否舒适都已成为人们首要考虑的事情。但是传统的汽车控制技术已不足以满足人们越来越高的要求,也已不适以汽车的发展方向。20世纪80年代,德国Bosch公司着手研究用于汽车产业的新的通信协议及控制方法,并首先提出了CAN总线控制系统。这一崭新的网络协议使得汽车产业得到了飞速的发展。

CAN总线最明显的特点是最大程度地减少了汽车控制系统中的线束的数量及长度,另外还大大提高了系统控制的可靠性和稳定性。在没有CAN总线协议之前,一辆汽车中用于各种控制通信的线束的总长度达3公里之长,严重影响了汽车的通信速度和通信精度。并且还使汽车的整体结构繁冗复杂,可靠性低,成本高,难以维护。因此CAN总线的出现无疑具有重大的意义和作用。作为一种新的网络通信协议,CAN总线不仅减少了汽车中线束的长度,还提高了汽车的整体性能,极大的促进了汽车产业的发展。

CAN总线刚被提出的时候,仅仅应用于汽车产业上,但CAN总线通信协议的性能和可靠性经过多年的检验,已被应用于越来越多的产业,比如航空、船舶、机床等产业设备方面。仅仅二十多年的发展,CAN总线便已成为自动化领域技术的潮流。

CAN总线是串行通信网络。传统运用的是基于R线构建分布式控制系统,这种传统的控制系统是基于通信节点的地址编码的,因此其结构复杂,直接导致系统的通信效率不高,并且控制的可靠性能低。CAN总线通过每个网络节点进行数据通信,每个节点可以互相收发数据,CAN总线协议对通信数据编码,不对节点地址编码,使各个节点可以同时接收到相同的数据,大大增强了数据通信的实时控制及传输性能。另一方面CAN总线使用起来非常方便。CAN总线的结构十分简单,仅有2根线(CANH和CANL)和外部设备相连,但CAN总线的内部却有非常复杂和智能的通信模块,可以方便快捷准确无误的进行数据

的自由通信。

1.2 CAN总线的通信层介绍

CAN总线是串行通信协议,可以实现各个节点在数据传输时的自由通信及互不影响,因此CAN总线应具有标准的通信协议,这样可以使CAN总线更加方便的应用于控制系统中。为了实现这样的设计理念,根据ISO/OSI参考模型,CAN总线包含ISO/OSI参考模型中的数据链路层(Data Link Layer)和物理层(Physical Layer)。

(1)数据链路层

数据链路层连接硬件和软件的结合层,主要作用是通过各种数据协议而实现数据的传输。CAN总线中的数据链路层又可以分为两个子层:逻辑链路控制子层(LLC)和介质方向控制子层(MAC)。逻辑链路控制子层是数据链路层的核心层,它为远程数据的传输提供服务,控制数据的逻辑传输。

(2)物理层

物理层是OSI参考模型中的最底层,主要作用是规定节点电气方面的特征。为了实现数据的自由收发,在同一网络中的物理层应该是处处一样的。1.3 CAN总线报文帧格式

CAN总线上的数据信息都是以报文的形式发送的。报文的格式并不唯一,而是有几种不同的格式,但是报文的长度却受到电气及内部控制的限制。CAN 总线的报文传输也就是帧的传输,帧是CAN总线传送数据单位。帧也有不同的格式,主要区别在于标识符长度不同。在CAN2.0A协议下帧具有11位标识符,叫作标准帧;而在最新的CAN2.0B协议下具有29位标识符的帧叫作扩展帧。

为了实现数据的传输和控制,CAN总线报文传输具有4种不同类型的帧结构:数据帧、远程帧、错误帧、过载帧。其中数据帧的结构图如图1-1所示。

详细的CAN 总线报文帧结构可以参阅参考资料[6].

1.4 CAN 总线的优势

CAN 总线已经成为现在控制领域最流行的控制方案,只所以从CAN 总线诞生以来仅仅二十年间便已成为公认的最好的工业生产控制方案,是因为CAN 总线相比其他控制总线在通信能力和速度方面具有明显的优势。虽然现在还有很多基于R 线组建的工业控制系统,但它不具备CAN 总线的诸多优点。相比于其他的控制系统,CAN 的优势在于:(1)CAN 总线是多主工作方式,CAN 总线舍弃了传统控制系统中站地址编码方法,而是对通信的数据进行编码,也就是说,CAN 总线的节点是根据传输数据信息确定是否接收数据。这样可以简化控制系统。从面增强了CAN 总线网络的数据通信能力,也提高了系统的可靠性。

(2)CAN 总线的多个节点同时向总线上发送数据时,不会致使总线出现短路现象。因为CAN 总线是通过CAN 收发器芯片的两个输出端CANH 和CANL 和物理总线连在一起的,但CANH 端只能是高电平或者悬空状态,CANL 只能是低电平或者悬空状态。这样就使CAN 节点同时向总线发送数据时,不会短路。另外,CAN 总线还有节点出现严重错误时自动关闭节点功能,以免其他节点受到影响。数据帧 帧起始

仲裁域

控制域

数据域

CRC 域

应答域

帧结尾

帧间空间 帧间空间

图1-1 数据帧的结构

2 CAN总线通信芯片简述

2.1 CAN总线控制器SJA1000简介

CAN总线只有OSI参考模式中的数据链路层和物理层,但要实现这两层的功能,必须制定相应的协议和控制规则。通过CAN总线控制器可以实现对CAN 总线的控制及数据通信。CAN总线控制器是一块可编程的芯片,它与微处理器相接。通过对CAN总线控制器的编程,实现数据的通信。现在有许多类型的CAN控制器芯片,但工业上的控制系统最常用的还是SJA1000 CAN控制器,下面简要介绍SJA1000 CAN控制器。

SJA1000是Philips半导体公司研发的一种新型的CAN控制器,也是该公司PCA82C200 CAN控制器的替代产品。SJA1000中还加入了一种新的操作模式,PeliCAN模式,相比于此前的BasicCAN模式,这种模式支持最新的CAN2.0B 协议。为了使SJA1000兼容于PCA82C200芯片,SJA1000和PCA82C200相兼容,即SJA1000 CAN控制器既有BasicCAN模式也有PeliCAN模式。

SJA1000的基本特性有:扩展的64字节接收缓冲器、同时支持CAN2.0A和CAN2.0B协议、同时支持11位和29位标识码、通信速率可以达到1Mbps。另外,PeliCAN模式下还有一些新的功能,如扩展到8个字节的验收滤波器、自检测等功能。

对于SJA1000工作在BasicCAN模式还是工作在PeliCAN模式,即工作方式的选择是由时钟分频寄存器(CDR)中的CAN模式位控制的。通电默认的工作方式是BAsicCAN模式。

验收滤波器(Acceptance Filter)是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.3 PCA82C250 CAN收发器介绍

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。

3 CAN总线的通信设计及方案

3.1 CAN总线通信的技术要求及目标

本次设计主要是利用51单片机和CAN芯片SJA1000实现点对点的相互通信。SJA1000是CAN控制器,主要用于一般的区域网络控制。51单片机与SJA1000相连,SJA1000内的数据存储地址相当于51单片机的片外存储器,利用51单片机的片外寻址,对SJA1000内的各个寄存器进行读写,进而控制SJA1000实现CAN总线的点对点的通信。另外,还需要接入CAN收发器82C250来实现CAN总线的发送和接收功能。

本次设计的目标是将51单片机、CAN控制器SJA1000和CAN收发器82C250连在一起,编写程序,实现点对点通信的收发。

3.2 CAN总线通信接口方案

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单片机、SJA1000 CAN控制器和PCA82C250 CAN收发器组成的CAN通信节点

采用AT89C51、SJA1000 CAN控制器和PCA82C250 CAN收发器设计CAN 通信节点。这种方案的设计思路很简单,控制过程也比较方便。通过AT89C51单片机编程控制SJA1000的初始化及收发数据。SJA1000负责CAN总线上的数据的处理,PCA82C250收发器负责传递数据。

方案2:由P8xC591芯片控制的CAN节点通信

Philips公司的P8xC591是集成CAN控制器的单片机,这个方案中的节点只

需要P8xC591和82C250 CAN收发器,CAN控制器内置于P8xC591芯片中。虽然CAN控制器内置于P8xC591中,但P8xC591还保留SJA1000的一切功能,甚至比SJA1000的功能更加强大,这种方案还大大简化了硬件系统电路。

方案比较:方案2中,集成CAN控制器的单片机P8xC591因为其内部已经内置了CAN控制器,所以不需要再进行电路设计,这样难以深入理解CAN总线的原理。P8xC591芯片是一种高性能通信芯片,价格比较高。在一般的系统控制中,实现简单的控制就可满足需要,常采用单片机和独立的CAN控制器作为CAN节点进行通信,这样成本低,也可以更好的了解CAN总线的通信协议。另外,市场上有大量的单片机,使用独立的CAN控制器SJA1000可以根据控制要求选择适用的单片机,从而更好的达到控制要求。因此,本设计采用方案1。

3.3 CAN通信节点硬件电路设计

节点是网络上信息的接收和发送站。我们平常所用的节点都是由微处理器、CAN控制器和CAN收发器组成的。本设计中的硬件电路原理图如图3-1所

图3-1 CAN总线电路原理图

由图3-1可以看出,电路主要由AT89C51单片机、SJA1000 CAN控制器、PCA82C250 CAN收发器组成。由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免以受到过大电流。

4 CAN总线通信的软件设计

CAN总线节点的软件设计一般包括三部分,即SJA1000的初始化、报文发送和报文接收。这三部分是保证CAN总线通信的基础,总程序见附录1。下面章节将对这三部分的通信设计进行详细的说明。

4.1 SJA1000的初始化过程

SJA1000的初始化只能在复位模式下进行。初始化过程主要是对一些寄存器设定初值,其中包括SJA1000工作方式的设置、AF的设置、波特率的设置和中断允许寄存器的设置。在CAN总线通信中,只有先进行SJA1000的初始化才能保证CAN总线通信的顺利进行。完成SJA1000的初始化后,SJA1000还要返回到工作模式,然后开始进行通信。

4.2 SJA1000的发送子程序

SJA1000初始化之后,就可以进行通信的收发程序设计了。发送子程序控制节点报文的发送。将要发送的报文放在发送缓存区,然后通过中断程序判断是否向总线发送数据。但是在将报文送入SJA1000的发送缓存区之前,先要对一些寄存器进行判断,然后才能开启发送。本次设计中当SJA1000接收到报文后,应将接收到的报文放于发送缓存区中,然后再将此报文发送出去并在相应的界面上收到这组报文。

4.3 SJA1000的接收子程序

接收子程序负责节点报文的接收。在处理接收报文的同时,会出现各种情况。要根据状态寄存器(SR)和命令寄存器(CMR)进行读写操作,然后判断需要接收的数据,完成接收过程。本次设计中从串口工具界面上输入一组数据,然后发送到总线上,经过验收滤波器验收过滤之后,在相应的节点上接收到这组数据,并存入接收缓冲区。

设计总结

在设计之前,我没有听说过CAN总线通信协议。自从看到CAN总线通信设计这个设计后,经过多方查阅相关资料和文献,我初步了解了CAN总线通信的有关协议和通信原理。CAN总线的通信是借助单片机对CAN控制器进行相应的编程,以此实现数据的通信。通常情况下,CAN总线通信可以达到很高的通信速率,满足大多数工业控制的要求,特别是虽着CAN控制器的发展,以及CAN通信协议的标准化,使CAN总线越来越多地运用于各行各业的控制系统中。

本次设计用AT89C51微处理器、SJA1000 CAN控制器、PCA82C250 CAN 收发器组成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(源程序)

硬件连接

AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

P10 P11 P12 P13 P14 P15 P16 P17

CSCCAN P32

INTCAN INT1 P33

RS P00

RSTCAN P34

ALE P07

WR P36

RD P37

#include

#include

#include

#include

#include

void main()

{

unsigned char i;

WDT_CONTR= 0x00; //关闭看门狗

P2 = 0x21; //关显示R 接收

UartInital();

delayms(200);

TestCan();

void TestCan();

sbit CANCSC = P3^2;

sbit RSTCAN =P3^4; //=1 reset

sbit CANALE = P0^7;

sbit CANWR = P3^6;

sbit CANRD = P3^7;

#define REG_CAN_CDR 31

#define REG_CAN_MOD 0

#define REG_CAN_BTR0 6

#define REG_CAN_BTR1 7

#define REG_CAN_OCR 8

#define REG_CAN_IER 4

#define REG_CAN_CMR 1

#define REG_CAN_SR 2

#define REG_CAN_IR 3

#define RBSR 16

#define RBSR1 17

#define RBSR2 18

#define RBSR3 19

#define RBSR4 20

#define RBSR5 21

#define RBSR6 22

#define RBSR7 23

#define RBSR8 24

#define RBSR9 25

#define RBSR10 26

#define RBSR11 27

#define RBSR12 28

#define ALC 11 //11 // 仲裁丢失捕捉寄存器#define ECC 12 //12 // 误码捕捉寄存器typedef struct CANPeremeter

{

unsigned char CanAddr;

};

struct CANPeremeter CANPeremeter1;

unsigned char RXD_flag =0;

unsigned char Read_SJA1000(unsigned char Addr)

{

unsigned char Buf;

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);

}

void Write_SJA1000(unsigned char Addr,unsigned char Data) {

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;

}

void delayus(unsigned int t);

void IO_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; //打开总中断

}

unsigned char RX_buffer[15];

void CAN_RXD( void ) interrupt 2

{//接收数据函数,在中断服务程序中调用

unsigned char Buf;

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] = Read_SJA1000(RBSR11);

RX_buffer[12] = Read_SJA1000(RBSR12);

RXD_flag = 1;//置有接收标志

Write_SJA1000(REG_CAN_CMR,0x04);

Buf = Read_SJA1000(ALC);//释放仲裁随时捕捉寄存器

Buf = Read_SJA1000(ECC);//释放错误代码捕捉寄存器}

Write_SJA1000(REG_CAN_IER,0x01);// .0=1--接收中断使能;

EA = 1;//打开CPU中断

}

void delayus(unsigned int t)

unsigned int i,j;

for(i=0;i

for(j=0;j<10;j++)

{;}

}

void SJA100HardWareRest()

{

RSTCAN = 0;

delayus(100);

RSTCAN = 1; //reset

delayus(100);

RSTCAN = 0;

delayus(100);

}

void SJAEntryResetMode()

{

unsigned char Judge;

Judge = Read_SJA1000(REG_CAN_MOD);

Judge = Judge|0x01;

do

{

Write_SJA1000(REG_CAN_MOD,Judge);

}while((Read_SJA1000(REG_CAN_MOD)&0x01)==0);

}

void SJAQuitResetMode()

{

unsigned char Judge;

Judge = Read_SJA1000(REG_CAN_MOD);

Judge = Judge&0xfe;

do

{

Write_SJA1000(REG_CAN_MOD,Judge);

//Write_SJA1000(REG_CAN_MOD,0x00); 千万不要这样赋值,否则出错

}while((Read_SJA1000(REG_CAN_MOD)&0x01)==1);

#define uchar unsigned char

void WriteSJARegBlock(unsigned char addr,unsigned char *Pbuf,unsigned char len) {

uchar i;

for(i=0;i

{

Write_SJA1000(addr+i,*Pbuf);

Pbuf++;

}

}

unsigned char Send_CAN_Filter[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00}; //88: 扩展贞8个数据

unsigned char Send_CAN_Data[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; uchar BTR0,BTR1;

SJA1000_Config_Normal()

{

uchar RegBuf;

BTR0=0x00;

BTR1=0x1b; //设置为1M波特率通信f=400k SJAEntryResetMode(); //进入复位模式

Write_SJA1000(REG_CAN_CDR,0xc0); //配置时钟分频寄存器,选择PeliCAN 模式f/10

RegBuf = Read_SJA1000(REG_CAN_MOD);

RegBuf = RegBuf&0xf3;

Write_SJA1000(REG_CAN_MOD,RegBuf); //配置模式寄存器,选择双滤波WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器

Write_SJA1000(REG_CAN_BTR0,BTR0); //配置总线定时器0x00

Write_SJA1000(REG_CAN_BTR1,BTR1); //配置总线定时器0x14

Write_SJA1000(REG_CAN_OCR,0xaa);

SJAQuitResetMode(); //退出复位模式,进入工作模式

}

void TestCan()

{ uchar canstatus,canstatus1;

uchar canstatus2,canstatus3,canstatus4;

IO_Init();

SJA100HardWareRest();

SJA1000_Config_Normal(); //SJA1000进入正常模式配置

Write_SJA1000(REG_CAN_IER,0x01); //使能SJA1000接收中断位WriteSJARegBlock(16,Send_CAN_Info_ID,5); //扩展帧,向发送缓冲区写入5个数据

WriteSJARegBlock(21,Send_CAN_Data,8);//扩展帧,向发送缓冲区写入8个数据

while(1)

{

if(RXD_flag==1)

{ Send_CAN_Data[0] = RX_buffer[5];

Send_CAN_Data[1] = RX_buffer[6];

Send_CAN_Data[2] = RX_buffer[7];

Send_CAN_Data[3] = RX_buffer[8];

Send_CAN_Data[4] = RX_buffer[9];

Send_CAN_Data[5] = RX_buffer[10];

Send_CAN_Data[6] = RX_buffer[11];

Send_CAN_Data[7] = RX_buffer[12];

EA =0;

WriteSJARegBlock(21,Send_CAN_Data,8);//扩展帧,向发送缓冲区写入8个数据

canstatus = Read_SJA1000(REG_CAN_SR);

canstatus1 = Read_SJA1000(REG_CAN_MOD);

canstatus2 = Read_SJA1000(15); //TX错误计数

canstatus3 = Read_SJA1000(14); //RX错误计数

canstatus4 = Read_SJA1000(12); //错误代码捕捉

if((canstatus&0x0c)==0x0c) //判断是否可以发送

Write_SJA1000(REG_CAN_CMR,0x01);//使能发送请求,发送数据对发

while((canstatus&0x08) ==0)

{canstatus = Read_SJA1000(REG_CAN_SR);}

}

EA =1;

RXD_flag =0;

UartSendbytes(RX_buffer,13);

delayms(50);

LED =1;

}

}

}

CAN总线通信接口及程序设计毕业设计

机电工程学院 毕业设计说明书设计题目: CAN总线通信接口及程序设计 2012 年 5 月21 日

目次

1 CAN总线介绍 1.1 CAN总线的发展背景 随着汽车产业的发展,需要一种更利于信息数据传输交换的通信协议。汽车中的各种电子控制系统需要较高的技术支持,而随着汽车的发展,汽车是否安全、是否便利、成本是否低、是否舒适都已成为人们首要考虑的事情。但是传统的汽车控制技术已不足以满足人们越来越高的要求,也已不适以汽车的发展方向。20世纪80年代,德国Bosch公司着手研究用于汽车产业的新的通信协议及控制方法,并首先提出了CAN总线控制系统。这一崭新的网络协议使得汽车产业得到了飞速的发展。 CAN总线最明显的特点是最大程度地减少了汽车控制系统中的线束的数量及长度,另外还大大提高了系统控制的可靠性和稳定性。在没有CAN总线协议之前,一辆汽车中用于各种控制通信的线束的总长度达3公里之长,严重影响了汽车的通信速度和通信精度。并且还使汽车的整体结构繁冗复杂,可靠性低,成本高,难以维护。因此CAN总线的出现无疑具有重大的意义和作用。作为一种新的网络通信协议,CAN总线不仅减少了汽车中线束的长度,还提高了汽车的整体性能,极大的促进了汽车产业的发展。 CAN总线刚被提出的时候,仅仅应用于汽车产业上,但CAN总线通信协议的性能和可靠性经过多年的检验,已被应用于越来越多的产业,比如航空、船舶、机床等产业设备方面。仅仅二十多年的发展,CAN总线便已成为自动化领域技术的潮流。 CAN总线是串行通信网络。传统运用的是基于R线构建分布式控制系统,这种传统的控制系统是基于通信节点的地址编码的,因此其结构复杂,直接导致系统的通信效率不高,并且控制的可靠性能低。CAN总线通过每个网络节点进行数据通信,每个节点可以互相收发数据,CAN总线协议对通信数据编码,不对节点地址编码,使各个节点可以同时接收到相同的数据,大大增强了数据通信的实时控制及传输性能。另一方面CAN总线使用起来非常方便。CAN总线的结构十分简单,仅有2根线(CANH和CANL)和外部设备相连,但CAN总线的内部却有非常复杂和智能的通信模块,可以方便快捷准确无误的进行数据

CAN总线在多机通信中的应用

CAN总线在多机通信中的应用 随着微处理器的发展,利用微处理器对工业生产过程进行控制已成为趋势。在工业控制过程中,由于大量数据信息的共享和传输,传统的串行通信模式已不能满足要求。在工业控制领域中,需要一种抗干扰性强、可靠性高、传输速度快和传输距离长的总线结构。CAN总线技术不仅满足上述要求,而且还能实现多点间的信息传递。本文使用PCI9810-cAN适配卡上的CAN总线组成局域网络,实现多微处理器间的信息传递和PC机对多处理器的检控、通信。 1 CAN总线简介 CAN(Controller Area Networks)总线,最早是由德国Bosch公司开发用于局域网控制的总线技术。CAN总线采用传统的双线串行通信方式,具有诊断能力,抗电磁干扰,其最陕传输速率可达1 Mb·s-1,最长通信距离可达10 km(此时的传输速率大约为40 kb·s-1)。在CAN总线组成的局域网络中,通信节点之间不采用主从方式,而是具有总线访问优先权,通信方式灵活,可实现点对点,一点对多点及广播方式传输数据。 2 系统通信模块的硬件设计 CAN总线是由PCI9810-CAN适配卡提供,本文主要完成通信节点的设计。通信节点不仅可以和PC机进行信息交换,还可独立与其他各节点通信。微处理器在需要和主机或其它节点通信时,其通过P0口向SJA1000T的寄存器发送信息,再由PCA82C250把信息传递到CAN总线上。主机和其他通信节点判断接收报文的标识符,将对接收到的信息作相应的处理,从而实现通信功能,。 在设计过程中,为了满足多微处理器间通信的实时性和可靠性要求,结合CAN控制器的特点,对图1作简单介绍: (1)收发器PCA82C250的引脚8(Rs)有3种工作方式:高速,斜率控制和待机。斜率控制方式具有抗射频干扰的功能,所以采用47 kΩ的电阻连接引脚8,实现斜率控制方式。 (2)图1中应为两个高速光电耦合隔离器件6N137,由于6N137输出引脚的驱动能力不够,需要连接一个约390 Ω的上拉电阻,以增加输出引脚的驱动能力。两个光电耦合隔离器件6N137的电源信号采用5 V的DC-DC隔离模块WRA0505P,以增强系统的抗干扰能力。 (3)收发器PCA82C250的CANH和CANL引脚各自由通过一个5 Ω的电阻与CAN总线相连,电阻起到一定的限流作用,保护PCA82C250免受CAN总线上的过流冲击。 (4)收发器PCA82C250的CANH和CANL引脚与电源地之间分别反接一个保护二极管和30 pF的电容,可以起到CAN总线的过压保护作用和过流冲击。 (5)CAN控制器SJA1000T输入方式有2种:Intel输入方式和Motorola输入方式。在此采用Intel输入方式,所以SJA1000T的MODE引脚接高电平。 (6)设计仅用到TX0和RX0引脚,根据SJA1000T 通信协议所要求的输入/输出逻辑电平关系,SJA1000T的TX1脚悬空,RX1引脚的电位必须维持在0.5 Vcc以上,所以在TX1引脚接上约6.8 kΩ和3.6 kΩ分压电阻。 (7)微处理器C51的引脚P2.7接CAN控制器SJA1000T的片选信号/CS,可知CAN控制器SJA1000T 的寄存器首地址为8000H。处理器C41和CAN控制器SJA1000T共用12 MHz的晶振,以提高通信速率。通过上述分析,设计的电路原理图,。 3 系统通信模块的软件设计通信模块的软件由3部分组成:初始化程序,发送程序和接受程序。仅这3部分程序,就能完成通信节点间信息的传递。要将CAN总线应用于更复杂的通信系统中,还要考虑CAN总线的错误处理,超载处理等功能和节点间的计算方法。由于每个通信节点都有自己的MCU,所以它们之间可以自由通信。通过CAN收发器PCA82C250的引脚CANH和CANL对总线输出,使总线表现“显性”,这时可发送信息。判断总线表现为“显性”时,就要为接受信息做好准备。3.1 CAN控制器SJA1000T初始化程序该程序首先进入复位状态,设置SJAl000T的模式寄存器MR为Basic CAN模式,验收码寄存器ACR和屏蔽码寄存器AMR,再设置定时器0和定时器1,输出控制寄存器OCR,

CAN总线通信系统上位机通信软件设计

目次 1 绪论 (1) 1.1 研究背景 (1) 1.2 研究目的和意义 (1) 1.3 国内外发展现状 (2) 1.4 论文结构安排 (2) 2 CAN总线协议分析 (3) 2.1 CAN-bus 规范V2.0 版本 (3) 2.2 CAN控制器SJA1000 (6) 2.3 本章小结 (6) 3 开发环境介绍 (6) 3.1 开发环境 (6) 3.2 CANUSB—Ⅰ/Ⅱ智能CAN接口卡 (7) 3.3 本章小结 (8) 4 CAN通信软件设计 (8) 4.1 驱动程序安装 (8) 4.2 CAN接口卡函数库说明 (8) 4.3 界面设计 (11) 4.4 软件功能实现 (16) 4.5 本章小结 (22) 5 测试及发布 (23) 5.1 软件功能测试 (23) 5.2 程序发布 (24) 5.3 本章小结 (27) 结论 (28) 致谢 (29) 参考文献 (30)

1绪论 现场总线,就是应用于工业现场,采用总线方式连接多个设备,用于传输工业现场各种数据的一类通信系统[1]。CAN(Controller Area Network)总线是现场总线的一个分支,因其具有很高的可靠性和性能价格比,已经成为国际标准,在工业过程监控设备的互连方面得到广泛应用,受到工业界的广泛重视,并已被公认为几种最有前途的现场总线之一。 1.1 研究背景 随着计算机硬件、软件技术及集成电路技术的迅速发展,工业控制系统已成为计算机技术应用领域中最具活力的一个分支,并取得了巨大进步。由于对系统可靠性和灵活性的高要求,工业控制系统的发展主要表现为:控制多元化,系统面向分散化,即负载分散、功能分散、危险分散和地域分散。分散式工业控制系统就是为适应这种需要而发展起来的。这类系统是以微型机为核心,将5C技术——Computer(计算机技术)、Control(自动控制技术)、Communication(通信技术)、CRT(显示技术)和Change(转换技术)紧密结合的产物。它在适应范围、可扩展性、可维护性以及抗故障能力等方面,较之分散型仪表控制系统和集中型计算机控制系统都具有明显的优越性。典型的分散式控制系统有现场设备、接口与计算设备以及通信设备组成,现场总线(Field bus)就是在这种背景下产生的[2]。 1.2 研究目的和意义 从19世纪发明汽车以来,人们就一直在乘坐的舒适性、安全性和操控性方面不停地对其进行改革和创新,车上的电子设备也越来越多。这些电子设备大多是需要协同工作的,这就要求各部件之间能互相通信[1]。 为了解决汽车通信问题,CAN—bus应运而生,凭借可靠、实时、经济和灵活的特点,CAN总线很快在其他行业得到广泛应用,特别是在工业控制领域更是如鱼得水。现在CAN—bus总线已经成为全球范围内最重要的现场总线之一,甚至引领着现场总线的发展。 工业控制系统涉及众多软、硬件模块,给程序的设计和调试带来一定难度。尤其作为上、下位机间联系纽带的CAN总线通信部分,一旦在整个系统运行期间发生问题,若没有良好的人机界面和测试手段,将很难及时准确地找到并排除故障。同样,在控制系统的研制过程中,为了尽可能地减少故障和缩小故障范围,也应设计相应的测试

CAN总线的编码方式

对CAN总线的常见编码格式解析 我们在进行CAN总线的通讯设计过程中,对于通讯矩阵的建立,我们常常会选择一种编码方式,最常见的编码格式是Intel格式和Motorola格式。但是往往人们都是以一种习惯去选择,究竟两种格式具体的区别在哪里呢?我们需要明白两种格式对信号是如何排布的,又是按照什么顺序进行正确解析的。本篇文章就是作者根据在整理通讯矩阵和dbc文件中遇到的一些问题,提出的自己的一些体会和见解,希望大家通过此篇文章对两种格式有更加深刻的理解。 我们在设计初期,都会首先选择一种编码格式,这种选择大多都是根据设计者自己的习惯,具体Intel格式和Motorola格式哪个更有优势的问题,在这里没有区别。但是就使用者而言,需要对接收到数据帧进行正确的解析,否则就无法得到想要的信号。下面我们就来说一下两种格式的区别。 首先我们需要明确一点,无论是Intel格式还是Motorola格式,在每个字节中,数据传输顺序都是从高位(msb)传向低位(lsb)。如下图所示。 byte x bit(8*x+7) bit(8*x) msb lsb 注:x=0,1,2,3 (7) 图1 一般主机厂设计人员在设计初期都会定义好字节的发送顺序,定义Byte0为LSB,Byte7为MSB。第一种情况:先发送Byte0,然后Byte1到Byte7;第二种情况:先发送Byte7,然后Byte6到Byte0。根据我了解到的大部分主机厂都会采取第一种发送方法,很少会采取后者。我们在用CANoe中的CANdb++编辑数据库时,肯定会用到如下图所示的编辑界面。

图2 结合工作中的出现的问题,有的网络设计者会在排布信号的时候出现误区。上图中用的是比较常规的排布方式,即位在字节中的索引是从右至左,还有一种是颠倒过来的,即从左至右。如下图所示。 图3 我们现在以第一种矩阵模式进行说明。在这种情况下,如果主机厂在初期定义先发送LSB,再发送的MSB的形式,那么数据信号可以按照从上到下,从左到右的顺序发送,非常方便,接收器解析起来也比较容易。如果主机厂定义先发送MSB再发送LSB的形式,那样数据传输比较复杂,所以一般都不建议用这种方案。至于设计者常出现的错误我们在下文中会重点说明,下面我们先了解一下Intel 格式和Motorola格式在CANdb++中的区别。

基于STC89C51的CAN总线点对点通信模块设计

基于STC89C51的CAN总线点对点通信模块设计 [导读]随着人们对总线对总线各方面要求的不断提高,总线上的系统数量越来越多,继而出现电路的复杂性提高、可靠性下降、成本增加等问题。为解决上述问题,文中阐述了基于SJAl000的CAN总线通信模块的实现方法,该方法以PCA82C250作为通信模块的总线收发器,以SITA-l000作为网络控制器。并以STCSTC89C5l单片机来完成基于STC89C5l的CAN通信硬件设计。文章还就平台的初始化、模块的发送和接收进行了设计和分析。通过测试分析证明,该系统可以达到CAN的通信要求,整个系统具有较高的实用性。 0 引言 现场总线是应用在生产最底层的一种总线型拓扑网络,是可用做现场控制系统直接与所有受控设备节点串行相连的通信网络。在工业自动化方面,其控制的现场范围可以从一台家电设备到一个车间、一个工厂。一般情况下,受控设备和网络所处的环境可能很特殊,对信号的干扰往往也是多方面的。但要求控制则必须实时性很强,这就决定了现场总线有别于一般的网络特点。此外,由于现场总线的设备通常是标准化和功能模块化,因而还具有设计简单、易于重构等特点。 1 CAN总线概述 CAN (Controller Area Network)即控制器局域网络,最初是由德国Bosch公司为汽车检测和控制系统而设计的。与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。其良好的性能及独特的设计,使CAN总线越来越受到人们的重视。由于CAN总线本身的特点,其应用范围目前已不再局限于汽车行业,而向自动控制、航空航天、航海、过程工业、机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械及传感器等领域发展。目前,CAN已经形成国际标准,并已被公认为几种最有前途的现场总线之一。它的直线通信距离最大可以达到l Mbps/30m.其它的节点数目取决于总线驱动电路,目前可以达到110个。 2 CAN系统硬件设计 图1所示是基于CAN2.0B协议的CAN系统硬件框图,该系统包括电源模块、MCU部分、CAN控制器、光电耦合器、CAN收发器和RS232接口。硬件系统MCU采用STC89C5l,CAN控制器采用SJAl000,CAN收发器采用PCA82C250,光耦隔离采用6N137。

CAN总线学习心得--重要

CAN总线学习心得--重要 SJ A1 0 0 0 的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然T SEG1 的设置周期都很大,比如都大于1 0 了,为什么不让他采样三次呢?答:是不好理解,但那是Ci A 推荐的值。用5 1 系列芯片和两个SJ A1 0 0 0 接口还要外扩一个RAM,请问5 1 的AL E 能否同时与三个芯片的AL E 管脚相连( 地址不同) 有哪位高手做过双SJ A1 0 0 0 冗余的请指教!答:能同时连接。请问CAN 总线在想传输1 0 0 0 m 的情况下, 最快的速度能到多少呢?答: 5 0 k b p s = 1 3 0 0 m。如果一个网络中只有 2 个节点, 其中一个处于监听模式,另一个节点发送报文会使处于监听模式的节点进入中断吗?答:能进入接收中断,你自己的试验也可以证明。想组建一个简单的CAN 网络, 已经有两个节点, 我想问CAN 总线如何组建, 终端电阻安装在哪里?小弟还没有入门, 大虾们指点一下。答1 :直接将节点CANH 和CANL 连到总线上,终端电阻接在总线两端,大约1 2 0 欧。答2 :推荐北航出版《现场总线CAN 原理与应用技术》,研读一下。请问各位老师:我是一名c a n 总线的新手,我正在做c a n 总线的开发,控制器用s j a 1 0 0 0 t ( 我自己两个控制板互通) , 但我在发送数据后将出现总线关闭,我看到发送错误计数器在不断增加,直到0 x f f 最后恢复到0 x 7 f , 谢谢各位老师帮我解答这个问题。或者对我给与启发答1 ;首先调通单个节点。答2 :这是单节点发送没有成功( 或者由于网络中其他节点没有收到帧并在响应场响应) 建议参考网站CAN 应用方案。我想请教各位c a n 远程贞有何作用?如何应用?在什么情况下才需要用到远程贞?谢谢了!答:远程帧的用与不用完全取决你自己的协议,c a n 有远程帧的功能,是可用可不用的!用网站提供的计算波特率的工具算出的数,1 2 k 以上的都正确,无论是自接收还是两个节点通讯都没有任何问题。但是1 2 k 以下的数据一个都不能用,两个节点通讯没有成功的,自接收有1 0 k 的几个数据成功。我们的项目要求必须在1 0 k 以下,最好是5 k ,但是不成功,自己计算的数据也没有成功的。(我们至少试验了3 0 多个,所有情况都考虑了。)我现在怀疑s j a 1 0 0 0 的波特率根本达不到5 k 和相对应的传输1 0 k m。或者可以谁能提供个经过实践检验的正确的总线定时器0 和1 的设置呢?要求低于1 0 k 。答:PCA8 2 C2 5 0 / 2 5 1 可以保证5 KBPS 的速率;比如Z L GCAN 系列接口卡。答:t j a 1 0 5 0 在低速时好像有问题。我用1 0 5 0 进行5 k 的时候不行,用8 2 c 2 5 0 很好,你可以试一试。我本想双机调试,一边收,一边发,但跑程序后,发送方会不断进入复位模式,所以现在进行自测试模式,我先进入复位模式,设置进入PEL I CAN 模式,对寄存器初始化后,设置接收,发送中断使能,最后设置进入自接收,单滤波模式,这样初始化就结束了,我的ACR0 ~ ACR3 为0 x 5 5 , 0 x 5 5 , 0 x 5 5 0 x 5 0 , AMR0 ~ AMR3 为0 x f f , 之后,我就往BUF F ER 里填数,0 x 8 8 , 0 x 5 5 , 0 x 5 5 , 0 x 5 5 , 0 x 5 0 , 0 x 3 0 , 0 x 3 1 , .0 x 3 7 , 之后,启动自接收请求命令,但是程序只进入了中断一次,是发送空中断,接收中断没有产生,我读发送错误寄存器,发现有错误产生,我读接收计数寄存器,为0 ,说明我没有收到数,但我读接收BUF F ER 时,值为0 x 5 5 , 0 x 5 5 , 0 x 5 5 , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 , 0 , 0 , 0 , 0 , 以上测试时,我在CANH 和CANL 之间加入了两个1 2 0 欧的匹配电阻并联在一起的,请各位高手指点呀,谢谢了答:在总线上加个CAN 接口卡会方便许多,或者加个捕获功能的示波器也可以检测波形。仿真环境:k e i l u v 2 编译器:k e i l c 5 1 7 . 0 仿真器:t k s - 5 9 1 s c p u : p 8 7 c 5 9 1 程序大小:8 K 左右兄弟在一片CPU 中烧写了一个,运行一个CAN 总线,I I C 总线测试程序能够正常运行。这个基础上加上应用程序后在仿真机中运行正常,但是烧写到c p u 后插入c p u 程序不能运行,请问是什么原因?另外一个问题:在另外一个项目中条件相同,程序只有4 K, 程序正常跑着,CAN 接口可以检测到输出波形但是却不能正确传输数据,在一块旧板子上就可以,比较两者之后发现电路完全相同测量也正常,只是布局不同,请教原因。答:程序已运行了吧?可能是HEX 文件有错;编制程序时注意P8 7 C5 9 1 的ERAM 设置、6 CL K 设置。位流数据采样自发送节点的8 2 c 2 5 0 的T x 管脚。测试条件:p e l i c a n ,扩展,双滤波模式,对方I D:0 x 8 8 , 0 x 1 1 , 0 x 5 5 , 0 x 1 0 ,发送的对方I D 为:0 x 8 8 , 0 x 1 1 , 0 x 0 0 , 0 x 0 0 ,发送2 字节数据为:0 x 0 5 , 0 x 0 6 采集的位流数据如下:0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 请教位流数据的含义?答:自行计算时要区分位,还需要进行“位填充”的逆运行;简单的方法是将此信号连接

CAN单节点的自通信程序

/****************************************************************************** ******** 项目:基于CAN总线的自收发通信 说明:主程序部分 功能:外部按键每按下一次,计数值加一,同时计数值在数码管1、2上显示。 在计数值加一后,会使CAN总线上重新发送数据,此时接收端的计数值也同步更新显示 在数码管3、4上(为便于观察,接收显示的值比发送值大3)。 // CAN主要参数: PeliCAN模式,扩展帧EFF模式 // 29位标示码结构: // 发送数据结构:计数结果,0x02,0x03,0x04,0x05,0x06,0x07,0x08 // 接收数据结构: 待显示数据+其它7个字节的数据 // 本节点的接收代码寄存器值: 0x11,0x22,0x33,0x44 // 本节点的屏蔽代码寄存器值:0x00,0x00,0x00,0x00;可以接收本节点的数据 // 目的节点地址:0x11,0x22,0x33,0x44;可以被本节点接收 模块:can_self.c 作者:PIAE GROUP 注释修改者:特权 修改时间:08.6.17. ******************************************************************************* *******/ /***感谢PIAE工作组提供的源码,这里特权根据自己的编程习惯做了一些修改并添加详细注释***/ #include #include #include "define.h" /////////////////////////////////////////////// //函数:inter0_key (外部中断INT0) //说明:INT0按键为计数按键 // 每按下一次键,计数值加一 //入口:按键中断 //返回:按键加一 /////////////////////////////////////////////// void inter0_key(void) interrupt 0 { EA = 0; //关闭中断 Txd_data++; //计数结果增1,即待发送的数据增1 TXD_flag = 1; //发送数据标志位置位,即重新发送数据以更新数码管的显示数值 EA = 1; //重新开启中断 } ///////////////////////////////////////////////

几种总线的总结之CAN 总线

CAN总线 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO118?8)。是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境 基本概念 CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。 编辑本段CAN总线优势 CAN属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。较之目前许多RS-485基于R线构建的分布式控制系统而言, 基于CAN总线的分布式控制系统在以下方面具有明显的优越性: 网络各节点之间的数据通信实时性强 首先,CAN控制器工作于多主方式,网络中的各节点都可根据总线访问优先权(取决于报文标识符)采用无损结构的逐位仲裁的方式竞争向总线发送数据,且CAN协议废除了站地址编码,而代之以对通信数据进行编码,这可使不同的节点同时接收到相同的数据,这些特点使得CAN总线构成的网络各节点之间的数据通信实时性强,并且容易构成冗余结构,提高系统的可靠性和系统的灵活性。而利用RS-485只能构成主从式结构系统,通信方式也只能以主站轮询的方式进行,系统的实时性、可靠性较差; 缩短了开发周期 CAN总线通过CAN收发器接口芯片82C250的两个输出端CANH和CANL与物理总线相连,而CANH端的状态只能是高电平或悬浮状态,CANL端只能是低电平或悬浮状态。这就保证不会在出现在RS-485网络中的现象,即当系统有错误,出现多节点同时向总线发送数据时,导致总线呈现短路,从而损坏某些节点的现象。而且CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现象在网络中,因个别节点出现问题,使得总线处于“死锁”状态。而且,CAN具有的完善的通信协议可由CAN

CAN总线应用

设计(论文)题目:基于CAN总线的楼宇温度检测系统 前言 基于单片机实现传统温度检测技术的特点,提出了基于CAN总线的楼宇温度检测系统方案。该系统方案的硬件平台主要包括温度检测模块和主控平台,并详细介绍了其硬件实现、软件设计思想及流程。实验表明:该系统可实现对楼宇温度的实时检测,并由数码管显示检测结果,对异常情况进行处理,从而实现对楼宇房间温度的有效检测。 在传统的检测技术中,温度检测基本采用单片机系统为主,且大多数都针对工业需要,日常生活中的应用并不多;而通信多基于落后的485总线,不能进行远距离的实时数据传输,更不能与因特网相连,可靠性也不高。因此,本文提出一种基于CAN总线的温度测控技术,该技术适合远距离控制与传输,具有非常高的可靠性。 控制器局域网(Controller Area Network,CAN)是国际上应用最广泛的现场总线之一。CAN总线最早出现在20世纪80年代末的汽车工业中,由德国BOSCH公司最先提出,其主要特性为低成本,且总线利用率高。CAN采用串行通信方式工作,所提供的最高数据传输速率为1Mbit/s,最大通信距离为10km。CAN还具有可靠的错误处理和检错机制,极强的错误检测能力,发送信息遭到破坏后可自动重发;可在高噪声的干扰环境中只用,能够检测出产生的任何错误,当数据的传输距离达到10km时,CAN仍能提供5kbit/s的数据传输速率。 正是基于CAN总线的上述优点,目前CAN总线在众多领域被广泛应用,其应用范围不再局限于原先的汽车行业,而向过程工业、机械工业、纺织工业、数控机床、医疗器械及传感器等领域发展,CAN总线已经形成国际标准,并已被公认为是几种最有前途的现场总线之一。 考虑到CAN总线的高可靠性和远距离传输优点,结合目前温度检测技术的技术瓶颈,即距离短和实时性差的特点,本系统CAN总线应用于传统的温度检测中,也是一种新的尝试。

CAN 总线通信原理分析

CAN总线通信原理分析 CAN(Controller Area Network)总线,即控制器局域网总线,在工业控制、医疗电子、家用电器及传感器领域都得到了广泛的应用。目前国内外文献中针对CAN总线协议分析的文章主要是针对CAN协议的帧结构以或位时序特性进行分析,如文献鲜有从通信的角度对CAN总线协议进行分析,鲜有从工程应用的角度出发,对CAN总线的通信机制进行深入分 析的文章。 1 CAN应用特性及结构构成 CAN总线协议具有两个国际标准,分别是ISO11898和ISO11519。其中,IS011898是通信速率为125 kbps~1Mbps的高速CAN通信标准,属于闭环总线,总线最大长度为40 m/1Mbps。ISO11519定义了通信速率为10~125kbps的低速CAN通信标准,属于开环总线,最大长度为1 km/40kbps。由于电气特性限制,即总线分布电容和分布电阻对总线波形的影响,CAN总线上最大节点数目为110个。对于应用工程师,只需正确配置收发端 的波特率和位参数即可实现收发节点的数据同步。通过CAN控制器硬件对报文的标示符滤波即可实现点对点、一点对多点及全局广播等几种方式传送接收数据。同时,由于CAN报文采用短帧结构,并且每帧均包含CRC校验部分,保证了数据出错率极低。CAN总线在工 程应用中结构构成如图1所示。 系统实现中的CAN应用层、操作系统(在无操作系统的应用中以后台程序实现)及驱动程序共同实现了ISO参考模型中的应用层功能。其中,CAN应用层定义ID分组、发送数据装包、接收数据处理以及应用层总线安全监测;操作系统/后台程序用于在CAN中断到达后调度CAN驱动程序对数据进行处理;驱动程序包括初始化(控制器工作状态设置、波特率设置、验收滤波器配置)、收发驱动及异常处理程序。 对于传输介质层,需要根据环境干扰噪声、总线长度等来确定。在强干扰噪声的情况下必须采用屏蔽线;由于分布电容造成的总线波形失真及分布电阻造成的总线电平的衰减,总线长度需要考虑采用的传输介质的分布电阻和分布电容特性;同时,若采用高速总线还需通过实验确定总线的匹配电阻值。 对于CAN驱动层和应用层,驱动程序包括CAN初始化(包括硬件使能、波特率设置、控制器工作模式设置及验收滤波器ID表配置)、收/发驱动并向上层提供接口函数,其中需要说明的是验收滤波器的ID表配置需要根据应用层对系统ID的分组来进行;CAN应用层 根据总线上各节点之间的数据收发关系进行数据包的ID分组、发送数据装包、接收数据处

can总线通信程序

CAN总线通信程序 // CAN <==> UART的协议转换器 // 说明: // 1,单片机使用P89C61X2BA // --晶振11.0592MH Z // --CAN总线中断使用单片机的中断0,外部有上拉电阻,波特率可以设定 // 2,CAN总线发送采用查询方式,接收采用中断方式 // 3,看门狗复位时间1.2S // 4,SJA1000晶振8MHZ,Peil模式 // 5,串口中断接收,查询发送,波特率可设置 // 6,×××当串口收到数据后,每8个数一组打包,通过CAN总线发送出去 // // -----10.16日,重新修改程序完成以下功能----- // ----此功能已经改为,每收到一帧数据,启动一次CAN传输,传输字节数等于串口收到的数据 // ----串行帧的帧间界定通过当前波特率下传输5个字节为时间间隔,具体为当顺序接收到的任意两个数据,它们之间的时间间隔大于5个字节传送时间,认为这两个数据分属于两个不同的帧 // 7,当CAN总线每接收一帧信息后,通过串口发送出去 // 改为可以识别CAN的报文字节长度,即串口只发送CAN报文长度个字节 // 8,看门狗芯片MAX1232CPA,硬件溢出时间1.2S // //------------------------------------------------------- #include #include #include #include "CANCOM.h" unsigned char UART_TX_Data[8] = {0,1,2,3,4,5,6,7}; unsigned char CAN_TX_Data[8] = {0,1,2,3,4,5,6,7};

接口实验报告

接口与通讯实验报告 实验一可编程定时计数器8253 一、实验目的 掌握8253的基本工作原理和编程方法。 二、实验内容 按图16虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。 三、编程提示 8253控制寄存器地址283H 计数器0地址280H 计数器1地址281H CLK0连接时钟1MHZ 四·实验原理图 五、实验流程图

六实验代码及注释 ioport equ 0ff00h-0280h;定义宏 io8253a equ ioport+283h io8253b equ ioport+280h code segment assume cs:code start :mov al,10h mov dx,io8253a;输入端口地址 out dx,al;延时 mov dx,io8253b mov al,0fh;初始化 out dx,al;延时 l: in al,dx call disp;调用子程序 push dx;入栈 mov ah,06h mov dl,0ffh int 21h pop dx;出栈 jz l;转l mov ah,4ch;已完,退出 int 21h disp proc near;定义范围为段内push dx and al,0fh;初始化al mov dl,al cmp dl,9;比较

jle num add dl,7 num : add dl,30h mov ah,02h int 21h mov dl,0dh int 21h mov dl,0ah int 21h pop dx ret disp endp code ends end start 七.实验报告 1.8255简介 8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。 2.8255外部特性及引脚功能 RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。 CS:芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输. RD:读信号线,当这个输入引脚为低跳变沿时,即/RD产生一个低脉冲且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。 WR:写入信号,当这个输入引脚为低跳变沿时,即/WR产生一个低脉冲且/CS=0时,允许CPU将数据或控制字写入8255。

CAN总线学习笔记二:CAN自收发程序解读

CAN总线学习笔记二:CAN自收发程序解读 花了一整个下午的时间,彻头彻尾的把 PIAE小组提供的CAN自收发源程序解读了一遍。解读别人的程序是一件挺费时费力的一件事,但是在 对某项技术或者说某个芯片的入门阶段参考别人的程序又是一项必不可少的任务。 对于这个程序,头一个任务当然是把头文件先浏览一遍,能弄明白 的还是先弄明白,对后面程序的解读有好处。C文件里给出了三个头文 件: #include #include #include 第一个reg52.h我就不废话了,下一个intrins.h我在上一篇日志里也详细的作了说明,这里也不提了。can_selfdef.h是程序员自己定义的一个头文件,在这个头文件里除了一些宏定义和管脚的一些 说明外,最重要的就是要弄明白“CAN总线SJA1000寄存器地址定义”。这个我开始也没弄明白,后来反复琢磨,才发现作者在这个 程序里吧SJA1000的寄存器作为单片机的外 部扩展RAM寻址了,从而省去了编写一些底层的驱动程序,这就让大家连SJA1000的datasheet的时序图都不用看了 (不过下一步我想用驱动程序来控制SJA1000)。 看完头文件,可不能从第一个程序依次往下看。应该直接找到主程 序main()解读: void main(void) {

//MCU初始化(主要是各中断寄存器的初始化) SJA_RST = 1; //CAN总线复位管脚复位无效 SJA_CS = 0; //CAN总线片选有效 EX1 = 1; //开MCU外部中断INT1 IT1 = 0;//MCU外部中断INT1为电平触发,也是CAN总线接收中断口 IT0 = 1;//MCU外部中断INT0为下降沿触发 EX0 = 1; //开MCU外部中断INT0 EA = 1; //开MCU总中断 SJA_CS = 1; //CAN总线片选无效,使得对数据总线的操作不会影响SJA1000。 //SJA1000初始化 CAN_init(); //对SJA1000寄存器的读写是采用外部寄存器寻址方式, //所以不需要程序单独控制 片选有效无效 _nop_(); _nop_(); //主循环

接口实验报告

接口实验课程结课报告 学号、专业:控制工程 1508202024 姓名:** 报告题目:基于STM32的实时时钟设计 指导教师:潘明 所属学院:电子工程与自动化学院 成绩评定 教师签名 桂林电子科技大学研究生院 2016年6月4日

摘要 本设计以STM32F103芯片为控制核心,利用其内部的RTC设计了一个实时时钟。本系统主要由以下几个部分组成:微处理器,实时时钟模块,显示模块,调节模块。其中MCU 采用STM32F103芯片,实时时钟采用RTC实时时钟,显示模块为4.3寸的TFTLCD显示屏,采用独立按键调节。另外整个系统是在系统软件控制下工作的,能实现年、月、日、时、分、秒的实时显示及闹钟功能,并增加了温度显示。 关键字:STM32F103;实时时钟(RTC);TFTLCD显示屏

Abstract This design with STM32F103 chip as the control core, using its internal RTC design a real-time clock. The system is mainly composed of the following parts: microprocessor, real-time clock module, display module, control module. MCU using STM32F103 chip, real-time clock using RTC , display module use the 4.3 inch TFTLCD display screen, using independent buttons to adjust . In addition, the whole system is under the control of the system software,and accomplish the year, month, day, hour, minute, second real-time display and alarm clock function,and added to temperature display. Key words: STM32F103;real time clock(RTC); TFTLCD display screen

CAN总线传输用什么线缆

C A N总线传输用什么线 缆 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

1、周立功关于CAN传输距离 2、CAN芯片选型 CAN总线传输用什么线缆 用特性阻抗为120Ω的总线电缆! 200米以内的距离,建议采用电缆型号规格——STP-120Ω(forRS485&CAN)onepair20AWG. ---------------------------------------------------------------------- 通用型现场总线系列电缆 特性阻抗为120Ω的双绞屏蔽电缆广泛用于RS485/422、CANBUS等总线,该系列电缆规格很多,请提供电缆的敷设环境、通信速率、最大无中继传输距离等参数,我们将依照具体情况推荐最适当的产品。一般推荐如下: 普通双绞屏蔽型电缆STP-120Ω(forRS485&CAN)onepair20AWG,电缆外径7.7mm左右,蓝色护套。适用于室内、管道及一般工业环境。使用时,屏蔽层一端接地! 普通双绞屏蔽型电缆STP-120Ω(forRS485&CAN)onepair18AWG,电缆外径8.2mm左右,灰色护套。适用于室内、管道及一般工业环境。使用时,屏蔽层一端接地! 铠装双绞屏蔽型电缆ASTP-120Ω(forRS485&CAN)onepair18AWG,电缆外径12.3mm左右,黑色护套。可用于干扰严重、鼠害频繁以及有防雷、防爆要求的场所。使用时,建议铠装层两端接地,最内层屏蔽一端接地! CC-Link的总线电缆是特性阻抗为110±10Ω的3芯绞合屏蔽电缆,国产型号规格:STP-110Ω(forCANopen&CC-Link)3C×20AWG,使用时,屏蔽层应只在一端接地! 变频器、动力电缆、变压器、大功率电机等往往伴随着低频干扰,而这种干扰是用高导电率材料做屏蔽层的电缆无法解决的,包括原装的进口电缆。只有用高导磁率材料(如钢带、钢丝)做的屏蔽层才能有效抑制低频干扰。 最常用的方法就是给电缆套上钢管或直接采用高导磁率材料制成的铠装型电缆——ASTP-120Ω(forRS485&CAN)onepair18AWG,电缆外径12.3mm左右。可用于干扰严重、鼠害频繁以及有防雷、防爆要求的场所。使用时,建议铠装层两端接地,最内层屏蔽一端接地! 雷电的等效干扰频率在100k左右,属于低频干扰。 《GB50057-94建筑物防雷设计规范》第6.3.1条:......在需要保护的空间内,当采用屏蔽电缆时其屏蔽层应至少在两端并宜在防雷区交界处做等电位连接,当系统要求只在一端做等电位连接时,应采用两层屏蔽,外层屏蔽按前述要求处理。

相关文档
最新文档