嵌入式系统应用中实现RS485的方向切换

发布者:WanderlustHeart最新更新时间:2015-03-11 来源: dzsc关键字:嵌入式系统  RS485  方向切换 手机看文章 扫描二维码
随时随地手机看文章
  RS485接口具有良好的抗噪声干扰性能、长传输距离和多站能力等特点,使其成为工业控制的首选串行接口。嵌入式系统中也广泛采用RS485接口作为设备控制的串行接口。RS485采用两线差分的接线方式进行串口数据的传输。由于发送和接收都是采用这两根差分线进行,因此它是半双工工作模式。基于RS485的特点,分别讲述了通过硬件方式和软件方式来实现RS485发送和接收方向的切换,重点解决了DM8168嵌入式平台上软件实现RS485方向切换的功能。

  RS485总线是工业应用中非常成熟的技术,是现代通信技术的工业标准之一。RS485总线用于多站互连十分方便,用一对双绞线即可实现,采用平衡发送和差分接收,即在发送端驱动器将TTL电平信号转换成差分信号输出,在接收端接收器将差分信号变成TTL电平,因此具有抗共模干扰的能力。根据RS485标准,传送数据速率达100 kb/s时通信距离可达1200 m。

  RS485在嵌入式系统中的应用非常广泛。嵌入式系统可以通过RS485接口来控制终端设备。由于RS485是半双工模式,因此发送和接收的方向切换需要我们的关注和研究。如果方向切换方式选择不好可能会导致RS485驱动能力下降、软件执行效率下降,甚至导致系统异常等问题。

  本文分别给出硬件实现RS485方向切换和软件实现RS485方向切换两种方式。两种方式各有优点,硬件方式控制起来比较简单。软件方式的驱动能力更好,但是和嵌入式平台关系比较密切,不同的平台都需要调试和验证。

  1 硬件方式控制RS485方向

  图1所示为硬件控制RS485的电路图。电路中使用2N7002LT1G MOS场效晶体管把UART_TXD_485这个MCU输出的RS485发送信号逻辑取反后送给RS485芯片的RE/DE PIN脚。控制的原理是,当UART_TXD_485输出低电平时RS485芯片的DE使能;输出高电平时RE使能。默认情况下UART_TXD_485是高电平,RS485芯片处于接收状态。发送数据时,UART_TXD_485上面有高低电平信号变化,低电平信号通过RS485芯片SP3072EENL/TR直接输出,高电平信号通过外部上下拉电阻来控制。

  这种方法的优点是控制简单,软件不需要做额外的工作,控制RS485像控制RS232一样。但是这种方法的缺点是驱动能力可能不足,由于这种控制方法没有完全发挥出RS485驱动芯片自身的驱动能力,输出信号依赖于外部上下拉电阻,因此在复杂环境下,譬如很多负载需要控制时,就会存在驱动能力不足的问题。但是在一些简单的环境或者软件实现较复杂的平台下,使用这种方法还是切实可行的。

  图1 硬件控制RS485电路图

  2 软件方式控制RS485方向

  2.1 驱动能力分析

  在复杂的RS485控制环境下,用上面介绍的硬件方式来控制RS485的方向会存在比较突出的驱动能力不足的问题。修改上述控制方法,将TTL这一侧的2线控制改为3线控制,就是将收发控制信号不用当前的/TXD来控制,而从主控分出一根GPIO线来控制收发。

  按照输出电流计算,3线控制方式相对用2线控制的总线上下拉作为输出的方式,其驱动能力提高了25~50倍(不同厂家不同型号有差异),如果辅以终端电阻灵活配置的措施,RS485的驱动能力将完全不是问题。表1是两种控制方式驱动能力的对比。

  2.2 软硬件环境

  图2 软件控制方法中的硬件设计

  软件控制方法采用图2的硬件设计,图中很突出的修改是使用MCU的GPIO来控制RE和DE.RS485芯片的供电采用5 V供电,提高驱动能力。RS485芯片的RE和DE控制使用MCU的GPIO输出高低电平来控制。简单来说就是,在RS485进行数据传输时,通过GPIO来控制传输方向。这里采用的MCU是TI公司的DM8168处理器来实现软件的RS485切换功能。软件版本使用UBoot2010.06和linux2.6.37。用软件来实现RS485的收发,尽量要保证执行效率;要达到上面的目的就需要对串口驱动进行调试,使用串口驱动用到的软件资源和串口控制器本身的硬件资源来实现RS485的控制。[page]

  表1 软件和硬件控制方式驱动能力的对比

 

  2.3 UBoot代码修改

  需要修改的文件:

  ① board/ti/ti8168/evm.c

  ② drivers/serial/ns16550.c

  ③ include/configs/ti8168_evm.h

  ti8168_evm.h文件中增加切换宏定义:

  #define CONFIG_RS485_DIR_SW 1

  evm.c文件中增加切换函数:

  void rs485_dir_sw(int rs485_dir){

  if (rs485_dir ==0)

  _raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_CLEARDATAOUT);

  else

  _raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_SETDATAOUT);

  }

  s16550.c串口驱动文件中增加RS485方向控制:

  void NS16550_putc(NS16550_t com_port, char c){

  #ifdef CONFIG_RS485_DIR_SW

  rs485_dir_sw(1);

  #endif

  ……//此处代码省略

  #ifdef CONFIG_RS485_DIR_SW

  while((serial_in(&com_port->lsr) & UART_LSR_TEMT) == 0)

  rs485_dir_sw(0);

  #endif

  }

  其中UART_LSR_TEMT表示发送BUF和移位寄存器为空。默认情况下RS485是接收状态,一旦要发送数据,就把RS485切换为发送状态。发送完数据后,等待发送BUF和移位寄存器为空,然后切换回接收状态,这里无需使用timeout。

  2.4 Linux代码修改

  需要修改的文件:

  ① arch/arm/machomap2/bordti8168evm.c

  ② drivers/serial/omapserial.c

  ③ include/linux/serial_core.h

  serial_core.h文件,uart_port结构体中增加set_rs485_direction函数指针,用于执行RS485的方向切换void (*set_rs485_direction)(int rs485_dir);原本考虑在uart_ops结构体中增加的,但是这个结构体是常量类型,对它不作改动,因此加到了uart_port结构体中。在该文件中添加相关宏定义和函数指针类型用于函数注册:

  #define SET_RS485_RX0

  #define SET_RS485_TX1

  typedef void (*set_rs485_direction_t)(int rs485_dir);//用于函数注册

  omapserial.c文件主要做了如下几点改动:

  ① 添加omap_rs485_dir_fun全局的函数指针。

  static set_rs485_direction_t omap_rs485_dir_fun[OMAP_MAX_HSUART_PORTS]={NULL, NULL, NULL, NULL, NULL, NULL}

  ② 外部驱动利用omap_rs485_dir_fun_reg注册函数对omap_rs485_dir_fun进行赋值。

  void omap_rs485_dir_fun_reg(int port_num, set_rs485_direction_t rs485_dir_fun){

  if (port_num>=OMAP_MAX_HSUART_PORTS)

  printk(KERN_ERR “%s, port_num error max is %d, but %d \n”, __FUNCTION__, OMAP_MAX_HSUART_PORTS-1, port_num);

  omap_rs485_dir_fun[port_num]= rs485_dir_fun;

  }

  EXPORT_SYMBOL(omap_rs485_dir_fun_reg);

  ③ serial_omap_probe函数中对控制程序中用到的up->port.set_rs485_direction进行赋值。

  up->port.set_rs485_direction= omap_rs485_dir_fun[pdev->id];

  ④ 默认情况下RS485处于接收状态。

  ⑤ serial_omap_enable_ier_thri函数中把RS485切换为发送状态。

  static incline void serial_omap_enable_ier_thri(struct uart_omap_port *up){

  if (!(up->ier & UART_IER_THRI)) {

  /* rs485 dir change to tx */

  if (up->port.set_rs485_direction != NULL)

  up->port.set_rs485_direction(SET_RS485_TX);

  ……//此处代码省略

  }

  }

  ⑥ serial_omap_stop_tx函数中把RS485切换为接收状态。

  static void serial_omap_stop_tx(struct uart_omap_port *port){

  ……//此处代码省略

  if (up->ier & UART_IER_THRI) {

  up->ier &= ~UART_IER_THRI;

  serial_out(up, UART_IER, up->ier);

  /* rs485 dir change to rx */

  if (port->set_rs485_direction != NULL)

  port->set_rs485_direction(SET_RS485_RX);

  }

  }

  ⑦ transmit_chars更改一下,原先的代码是当没有更多的字符要发送(环形缓冲为空)时需要关闭发送中断,这时串口控制器发送BUF和移位寄存器中还是有数据的,这些数据串口控制器自动发送完成后才算结束,由于已经关闭了发送中断,因此发送结束后就没有中断产生了。但是RS485切换方向需要等到完全发送完成后才能进行。因此对transmit_chars函数做了修改。调用serial_omap_stop_tx函数前判断发送BUF和移位寄存器是否为空,如果为空就可以切换方向了。简而言之,延后了发送中断的关闭时间。[page]

  static void transmit_chars(struct uart_omap_port *up){

  ……//此处代码省略

  if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {

  if (up->port.ops->tx_empty(&up->port)==0)

  return;//added for last transmit

  serial_omap_stop_tx(&up->port);

  return;

  }

  ……//此处代码省略

  if (uart_circ_empty(xmit)) {

  if (up->port.ops->tx_empty(&up->port)==0)

  return;//added for last transmit

  serial_omap_stop_tx(&up->port);

  }

  }

  ⑧ arch/arm/machomap2/boardti8168evm.c文件在ti8168_evm_init函数中调用omap_rs485_dir_fun_reg函数注册RS485切换函数。

  2.5 实验结果分析

  上述软件修改有如下几个优点:不增加硬件开销;不增加和使用任何硬件资源;不增加软件开销;不影响软件执行效率;硬件控制是电信号控制,方向切换和TX绑定;软件控制是整个发送缓冲区完成发送后再进行方向切换,控制实现上更加合理。

  对软件切换RS485做了基本的测试,情况如下:

  ① 控制台操作。整个启动打印信息正常。UBoot和Kernel下控制效果和硬件控制一样,可以很流畅地进行命令的输入和回显,串口终端增加输入字符间的延时后可以进行配置的粘贴。内核在115 200和38 400下分别进行测试OK。

  ② 内核下加大负责进行大数据量的发送。增加负载,开多个ping包进程(产生大量中断)、Nand Flash的操作、CPU占有率接近100%条件下,通过RS485输出大量数据,没有乱码,校验OK。

  ③ 极高的实时性。

  由于本文给出的软件实现方式是基于Linux内核实现的,因此很好地保证了方向控制的实时性。实际结果显示,DM8168数据发送完成到产生方向控制信号之间的时间在25 μs左右,几乎可以忽略不计。而有些设计在用户空间使用应用程序进行方向切换的方法会导致20 ms以上的延时,导致了一系列异常问题的产生。

  结语

  本文详细描述了RS485方向控制的硬件和软件两种实现方式。两种控制方式各有特点,硬件控制方式实现简单,不需要软件干预,对软件而言RS485串口收发就像RS232一样简单。软件控制方式可以极大地提高整个RS485线路的驱动能力,本文给出的基于Linux内核的控制方法又很好地保证了RS485方向切换的实时性,满足了实用性要求。这两种方式在很多场合已经得到了很好的应用和验证。特别是软件实现方式,可以扩展到更多的应用场合,譬如复杂的多主、多从的RS485使用环境,软件控制可以根据自己的需求来实现整个RS485线路不同的数据流向,可以规避某个设备对RS485链路上异常信号的干扰,给实际应用带来了很多的便利性。

