DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 956|回复: 0
打印 上一主题 下一主题

[接口电路] RS485-CAN 转换器的设计

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 17:30:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                    ???? 摘 要:文章首先介绍了RS485总线和CAN总线的特点,然后结合RS485总线的缺点与CAN总线的优点,给出了RS485-CAN转换器的设计方法,最后描述了具体的硬软件设计。
  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 的微处理器。




图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。




图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的通用性取决于软件方面的设计和协议的使用,硬件上都是兼容的。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-6-5 10:43 , 耗时 0.098412 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表