1 RS485 及CAN 总线简介
RS485 是一种平衡传输办法的串行接口规范,选用半双工异步数据通讯办法。依据在RS485 总线上只能有一个主机的特色,它往往运用在集中操控纽带和涣散操控单元之间。一起RS485 的总线功率低,体系的实时性差,通讯的可靠性低,后期维护本钱高,网络工程调试杂乱,传输间隔不抱负,单总线可挂接的节点少等缺陷也限制了其运用。
CAN(Controller Area Network,操控器局域网)现场总线是一种由带CAN 操控器组成的高性能串行数据局域通讯网络,是国际上运用最广泛的现场总线之一。它的总线长度最远可达10 千米(速率5Kbps 以下),数据传输速率最高可达1Mbps(通讯间隔40 米以内)。它在多主办法下作业,不分主从。选用非损坏总线裁定技能,即便网络负载很重也不会呈现网络瘫痪现象。此外,CAN 的每帧信息都有CRC 校验和其它检错办法,有很好的检错作用。由于CAN 总线具有以上长处,它现在现已被广泛运用到轿车电子、电力体系、航空工业和主动作业等领域中,并构成了国际规范,被公认为几种最有出路的现场总线之一。
一时间彻底抛弃RS485网络体系是有困难的,尤其是在现已具有现成的硬件网络中。因而考虑一种折中的办法,便是在保存现有RS485体系硬件结构的基础上,增加一个CAN总线接口,然后完结RS485网络与CAN网络的互联。
2 体系硬件规划
RS485-CAN转化器硬件规划框图如图1所示,整个硬件体系分为5个模块:微操控器模块,根本模块,CAN接口模块,RS485模块和贮存模块。其间CAN接口模块的CAN操控器的选用要依据微操控器模块,假如挑选的微操控器中集成了CAN操控器,则无需外接CAN操控器,不然需求外接CAN操控器。
2.1 微操控器模块,根本模块以及贮存模块
这三个模块的规划归于惯例规划,因而省去详细的电路图。需求阐明的是微操控器能够挑选内部集成了CAN 操控器的单片机,可是本规划依据体系本钱,性价比以及微操控器的运用普遍性的考虑,运用的是ATMEL 的AT89C52 单片机;根本模块首要是完结微操控器的外围电路规划,首要包含电源和晶振以及复位电路等;贮存模块首要是用来贮存体系的装备信息,如CAN 波特率,RS485 波特率等,要求的贮存空间较小,1K 的片外EEPROM 满意运用,当然也能够挑选自带EEPROM 的微处理器。
图1:体系硬件规划框图
2.2 CAN 接口模块
CAN 接口模块包含总线操控器和收发器两部分。CAN 总线操控器挑选的是SJA1000,它是Philips 公司推出的一款彻底契合CAN 总线协议规则的CAN 操控器,可完结报文操控,数据滤波等CAN 操控器功用,SJA1000 不只兼容PCA82C200 支撑的BasicCAN(CANBUS2.0A)形式,还支撑功用更强的PeliCAN(CANBUS 2.0B)形式;收发器挑选的是TJA1050,它是CAN 协议操控器和物理总线的接口,是一种规范的高速CAN 收发器。
图2:CAN 模块电路图
如图2所示SJA1000的AD0-AD7与单片机的数据总线相连,P2.0引脚作为SJA1000的片选使能端,由ALE,WR,RD操控SJA1000的数据的发送和接纳。11脚MODE接高电平,选用51系列的8位微操控器的Intel二分频形式。16脚是中止信号,接单片机的外部中止引脚。TX1脚悬空,RX1脚的电位有必要维持在0.5VCC以上,不然将不能构成CAN总线所要求的电平逻辑。
高速光耦6N137提高了总线节点的抗搅扰才能,TVS能防止数据遭到不必要的外界影响并能维护元器材;另外在总线两头的设备加120欧姆的匹配电阻会使数据通讯的抗搅扰性以及可靠性大大加强,CANH和CANL与地之间并联两个30PF的小%&&&&&%,能够滤除总线上的高频搅扰而且具有必定的防电磁辐射的才能。这些额定的维护电路相同合适RS485模块的规划。
2.3 RS485 接口模块
RS485 接口模块选用MAX485 芯片作为总线收发器,它是+5V 低功耗半双工器材。MAX485 的驱动器输出是差分输出,彻底满意RS485 串行协议的要求,兼容工业规范规范,契合RS485 串行协议的电气规范。电路衔接如图3。
图 3:RS485 模块电路图
3 体系软件规划
本体系的软件规划除了完结单个模块的驱动程序以外,最首要的便是完结两种网络间不同协议的转化。CAN协议参阅模型中界说了物理层和数据链路层,RS485协议参阅模型中只界说了物理层。因而树立图4所示的协议模型。
CAN的帧格局中,有一个标识符域,CAN操控器的大局滤波器会检测这个标识域,决议是否接纳本帧数据。由于RS485网络上,一切节点都会一起收到数据,因而能够为一切的RS485从设备设定同一个标识符。一个CAN节点若要发送数据给RS485设备,只需在该帧把标识符域设定为相应的标识符即可;RS485本质上仅仅是一个物理层规范,其帧格局彻底由用户自己界说。终究在RS485总线中传输还是以帧为单位,其间包含了地址信息。RS485设备会主动依据接纳到的帧,主动判别该帧是否发往本节点,然后做出相应处理。因而,在RS485设备要发送数据时,RS485-CAN总线转化器只需把RS485总线的数据进行帧打包后送入CAN的数据帧中,然后发送到CAN网络上;而RS485设备在接纳数据时,RS485-CAN总线转化器则把RS485总线的数据帧从接纳到的CAN数据帧中提取出来,发往RS485设备即可。
图4:RS485-CAN 协议模型
3.1CAN 接口软件规划
CAN总线数据链路层结构可分为逻辑链路操控(LLC)子层和媒体拜访操控(MAC)子层。LLC子层首要完结帧接纳滤波,超载布告和康复办理,而MAC子层结构功用模块包含发送和接纳两个部分。关于CAN总线数据链路层的各种协议现已被集成到SJA1000芯片中,运用时只要对SJA1000芯片的操控寄存器进行相应的初始化即可进行通讯,而数据的接纳和发送等也是经过读写SJA1000内部寄存器来完结的。这儿只给出SJA1000的初始化源程序,其它程序可参阅文献[2]进行编写。
SJA1000开端作业之前,首要要判别SJA1000与微处理器的衔接是否正确,在承认正确后开端SJA1000的初始化,之后SJA1000进入作业形式,然后才能够进行数据的读写。
typedef struct _CAN_PORTSTRUCT /*SJA1000初始化装备文件结构体*/
{
FIL filter; /*滤波办法*/
LIS lisen; /*只听形式/正常形式*/
TES test; /*自测试形式/正常形式*/
SLE sleep; /*睡觉形式设置*/
BAUD baud_rate; /*波特率*/
MODEL workmodel ; /*作业形式*/
UCHAR mask1;
UCHAR mask2;
UCHAR mask3;
UCHAR mask4;
UCHAR code1;
UCHAR code2;
UCHAR code3;
UCHAR code4;
}CAN_PORT,*CANPORTPTR;
STATUS sja1000Init(CANPORTPTR pDev) /*SJA1000初始化*/
{
UCHAR value;
canBoardInit(); /*进入复位形式*/
canBoard_canOutByte(SJA1000_MOD,MOD_RM); /*确认CAN操控器作业形式*/
value = canBoard_canInByte(SJA1000_CDR);
if(pDev->workmodel == Peli) value|= PeliCAN ;
else value &= ~PeliCAN;
/*设置形式寄存器(只在PeliCAN形式可拜访)*/
canBoard_canOutByte(SJA1000_CDR,value|0x48);
value = canBoard_canInByte(SJA1000_MOD);
if(pDev->sleep == SNORM) value &=~(MOD_SM); /*睡觉形式*/
else value|= MOD_SM; /*正常形式*/
if(pDev->lisen == LNORM) value&= ~(MOD_LOM); /*正常形式*/
else value|= MOD_LOM; /*只听形式*/
if(pDev->test == TNORM) value&= ~(MOD_STM); /*正常形式*/
else value|= MOD_STM; /*自检测形式*/
if(pDev->filter == SINGLE) value|= MOD_AFM; /*单向检验滤波*/
else value &=(~MOD_AFM); /*双向检验滤波*/
canBoard_canOutByte(SJA1000_MOD,value);
switch (pDev->baud_rate)
{
case B20: //波特率为20kpbs
canBoard_canOutByte(SJA1000_BTR0,0x07);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
break;
case B80: //波特率为80kpbs
canBoard_canOutByte(SJA1000_BTR0,0x01);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
break;
case B250: //波特率为250kpbs
canBoard_canOutByte(SJA1000_BTR0,0x00);
canBoard_canOutByte(SJA1000_BTR1,0x1C);
break;
case B500: //波特率为500kpbs
canBoard_canOutByte(SJA1000_BTR0,0x00);
canBoard_canOutByte(SJA1000_BTR1,0x14);
break;
default: //默许波特率为20kpbs
canBoard_canOutByte(SJA1000_BTR0,0x07);
canBoard_canOutByte(SJA1000_BTR1,0x7F);
}
canBoard_canOutByte(SJA1000_CMR,0); /*设置指令寄存器*/
canBoard_canOutByte(SJA1000_EWLR,0x60); /*设置过错报警限额寄存器*/
canBoard_canOutByte(SJA1000_IER,0); /*不使能一切中止*/
canBoard_canOutByte(SJA1000_OCR,0xaa); /*输出操控寄存器设置*/
canBoard_canOutByte(SJA1000_TXERR,0x0); /*设置发送过错计数器*/
canBoard_canOutByte(SJA1000_RXERR,0x0); /*设置承受过错计数器*/
canBoard_canOutByte(SJA1000_RMC,0); /*设置接纳报文计数器*/
canBoard_canOutByte(SJA1000_ACR0,pDev->code1);
canBoard_canOutByte(SJA1000_ACR1,pDev->code2); /*设置检验代码寄存器*/
canBoard_canOutByte(SJA1000_ACR2,pDev->code3);
canBoard_canOutByte(SJA1000_ACR3,pDev->code4);
canBoard_canOutByte(SJA1000_AMR0,pDev->mask4);
canBoard_canOutByte(SJA1000_AMR1,pDev->mask4); /*设置检验屏蔽寄存器*/
canBoard_canOutByte(SJA1000_AMR2,pDev->mask4);
canBoard_canOutByte(SJA1000_AMR3,pDev->mask4);
return OK;
}
3.2 RS485接口软件规划
RS485接口软件规划首要包含串口的初始化,串口中止处理等函数的编写,由于RS485接口的软件规划比较简单,所以这部分可参阅文献[4]规划,这儿省掉。
结束语
CAN总线是当时运用最为广泛的现场总线之一,而RS485总线是最常用的串行总线,二者之间的转化具有很高的运用价值。规划应留意以下几点:(1)RS485-CAN转化器的首要任务是将数据以最快的速度转发,流量和过失操控应由通讯两边的运用层来完结,因而规划不能过于杂乱。(2)处理速度是规划时首要考虑的一点,这将影响芯片的选型。(3)RS485-CAN的通用性取决于软件方面的规划和协议的运用,硬件上都是兼容的。