关键字:嵌入式系统  RS485  方向切换 引用地址:嵌入式系统应用中实现RS485的方向切换

上一篇:学C51的基础 8 《 控制流程语句 》
下一篇:自制FM收音机

推荐阅读最新更新时间:2024-03-16 13:54

嵌入式系统开发要素的选择分析
摘要:主要讨论在嵌入式系统开发中,设计人员如何考虑和选择嵌入式处理器、嵌入式操作系统、调试器、仿真器以及开发人员的技术水平和结构比例等组成要素;同时,以实例说明如何选择这些开发要素。 关键词:嵌入式系统 嵌入式处理器 实时操作系统 仿真器 调试器 引 言   在计算机、互联网和通信技术高速发展的同时,嵌入式系统开发技术也取得迅速发展。这不仅表现在从事嵌入式系统开发研究的人员队伍日益壮大,嵌入式处理器和实时操作系统的性能增强和产品升级换代,更重要的体现在嵌入式技术应用范围的急剧扩大。   嵌入式系统拥有巨大的市场空间,我国应该抓住机遇,与时俱进,奋起直追,在嵌入式系统领域赶超世界先进水平。要达到这个目标,具有一定的现实可行性
[应用]
嵌入式系统应用中实现RS485方向切换
  RS485接口具有良好的抗噪声干扰性能、长传输距离和多站能力等特点,使其成为工业控制的首选串行接口。嵌入式系统中也广泛采用RS485接口作为设备控制的串行接口。RS485采用两线差分的接线方式进行串口数据的传输。由于发送和接收都是采用这两根差分线进行,因此它是半双工工作模式。基于RS485的特点,分别讲述了通过硬件方式和软件方式来实现RS485发送和接收方向的切换,重点解决了DM8168嵌入式平台上软件实现RS485方向切换的功能。   RS485总线是工业应用中非常成熟的技术,是现代通信技术的工业标准之一。RS485总线用于多站互连十分方便,用一对双绞线即可实现,采用平衡发送和差分接收,即在发送端驱动器将TTL电平信号转换成差
