当前位置:文档之家› CAN-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)

CAN-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)

CAN-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)
CAN-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)

第3章 CAN 控制器驱动

1.1 SJA1000编程基础

1.1.1 MCU 访问SJA1000

SJA1000使用并行总线接口与MCU 连接,对MCU 来说,SJA1000可以认为是1个外扩的RAM 芯片,51系列MCU 通过地址线、数据线和控制线与SJA1000连接,如图3.1所示。

AD[0:7]是低8位地址与数据总线复用的,MCU 在操作总线时,在该接口上先输出低8位地址线,然后再进行数据操作(读或写)。SJA1000内部带有地址锁存器,由ALE 信号实现数据与地址的分离。因为SJA1000的地址宽度为8位,所以寻址空间范围是0x00~0xFF 。假如每个地址都对应一个寄存器,那么SJA1000最多支持256个寄存器。而实际上SJA1000在BasicCAN (CAN2.0A )模式下只有32个寄存器,在FullCAN (CAN2.0B )模式下则有128个寄存器。

虽然SJA1000寄存器的访问地址会因为硬件设计不同而不同,但SJA1000内部寄存器的位置关系是固定的。如果我们给SJA1000每个内部寄存器的地址都定义绝对地址(如程序清单3.1所示),那么在硬件设计发生变化时,特别是器件编址变化时,要修改的寄存器地址定义将会非常多。

为了提高驱动的可移植性,在实际访问SJA1000内部寄存器时,常采用基地址加偏移量的方式进行寄存器访问(如程序清单3.2所示)。如果把SJA1000内部寄存器看做数组的话,那基地址就是这个数组的首地址,偏移量就是数组的下标,即成员在数组中的位置。

程序清单3.1 采用绝对编址的寄存器定义

1 #define REG_CAN_MOD 0xA000 // 内部控制寄存器

2 #define REG_CAN_CMR 0xA001 // 命令寄存器

3 #define REG_CAN_SR 0xA002 // 状态寄存器

4 #define REG_CAN_IR 0xA003 // 中断寄存器

5 #define REG_CAN_IER

0xA004

// 中断使能寄存器

6

......

程序清单3.2 采用基地址加偏移量方式的寄存器定义

7 #define REG_BASE_ADD

0xA000

// SJA1000寄存器基地址 8 #define

REG_CAN_MOD 0x00 // 内部控制寄存器 9 #define REG_CAN_CMR 0x01 // 命令寄存器 10 #define REG_CAN_SR 0x02 // 状态寄存器 11 #define REG_CAN_IR 0x03 // 中断寄存器 12 #define REG_CAN_IER

0x04

// 中断使能寄存器

13

......

通常MCU 的总线上会挂载很多器件,除了SJA1000外,可能还有RAM 和ROM 等器件。所以数据总线和地址总线上的信息并不一定都是给SJA1000的。因此当MCU 在访问SJA1000

图3.1 SJA1000与MCU 扩展总线连接

时,为了明确的表明下面的操作对象是SJA1000,MCU 会把SJA1000的片选(CS )信号拉低。 SJA1000的片选信号由MCU 未使用的高位地址线经过译码电路产生,译码电路的设计决定了MCU 访问SJA1000的基地址。MCU 产生片选信号有以下三种方法。

1. 线选法

所谓线选法,就是直接利用MCU 的空闲高位地址线作为扩展芯片的片选信号。优点是线路连接简单明了,无需另外增加译码电路,缺点是寻址范围不唯一(可通过多个地址访问扩展芯片),地址空间没有被充分利用,使用单个扩展芯片时可使用该方法。

2. 全地址译码法

全地址译码法利用译码器对未使用的高位地址线进行译码,使用译码器的输出作为扩展芯片的片选信号,常用的译码芯片有74HC138、74HC139、74HC154等。优点是扩展器件的每个存储单元具有唯一的访问地址,不存在地址重叠现象,对地址的空间的使用是连续的,能有效地利用地址空间,缺点是所需译码电路较多,外扩芯片较多时使用该方法。

3. 部分地址译码法

部分地址译码法对未使用的部分高位地址线进行译码。优点是使用译码电路较少,缺点是外扩器件地址范围有重叠。