[单片机]
<font color='red'>嵌入式系统</font>应用中实现<font color='red'>RS485</font>的<font color='red'>方向</font><font color='red'>切换</font>
嵌入式系统低功耗设计研究
引 言   经过近几年的快速发展,嵌入式系统(Embedded System)已经成为电子信息产业中最具增长力的一个分支。随着手机、PDA,GPS、机顶盒等新兴产品的大量应用,嵌入式系统的市场正在以每年30%的速度递增(IDC预测),嵌入式系统的设计也成为软硬件工程师越来越关心的话题。   在嵌入式系统设计中,低功耗设计(Low Power Design)是许多设计人员必须面对的问题。其原因在于嵌入式系统被广泛应用于便携式和移动性较强的产品中,而这些产品不是一直都有充足的电源供应,往往是靠电池来供电的;而且大多数嵌入式设备都有体积和质量的约束。另外,系统部件产生的热量和功耗成比例,为解决散热问题而采取的冷却措施进一步增加了系
[单片机]
<font color='red'>嵌入式系统</font>低功耗设计研究
嵌入式系统HAL原理与BSP的实现方法
随着计算机软硬件技术的快速发展,出现了越来越多的便携设备和智能设备。这些设备中通常包含控制用的CPU和相应的操作系统;这类特殊的计算机系统叫做嵌入式实时系统。嵌入式实时系统以其简洁高效等特点在计算机、通信等领域中广泛使用。 由于嵌入式实时系统应用环境的特殊性,因此在设计实现过程中存在着许多特殊问题。其中,操作系统及其他系统软件模块与硬件之间的接口形式是嵌入式实时系 统的主要特征和系统设计过程中的必需环节,也是影响嵌入式系统应用前景的关键问题。经过近些年的发展,随着通用嵌入式操作系统技术的日趋成熟和应用的不断 扩大,一种统一的接口形式得到广泛的认可和应用,这就是通常所说的板级支持包,即BSP。 1 嵌入式系统硬件抽象层的原理 1.1
[单片机]
<font color='red'>嵌入式系统</font>HAL原理与BSP的实现方法
基于MC9328MX1芯片的嵌入式系统
引言 嵌入式系统是以实际应用为he心,对功能、可靠性、成本、体积、功耗有严格要求的zhuan业计算机系统,随着嵌入式系统相关技术的迅速发展,嵌入式系统功能越来越强,应用接口更加丰富,根据实际应用的需要设计出特定的嵌入式 小系统和应用系统,是嵌入式系统设计人员应具备的能力,由于ARM嵌入式体系的结构的一致性以及外围电路的通用性,采用ARM内核的嵌入式 小系统的设计原则和设计方法基本相同,本文基于MC9328MX1芯片介绍ARM嵌入式 小系统设计的一般方法。 1 MC9328MX1概述 MC9328MX1是Motorola公司基于ARM920T的龙珠(Dragon Ball)MX1处理器,MC9328MX1内含ARM公司设计的16/
[单片机]
基于MC9328MX1芯片的<font color='red'>嵌入式系统</font>
RS485的最大连接设备数
 在当今信息通讯高速发展的阶段,人们在充分享受网络给人类带来的喜悦。随着网络的普及和发展,使得各种控制设备网络化成为可能。自动化监控、安全防护、门禁考勤及工业自动化系统得到迅速普及和应用。在工业控制设备之间中长距离通信的诸多方案中,RS-485系统总线因硬件设计简单、控制方便、成本低廉等优点广泛应用于工厂自动化、工业控制、小区监控、水利自动测控等领域,随着RS485总线系统的广泛应用,RS485总线系统也越来越大,RS485总线外挂的485设备越来越多,从而导致485总线的稳定性越来越差。现在市场上已经有可以负载128,256台甚至400台485设备的转换器,由于485总线使用总线连接形式,形成如果有一个485设备出现问题,就导致整