在本设计中,通过并行总线扩展的器件只有SJA1000,可以采用线选法产生SJA1000的片选信号,但考虑到系统的扩展性,我们使用部分地址译码法来产生SJA1000的片选信号。如图3.2所示,SJA1000的片选信号通过对地址线A15~A12译码来得到。

74HC139内部包含了两个“2线—4线”译码器,其真值表如表3.1所示。根据图3.2中74HC139的电路连接关系,对比74HC139的真值表,我们可以发现,当A14为低电平、A15为高电平时,1Y2输出为低电平;当A12为低电平、A13为高电平并且1Y2为低电平时,2Y2输出为低电平,即SJA1000片选信号有效,所以只要MCU 在访问SJA1000时16位地址线上输出地址为0b1010 xxxx

xxxx xxxx ,SJA1000的片选信号就会有效。因此SJA1000的访问基址为0xA000~0xAF00,为了编写程序方便,在以后的例程中,MCU 访问SJA1000的基地址统一使用0xA000。 1.1.2 读写寄存器

在C 语言中,一般使用指针来访问存储空间,SJA1000按照存储器的方式与MCU 连接,所以我们可以通过指针的方式来访问SJA1000的寄存器,实现对SJA1000的操作控制。使用C 语言读写SJA1000寄存器的代码如程序清单3.3所示。

图3.2 SJA1000片选译码电路

程序清单3.3 读写SJA1000寄存器

14#define SJA_BASE_ADDR 0xA000 // 定义SJA1000访问基址

15xdata unsigned char *SJA_CS_Point = ( xdata unsigned char *) SJA_BASE_ADDR;

16// 写SJA1000寄存器

17void WriteSJAReg (unsigned char RegAdr,unsigned char Value)

18{

19*(SJA_CS_Point + RegAdr) = Value;

20return ;

21}

22// 读SJA1000寄存器

23unsigned char ReadSJAReg (unsigned char RegAdr)

24{

25return (*(SJA_CS_Point + RegAdr));

26}

程序清单3.3第1行定义了访问SJA1000的基地址,按照电路的连接关系,该值为0xA0000。第2行定义了一个指向外部存储空间的指针变量,并将其指向SJA1000访问的基地址,对

SJA1000寄存器的读写通过操作该指针来完成。

xdata是C51编译器用于指定存储类型的扩展关键字,表示用MOVX@DPTR指令访问的外部存储器空间。( xdata unsigned char *)完成强制类型转换功能,将SJA_BASE_ADDR强制转换为1个xdata unsigned char类型的指针。

程序清单3.3第3~13行定义了对SJA1000寄存器的读写函数,在下文中对SJA1000的所有操作都以这2个函数为基础实现的。

1.1.3 寄存器位操作

在控制SJA1000时,有时我们需要对某些寄存器进行位操作(只改写指定位,其它位保持不变),如进入复位模式(模式寄存器的第0位置1)、退出复位模式(模式寄存器的第0位清0)。对寄存器的位操作一般是通过“读、改、写”的方式实现,基本步骤如下:

●读寄存器的当前值;

●根据需要修改读到的值的指定位;

●将修改后的值写回寄存器。

基于以上原理,我们实现“设置寄存器位”和“清零寄存器位”函数,以方便对SJA1000的操作。

1.设置寄存器位

设置寄存器位函数用于将指定寄存器的指定位置1,具体实现见程序清单3.4。

程序清单3.4 设置寄存器位函数

27/****************************************************************************************** ** 函数名称:SetBitMask

28** 函数功能:设置指定寄存器的指定位为1

29** 输入参数:RegAdr->寄存器地址

30** BitValue ->设置的位值

31** 输出参数:无

32** 返回值:1=操作成功,0=操作失败

33******************************************************************************************/ 34char SetBitMask(unsigned char RegAdr,unsigned char BitValue)

35{

36char status=0;

37unsigned char temp;

38temp = ReadSJAReg(RegAdr); // 读取寄存器的当前值

39t emp = temp | BitValue; // 将寄存器值的BitValue指定的位置1

40WriteSJAReg(RegAdr,temp); // 重写寄存器

41if(ReadSJAReg(RegAdr) == temp){ // 判断寄存器是否写成功

42status = 1; // 设置状态值为1

43} else {

44status = 0 ; // 设置状态值为0

45}

46return (status); // 返回状态值

47}

2.清零寄存器位

清零寄存器位函数用于将指定寄存器的指定位置0,具体实现见程序清单3.5。

程序清单3.5 清零寄存器位函数

48/****************************************************************************************** ** 函数名称:ClearBitMask

49** 函数功能:将指定寄存器的指定位清0

50** 输入参数:RegAdr -> 寄存器地址

51** BitValue -> 设置的位值

52** 输出参数:无

53** 返回值:1=操作成功,0=操作失败

54******************************************************************************************/ 55char ClearBitMask(unsigned char RegAdr,unsigned char BitValue)

56{

57char status=0;

58unsigned char temp;

59temp = ReadSJAReg(RegAdr); // 读取寄存器的当前值

60temp = temp&(~BitValue); // 将寄存器值的BitValue指定的位清零

61WriteSJAReg(RegAdr,temp); // 重写寄存器

62if(ReadSJAReg(RegAdr) == temp){ // 判断寄存器是否写成功

63status = 1; // 设置状态参数为1

64} else {

65status = 0 ; // 设置状态参数为0

66}

67return (status); // 返回操作标志

68}

1.1.4 连续读写寄存器

在访问SJA1000时,我们需要连续读写多个寄存器,如设置验收滤波器、收发CAN报文等,为方便这类程序的编写,我们可以先实现连续读写寄存器函数。

1.连续写寄存器

连续写寄存器函数通过循环调用写寄存器函数实现,详见程序清单3.6。

程序清单3.6 连续写多个寄存器

69/****************************************************************************************** ** 函数名称:WriteSJARegBlock

70** 函数功能:连续写多个寄存器

71** 输入参数:RegAdr -> 寄存器起始地址

72** ValueBuf -> 写寄存器时使用的指针

73** len -> 要连续写入的寄存器数

74** 输出参数:无

75** 返回值:连续写入的寄存器数

76******************************************************************************************/ 77char WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf, unsigned char len)

78{

79unsigned char i;

80if(len != 0){

81for(i=0;i

82WriteSJAReg (RegAdr+i,ValueBuf[i]);

83}

84}

85return len;

86}

2.连续读寄存器

连续读寄存器函数通过循环调用读寄存器函数实现,详见程序清单3.7。

程序清单3.7 连续读多个寄存器

87/****************************************************************************************** 88** 函数名称:ReadSJARegBlock

89** 函数功能:连续读多个寄存器

90** 输入参数:RegAdr -> 寄存器起始地址

91** ValueBuf -> 读寄存器时使用的指针

92** len -> 要连续读取的寄存器数

93** 输出参数:无

94** 返回值:连续读到的寄存器数

95******************************************************************************************/ 96char ReadSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf, unsigned char len)

97{

98unsigned char i;

99if(len != 0){

100for(i=0;i

101ValueBuf[i] = ReadSJAReg(RegAddr+i);

102}

103}

104return len;

105}

1.1.5 精确延时

延时是程序设计中经常使用的功能,常规的延时程序结构详见程序清单3.8。这种结构的延时程序,在不同的MCU平台上,需要根据实际测试结果调整延时内循环的循环次数,使内循环的执行时间达到期望,使用不便,移植困难。

程序清单3.8 常规延时函数

106/****************************************************************************************** 107** 函数名称:Delay

108** 函数功能:软件延时

109** 输入参数:n –> 软件延时的单位时间数

110** 输出参数:无

111** 返回值:无

112******************************************************************************************/ 113void Delay(unsigned int n)

114{

115int i;

116do {

117for(i=0 ;i < 100 ;i++); // 延时内循环,延时1个固定的时间

118} while (--n != 0); // 循环n次

119}

针对常规延时函数的不足,程序清单3.9通过使用MCU定时器的定时功能实现了一个精确延时函数。

程序清单3.9 精确延时函数

120// 定时器0初始化函数

121void timerInit(void)

122{

123TMOD &= ~T0_MASK; // 清除旧设置(#define T0_MASK 0x0F)

124TMOD |= 0x01; // 设置新模式:16位定时模式

125}

126

127/****************************************************************************************** 128** 函数名称:timerDelay

129** 函数功能:通过使用定时器实现精确延时

130** 输入参数:n -> 延时的10ms个数

131** 输出参数:无

132** 返回参数:无

133******************************************************************************************/ 134void timerDelay(unsigned int n) // 延时(0.01 * n)秒

135{

136do{

137// Timer装载(定时10ms)

138TL0 = LOW_BYTE(65536UL - CPUCLK / 100);

139TH0 = HIGH_BYTE(65536UL - CPUCLK / 100);

140TR0 = 1; // 启动Timer

141while (!TF0); // 等待Timer溢出

142TR0 = 0; // 关闭Timer

143TF0 = 0; // 清除溢出标志

144}while (--n != 0); // 循环n次

145}

程序清单3.9的第1~5行的timerInit函数将MCU定时器0设置为16位定时工作模式。

程序清单3.9的第17~25行通过等待定时器0计数溢出的方式来实现1个10ms的延时内循环。定时器0由timerInit函数初始化为定时工作方式,在该方式下,定时器0对MCU内部时钟12分频后的脉冲(在config.h中定义为CPUCLK)进行自加计数,当计数器初值设为“65536UL - CPUCLK / 100”时,计数器的计数值在启动后10ms时溢出,从而实现了10ms的精确延时。

CANBUS总线说明

CANBUS总线说明 CANBUS特性 系统采用CANBUS通讯方式,设计为现场总线连接方式,即是手拉手接线方式组网非常方便,终端上并跳接120欧姆电阻,总线方式实现“即插即用”的便利条件。 CAN总线可以由多个子网络组成,每个子网络必须满足以下条件: (1)同一网络中允许挂接110个节点 (2)传输距离最远为10千米 如果子网络超出以上任一条件,须增加网络桥扩展可组成多重网。以下是CANBUS单个网络的结构: CAN总线方式优点: 1、线路简单有利于综合布线,节省管线材,具有组网自由、安装方便、 扩充容易,改造灵活。 2、硬件连接简单, 具有实时性强、可靠性高、通信速率快、结构简单、 互操作性好、总线协议具有完善的错误处理机制、灵活性高和价格比 高。 3、数据传输速率高,在传输距离小于40 m时,最大传输速率可达1 Mb/s, 传输距离10km时速率达5kbps。 4、传输距离远,扰干扰能力强。

5、具有突出的可靠性、实时性和灵活性。 6、采用点对点、一点对多点及全局广播几种数据收发方式。 7、实现单点、双点、多点、区域、群组控制、场景设置、定时开关、亮 度手自动调节、红外线探测、集中监控、遥控等多种照明控制控制。 8、可实现全分布式多机系统,并且无主、从机之分,每个节点均主动发 送报文,可方便地构成多机备份系统。 9、采用非破坏性总线仲裁技术,两个节点同时上传送数据时,优先级低 的节点主动停止数据发送,优先级高的节点可不受影响地继续传输数 据,有效避免了总线冲突。 10、短帧结构总线上每帧有效字节数最多为8个,并有可靠的错误检 测和处理机制CRC 循环冗余校验措施,受干扰数据出错率极低,万一 某一节点出现严重错误,可自动脱离总线,总线上的其他操作不受影 响。 11、控制回路与强电分离,采用弱电DC24V CANBUS综合布线 CANBUS总线为4线制现场总线采用STP 4*0.75将其所有元件连成一个网络,为了保证系统通讯的可靠,布线时CAN总线尽量不与强电缆共用同一线槽,应将CAN总线单独穿钢管或PVC管敷设,并与电力电缆的水平距离至少大于300mm,下列为某项目布线图:

车载网络CANBUS总线

您在去4S店选车、看车时,是否会注意到一些车型的宣传彩页上标注有CAN-BUS总线技 术,当您好奇的去问销售人员这是一个怎样的技术,他们或许会说得含糊其辞或者是将这项技术吹得神乎其神,反正最终也没能消除您的疑惑。如果您回到家有心上网去查找有关这项技术的说明,出现的讲解可能又太过专业或程式化,让人难以理解。CAN-BUS总线技术不像诸如自动空调、感应式雨刷、倒车雷达等一些舒适性配置让人看得见、摸得着,可以让您切实感受到它们带给您的便利。但正是基于总线技术的不断发展和应用,才使得更多的舒适性配置得以装配到当今的车辆中。 本文想用一些通俗易懂的语言来告诉您CAN-BUS总线是怎么一回事,这项技术应用 在当今车辆上可以体现出哪些方面的优势,在购车时这项技术是否可以作为衡量一款车的素质的标准。 大家知道当今车辆的电控系统是越来越多,例如电子燃油喷射装置、ABS装置、安全气囊装置、电动门窗、主动悬架等等。同时遍布于车身的各种传感器实时的监测车辆的状态信息,并将此信息发送至相对应的控制单元内。 『车身上各种控制单元的分布图』 通过上图我们可以看到车身上的各种控制单元,车越高级,车身上的控制单元也就越多,每个控制单元都可看做一台独立的电脑,它可以接受信息,同时能对各种信息进行处理、分析,然后发出一个指令。比如发动机控制单元会接受来自进气压力传感器、发动机温度传感器、油门踏板位置传感器、发动机转速传感器等等的信息,在经过分析和处理后会发送相应的指令来控制喷油嘴的喷油量、点火提前角等等,其它控制单元的工作原理也都类似。在这里可以给大家做一个比喻,车上的各种控制单元就好比一家公司各个部门的经理,每个部门的经理接受来自自己部门员工的工作汇报,经过分析作出决策,并命令该部门的员工去执行。 『控制单元』 车身上的这些控制单元并不是独立工作的,它们作为一个整体,需要信息的共享,那么这就存在一个信息传递的问题。比如发动机控制单元内的发动机转速与油门踏板位置这两个信号也需要传递给自动变速器的控制单元,然后自动变速器控制单元会据此来发出升档和降档的操作指令,那么两个控制单元之间又是如何进行通信的呢? 『每项信息都通过各自独立的数据线进行交换』 目前在车辆上应用的信息传递形式有两种。第一种是每项信息都通过各自独立的数据线进行交换。比如两个控制单元间有5种信息需要传递,那么则需要5根独立的数据线。也就

CANBUS介绍

CANBUS介绍 作为ISO11898CAN标准的CANBus(ControLLer Area Net-work Bus),是制造厂中连接现场设备(传感器、执行器、控制器等)、面向广播的串行总线系统,最初由美国通用汽车公司(GM)开发用于汽车工业,后日渐增多地出现在制造自动化行业中。 1、CANBus系统组成及性能 CANBus系统通过相应的CAN接口连接工业设备(如限位开关、光电传感器、管道阀门、电机启动器、过程传感器、变频器、显示板、PLC和PCI 作站等)构成低成本网络。直接连接不仅提供了设备级故障诊断方法,而且提高了通信效率和设备的互换性。CANBus数据传输速率为1Mbit/s,线路距离lkm,基本站点数64,传输媒体是屏蔽双绞线或光纤。 2、CANBus数据链路控制特点 CANBus数据链路层协议采用平等式(Peer to peer)通信方式,即使主机出现故障,系统其余部分仍可运行(当然性能受一定影响)。当一个站点状态改变时,它可广播发送信息到所有站点。 CANBus的信息传输通过报文进行,报文帧有4种类型:数据帧、远程帧、出错帧和超载帧,其中数据帧格式如图8所示。CANBus帧的数据场较短,小于8B,数据长度在控制场中给出。短帧发送一方面降低了报文出错率,同时也有利于减少其他站点的发送延迟时间。帧发送的确认由发送站与接收站共同完成,发送站发出的ACK场包含两个“空闲”位(recessive bit),接收站在收到正确的CRC场后,立即发送一个“占有”位(dominant bit),给发送站一个确认的回答。CANBus还提供很强的错误处理能力,可区分位错误、填充错误、CRC 错误、形式错误和应答错误等。 CANBus应用一种面向位型的损伤仲裁方法来解决媒体多路访问带来的冲突问题。其仲裁过程是:当总线空闲时,线路表现为“闲置”电平(recessive level),此时任何站均可发送报文。发送站发出的帧起始字段产生一个“占有”电平(dominant level),标志发送开始。所有站以首先开始发送站的帧起始前沿来同步。若有多个站同时发送,那么在发送的仲裁场进行逐位比较。仲裁场包含标识符ID(标准为llbit),对应其优先级。每个站在发送仲裁场时,将发送位与线路电平比较,若相同则发送;若不同则得知优先级低而退出仲裁, 不再发送。系统响应时间与站点数无关,只取决于安排的优先权。可以看出,这种媒体访问控制方式不像Ethetnet的CSMA/CDCA协议那样会造成数据与信道带宽受损。 3、CANopen协议 CANBus除配置设备网(DevicnNet)协议外,还提供基于CAL(CANA pllicationlayer) 的CANopen协议(CiA DS-301),即支持设备参数的直接访问,又可实现有苛刻时间要求的过程数据通信。 CANBus的DeviceNet协议具有开放性,用户无须购买加入系统所需的硬件、软件和允许权,多厂家设备能够在单一网络上相互操作。CANhs也允许与Ethernet或其他局域网相连,接人控制算法组态及管理信息PC系统,从而形成管控一体化的工业网络。

CANBUS原理介绍

CAN总线原理介绍 一.现场总线简介 1、现场总线的概念: 现场总线是应用在生产现场,在微机化测量控制设备之间实现双向串行多节点数字通信的系统。也被称为开放式的数字化多节点通信的底层控制网络。 现场总线作为智能设备的联系纽带,把挂接在总线上的作为网络节点的智能设备连接为网络系统,并进一步构成自动化系统,实现基本控制、补偿计算、参数修改、报警、显示、监控、优化及控管一体化的综合自动化功能。 2、几种较有影响的现场总线技术: 基金会现场总线(FF-Foundation Fieldbus),Lonworks,PROFIBUS,HART,CAN现场 总线是几种较重要的现场总线技术。 二.CAN总线技术: 1、CAN 总线简介: CAN(Controller Area Network)-控制器局域网。它是一种有效支持分布式控制或实时控制的串行通信网络。CAN总线最早是由德国Bosch公司在80年代初为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信协议,它是一种多主总线,通信介质可以是双绞线、同轴电缆、光导纤维,通信速率可达1Mbps。 CAN 总线通信接口中集成了CAN 协议的物理层,数据链路层功能,可完成对通信数据的成帧处理,包括位填充,数据块编码,循环冗余校验,优先级判别等项工作。 2、CAN总线技术的主要特点: ⑴多主站依据优先权进行访问。 CAN为多主方式工作,网络上的任一节点在任何时候都可以主动地向网络上的其他节点发送信息。 ⑵采用短帧传送。 CAN采用短帧结构,废除了对传统的站地址编码,而是对通讯数据进行编码。每帧数 据信息为0∽8个字节,具体长度由用户决定。 ⑶无破坏基于优先权的仲裁。 当多个节点同时向总线发送信息时,优先级较低的节点会主动的退出总线发送,而最高优先级的节点可不受影响地继续传输数据,从而大大节省了总线冲突时间。 ⑷借助接收滤波的多地址帧传送。 CAN只需通过报文滤波即可实现点对点,一点对多点以及全局广播等几种方式来传输 数据,无需专门的“调度”。各个接收站依据报文中反映数据性质的标识符过滤报文,决定是否接收。 ⑸强有力的错误控制及错误重发功能: CAN的每帧信息都有CRC校验及其他检错措施,在错误严重的情况下具有自动关闭输出的功能,发送期间若丢失仲裁或由于出错而遭受破坏的帧可自动重新发送,每帧信息中不可检错的概率低于3 10-5。 ⑹长距离高速率发送: CAN的直接通信距离最远可达10km(速率5km以下);通信速率最高可达1Mbps(此时通信距离最长为40m)。CAN的通讯速率与其通信距离有呈线性关系。 ⑺CAN总线多负载能力: CAN上的节点数主要取决于物理总线的驱动电路,节点数目前可达110个;其报文标识符2032种(CAN2.0 A标准),而扩展标准(CAN2.0B)的报文标识符几乎不受限制。

Modbus&Canbus

一、Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus 协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。 1、在Modbus网络上转输 标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。 控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。 主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。 从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。 2、在其它类型网络上转输 在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。 在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。 3、查询—回应周期 控制器局域网(controllerareanetwork 简称CAN)最初是德国Bosch公司于1983年为汽车应用而开发的,一种能有效支持分布式控制和实时控制的串行通讯网络,属于现场总线(FieldBus)的范畴。1993年11月,ISO正式颁布了控制器局域网CAN国际标准(ISO11898),为控制器局域网标准化、规范化推广铺平了道路。目前它已经成为国际上应用最广泛的开放

CANBUS总线布线说明

CANBUS布线安装指导文件 一、拓扑接线图 系统采用CANBUS现场总线连接的通讯方式,设备接法为“手拉手” 接线方式,组网非常方便,网络两端的两个终端设备跳接120欧姆电阻,总线特点方式为“即插即用”。 二、地址码设备接线图 电缆接线采用“手拉手串联”方式接入,具体接线见使用说明书

三、组件网络的基本原则 组建网络的基本原则,见下图左面的A、B、C是不正确的,D、E、F是正确的。不恰当、错误的组建网络在低速率、近距离下是可以完成通讯,但是在高速率、远距离情况下就得按照正确的连接方式进行组建网络。 四、网络搭建 系统网络的组成可以由以下两个网络组合 单一主网络:只有一个主干线网络。 子网络:分支网络。 CANBUS系统总线可以由多个子网络组成,每个子网络必须满足以下条件: (1)同一网络中允许挂接110个节点

(2)传输距离最远为10千米 (3)采用指定通讯电缆传输数据 如果子网络超出以上任一条件,须增加CANBUS中继器来组成 多子网络。以下是CANBUS单个网络的结构: 子网络的拓展: 因为现场建筑影响走线,需要有一大段没有终端设备接入电缆走线,此时增加了无用的电缆成本,因此可以考虑多组建一个子网络来减少成本的投入。 采用一个中继器作为子网络的拓展接入点,见下图 五、终端匹配电阻接入 在一个单一网络或者一个子网络中,要保证信息可靠传输,就要在通讯网络的两端终端设备接入120Ω匹配电阻。才能在高速长距离中通讯中减少信号反射得到可靠的传输。 六、CAN总线方式优点:

1、线路简单有利于综合布线,节省管线材,具有组网自由、安装方便、扩充容易,改造灵活。 2、硬件连接简单, 具有实时性强、可靠性高、通信速率快、结构简单、互 操作性好、总线协议具有完善的错误处理机制、灵活性高和价格比高。 3、数据传输速率高,在传输距离小于40 m时,最大传输速率可达1 Mb/s, 传输距离10km时速率达5kbps。 4、传输距离远,扰干扰能力强。 5、具有突出的可靠性、实时性和灵活性。 6、采用点对点、一点对多点及全局广播几种数据收发方式。 7、可实现全分布式多机系统,并且无主、从机之分,每个节点均主动发送 报文 8、可方便地构成多机备份系统。 9、采用非破坏性总线仲裁技术,两个节点同时上传送数据时,优先级低的 节点主动停止数据发送,优先级高的节点可不受影响地继续传输数据, 有效避免了总线冲突。 10、短帧结构总线上每帧有效字节数最多为8个,并有可靠的错误检测和处理机制 CRC 循环冗余校验措施,受干扰数据出错率极低,万一某一节点出现严重错误, 可自动脱离总线,总线上的其他操作不受影 七、通讯电缆的选择 选用CAN总线通讯电缆(1线对双重屏蔽#9841型)请参见以下表。 CAN通讯电缆推荐型号:STP-120Ω one pair 20 AWG

CANBUS介绍及工作原理

CANBUS介绍及工作原理 什么是CANBUS? CANBUS即CAN总线技术,全称为“控制器局域网总线技术(Controller Area Network-BUS)”。CANBUS总线技术最早被用于飞机、坦克等武器电子系统的通讯联络上。将这种技术用于民用汽车最早起源于欧洲,在汽车上这种总线网络用于车上各种传感器数据的传递。 CANBUS的工作原理 大家知道当今车辆的电控系统是越来越多,例如电子燃油喷射装置、ABS装置、安全气囊装置、电动门窗、主动悬架等等。同时遍布于车身的各种传感器实时的监测车辆的状态信息,并将此信息发送至相对应的控制单元内。 『车身上各种控制单元的分布图』 通过上图我们可以看到车身上的各种控制单元,车越高级,车身上的控制单元也就越多,每个控制单元都可看做一台独立的电脑,它可以接受信息,同时能对各种信息进行处理、分析,然后发出一个指令。比如发动机控制单元会接受来自进气压力传感器、发动机温度传感器、油门踏板位置传感器、发动机转速传感器等等的信息,在经过分析和处理后会发送相应的指令来控制喷油嘴的喷油量、点火提前角等等,其它控制单元的工作原理也都类似。在这里可以给大家做一个比喻,车上的各种控制单元就好比一家公司各个部门的经理,每个部门的经理接受来自自己部门员工的工作汇报,经过分析作出决策,并命令该部门的员工去执行。 『控制单元』 车身上的这些控制单元并不是独立工作的,它们作为一个整体,需要信息的共享,那么这就存在一个信息传递的问题。比如发动机控制单元内的发动机转速与油门踏板位置这两个信号也需要传递给自动变速器的控制单元,然后自动变速器控制单元会据此来发出升档和降档的操作指令,那么两个控制单元之间又是如何进行通信的呢? 『每项信息都通过各自独立的数据线进行交换』 目前在车辆上应用的信息传递形式有两种。第一种是每项信息都通过各自独立的数据线进行交换。比如两个控制单元间有5种信息需要传递,那么则需要5根独立的数据线。也就是说信息的种类越多,数据线的数量和控制单元的针脚数也会相应增加。这些复杂繁多的线束无疑会增加车身重量,也为整车的布线带来一定困难。 『所有信息都通过两根数据线进行交换』 第二种方式是控制单元之间的所有信息都通过两根数据线进行交换,这种数据线也叫CAN数据总线。通过该种方式,所有的信息,不管信息容量的大小,都可以通过这两条数据线进行传递,这种方式充分的提高了整个系统的运行效率。我们常见的电脑键盘有104个按键,却可以发出数百种不同的指令,但键盘与电脑主机之间的数据连接线只有7根,键盘正是依靠这7根数据连接线上不同的编码信号来传递信息的。CAN数据总线的原理也正是如此。这种一线一用的专线制改为一线多用制,可以大大减少汽车上电线的数量,同时也简化了整

CANBUS总线状态

(8)仲裁(Arbitration) 只要总线空闲,任何节点都可以向总线发送报文。如果有两个或两个以上的节点同时发送报文,就会引起总线访问碰撞。通过使用标识符的逐位仲裁可以解决这个碰撞。仲裁的机制确保了报文和时间均不损失。当具有相同标识符的数据帧和远程帧同时发送时,数据帧优先于远程帧。在仲裁期间,每一个发送器都对发送位的电平与被监控的总线电平进行比较。如果电平相同,则这个单元可以继续发送,如果发送的是“隐性”电平而监视到的是“显性”电平,那么这个单元就失去了仲裁,必须退出发送状态。 (9)总线状态总线有“显性”和“隐性”两个状态,“显性”对应逻辑“0”,“隐性”对应逻辑“1”。“显性”状态和“隐性”状态与为“显性”状态,所以两个节点同时分别发送“0”和“1”时,总线上呈现“0”。CAN总线采用二进制不归零(NRZ)编码方式,所以总线上不是“0”,就是“1”。但是CAN协议并没有具体定义这两种状态的具体实现方式, CAN总线的物理层是将ECU连接至总线的驱动电路。ECU的总数将受限于总线上的电气负荷。物理层定义了物理数据在总线上各节点间的传输过程,主要是连接介质、线路电气特性、数据的编码/解码、位定时和同步的实施标准。BOSCH CAN基本上没有对物理层进行定义,但基于CAN的ISO标准对物理层进行了定义。设计一个CAN系统时,物理层具有很大的选择余地,但必须保证CAN协议中媒体访问层非破坏性位仲裁的要求,即出现总线竞争时,具有较高优先权的报文获取总线竞争的原则,所以要求物理层必须支持CAN总线中隐性位和显性位的状态特征。在没有发送显性位时,总线处于隐性状态,空闲时,总线处于隐性状态;当有一个或多个节点发送显性位,显性位覆盖隐性位,使总线处于显性状态。在此基础上,物理层主要取决于传输速度的要求。从物理结构上看,CAN节点的构成如图7-8所示。在CAN中,物理层从结构上可分为三层:分别是物理层信令(Physical Layer Signaling,PLS)、物理介质附件(Physical MediaAttachment,PMA)层和介质从属接口(Media Dependent:Inter-face,MDI)层。其中PLS连同数据链路层功能由CAN控制器完成,PMA层功能由CAN收发器完成,MDI层定义了电缆和连接器的特性。目前也有支持CAN的微处理器内部集成了CAN控制器和收发器电路,如MC68HC908GZl6。PMA 和MDI两层有很多不同的国际或国家或行业标准,也可自行定义,比较流行的是ISOll898定义的高速CAN发送/接收器标准。理论上,CAN总线上的节点数几乎不受限制,可达到2000个,实际上受电气特性的限制,最多只能接100多个节点。 CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。

相关主题
文本预览
相关文档 最新文档