[嵌入式]
RS485总线可靠性提高方法及故障处理
    在MCU之间中长距离通信的诸多方案中,RS485因硬件设计简单、控制方便、成本低廉等优点广泛应用于工厂自动化、工业控制、小区监控、水利自动报测等领域。但RS485总线在抗干扰、自适应、通信效率等方面仍存在缺陷,一些细节的处理不当常会导致通信失败甚至系统瘫痪等故障,因此提高   另外一种比较省电的匹配方案是RC 匹配(图2)利用一只电容C   隔断直流成分,可以节省大部分功率,但电容C的取值是个难点,需要在功耗和匹配质量间进行折衷。除上述两种外还有一种采用二极管的匹配方案(图3),这种方案虽未实现真正的匹配,但它利用二极管的钳位作用,迅速削弱反射信号达到改善信号质量的目的,节能效果显著。欲了解更多信息请登录电子发烧友
[嵌入式]
ARM嵌入式系统中触摸屏的中断控制方法
随着嵌入式微处理器性能的提高,集成的外围接口设备越来越多,而外围设备与处理器之间多采用中断方式进行通信,即使在没有操作系统的情况下,也常需要对多个外围设备的中断处理例程进行动态加载,从而实现对多个外围设备的集中动态管理。同时,中断功能可以解决CPU内部运行速度远远快于外部总线速度而产生的等待延时问题。因此,嵌入式微处理器的应用设计中,中断处理通常是系统的核心任务之一。 1 触摸屏 (1)触摸屏简介 随着多媒体信息查询的与日俱增,人们越来越关注触摸屏。触摸屏具有坚固耐用、反应速度快、节省空间、易于交流等许多优点,作为一种最新的电脑输入设备,它是目前最简单、方便、自然的人机交互方式。它赋予多媒体崭新的面貌,是极富吸引力的
[单片机]
ARM<font color='red'>嵌入式系统</font>中触摸屏的中断控制方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved