历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2018年02月03日 | 嵌入式系统应用实现RS485的方向切换

2018-02-03 来源:eefocus

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驱动芯片自身的驱动能力,输出信号依赖于外部上下拉电阻,因此在复杂环境下,譬如很多负载需要控制时,就会存在驱动能力不足的问题。但是在一些简单的环境或者软件实现较复杂的平台下,使用这种方法还是切实可行的。

      

     

图1 硬件控制RS485电路图


2 软件方式控制RS485方向


2.1 驱动能力分析


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

      

其驱动能力提高了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的控制。


表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和移位寄存器是否为空,如果为空就可以切换方向了。简而言之,延后了发送中断的关闭时间。

      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链路上异常信号的干扰,给实际应用带来了很多的便利性。


推荐阅读

史海拾趣

Hind Rectifiers Ltd公司的发展小趣事

故事一:Hind Rectifiers Ltd.的起源与早期发展

Hind Rectifiers Ltd.成立于1958年,自那时起,它便与Westinghouse、Brake & Signal(英国)等知名企业建立了深厚的合作关系。这家公司在电力半导体、电力电子设备和铁路运输设备的开发、设计、制造与销售方面,迅速积累了丰富的经验和技术实力。早期,Hind Rectifiers通过不断的技术引进与自主研发,逐步确立了其在印度电力电子行业中的领先地位。其产品线逐渐丰富,包括但不限于整流器、逆变器等关键电力电子元件,为印度乃至全球的工业发展提供了重要支持。

故事二:市场拓展与国际化战略

随着印度经济的快速增长和工业化进程的加速,Hind Rectifiers Ltd.积极实施市场拓展战略。公司不仅巩固了在国内市场的地位,还逐步将目光投向了国际市场。通过参加国际展会、建立海外销售网络等方式,Hind Rectifiers的产品远销至多个国家和地区。同时,公司还加强了与国际知名企业的合作,共同研发新技术、新产品,进一步提升了其国际竞争力。

故事三:技术创新与产品升级

技术创新是Hind Rectifiers Ltd.持续发展的核心动力。公司不断加大研发投入,引进先进生产设备和技术人才,致力于电力电子产品的更新换代和技术升级。近年来,Hind Rectifiers成功推出了多款高性能、高效率的电力电子产品,如高效能整流器、智能逆变器等,这些产品不仅满足了市场对高品质电力电子产品的需求,还为公司带来了显著的经济效益和社会效益。

故事四:应对市场波动与供应链管理

面对全球经济的波动和供应链的不确定性,Hind Rectifiers Ltd.展现了其强大的应对能力。公司通过建立多元化的供应链体系、加强与供应商的合作与沟通、优化库存管理等方式,有效降低了市场风险。同时,公司还注重提升内部管理水平,加强成本控制和质量管理,确保了在复杂多变的市场环境中保持稳健发展。

故事五:社会责任与可持续发展

作为一家具有社会责任感的企业,Hind Rectifiers Ltd.始终将可持续发展视为其发展的重要方向。公司积极参与社会公益事业,关注环境保护和能源节约。通过推广绿色制造、节能减排等措施,Hind Rectifiers为印度乃至全球的可持续发展贡献了自己的力量。同时,公司还注重员工培训和职业发展,为员工提供了良好的工作环境和发展平台,促进了企业与员工的共同成长。

Avel Lindberg公司的发展小趣事

由于我无法直接获取Avel Lindberg公司的详细发展资料,因此我无法直接为您撰写5个关于该公司发展起来的具体故事。不过,我可以为您提供一个通用的故事框架,您可以根据这个框架结合公司的公开信息来撰写相关故事。

Avel Lindberg公司发展故事框架

  1. 创业初期: 描述Avel Lindberg公司成立的背景,包括创始人或核心团队的愿景、行业趋势以及初始产品或服务。可以提及公司如何克服初创期的困难,如资金短缺、市场竞争激烈等问题,逐渐在市场上站稳脚跟。

  2. 技术突破: 讲述公司在某个关键时期实现的技术突破,这项突破可能是对既有技术的改进,也可能是全新技术的研发。这个突破如何帮助公司打开了新的市场领域,提升了竞争力,成为行业内的领军者。

  3. 合作与扩展: 描述公司如何通过与其他企业、研究机构或高校建立合作关系,来扩大业务范围或提升技术水平。这些合作可能涉及共同研发、市场拓展、品牌建设等方面,对公司的长期发展产生了积极影响。

  4. 国际化战略: 讲述公司如何逐步实施国际化战略,进入海外市场。这包括公司如何分析国际市场的需求和竞争态势,制定合适的市场进入策略,以及在国际市场上取得的成就和面临的挑战。

  5. 社会责任与可持续发展: 介绍公司在发展过程中如何关注社会责任和可持续发展。这可以包括公司在环保、员工福利、社区支持等方面的举措,以及这些举措如何提升了公司的社会形象和品牌价值。

在撰写具体故事时,您可以根据Avel Lindberg公司的实际情况调整上述框架中的内容,并结合公司的官方公告、新闻报道和行业分析报告等资料来丰富细节。同时,请确保所描述的事实准确无误,避免主观评价和猜测。

Exar公司的发展小趣事

随着云计算和大数据的兴起,数据中心市场迎来了爆发式增长。Exar公司敏锐地抓住了这一市场机遇,推出了一系列针对数据中心市场的产品。通过不断的技术创新和产品优化,Exar在数据中心市场上取得了显著的突破,赢得了众多客户的认可和信赖。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

银河微电自成立之初,便专注于半导体分立器件的研发与生产。面对国内外市场的激烈竞争,公司坚持自主创新,不断投入研发力量,终于在某关键技术上取得了重大突破。这一技术突破不仅提高了产品的性能,还降低了生产成本,使得银河微电的产品在市场上更具竞争力。凭借这一技术优势,银河微电逐渐在行业中树立起了自己的地位。

CITIZEN公司的发展小趣事

近年来,西铁城公司在市场推广方面也进行了一些大胆的尝试。其中,与著名花样滑冰选手羽生结弦的跨界合作尤为引人注目。双方共同推出了限量版签名腕表“四周半”,这一产品以羽生结弦的经典动作为灵感,融合了西铁城独特的光动能技术,展现了技术与艺术的完美结合。这一合作不仅提升了西铁城品牌的市场影响力,也展示了公司在产品创新和市场推广方面的新思路和新策略。

这些故事只是西铁城公司发展过程中的一部分,但它们都充分展示了公司在电子行业中的创新实力和市场竞争力。从最初的维修和销售到如今的全球知名品牌,西铁城的发展历程充满了挑战和机遇,也为我们提供了一个观察电子行业发展和变革的窗口。

BELLING LEE公司的发展小趣事

在电子行业的初期,BELLING LEE公司以其对新技术的敏锐洞察力和强大的研发能力脱颖而出。公司投入大量资源研发出了一款具有革命性的高效能电子芯片,这一创新产品不仅提高了电子设备的性能,还大大降低了能耗。凭借这一技术突破,BELLING LEE公司迅速在电子市场上获得了认可,并逐渐建立起自己的市场地位。

问答坊 | AI 解惑

电子琴

1.实验任务 (1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐。 2.电路原理图                            &nbs ...…

查看全部问答>

ARM编程-ADS软件

我编完程序,在ADS1.2中编译时,在2410init.s中有2个错误。error 1, unkonwn opcode: AREA Init,CODE,READONLY,程序接下来是ENTRY ,报错,error 2 ,A label was found which was in no AREA,请教大家,这是怎么回事?…

查看全部问答>

?ARM9200求合作 高薪聘请

   项目工程,寻找合作伙伴,大概情况是这样的:ATmel芯片的ARM9200板子已经做好了,可以正常的启动,程序也可以运行。 现在这个板子的USB口可以识别FAT和FAT32格式的硬盘,不能识别NTFS格式的硬盘。板子的上所有的应用程序是在linux2.6 ...…

查看全部问答>

100分求助:WINCE下如何设置触摸屏有效范围???

请问各位:     如何设置触摸屏的有效触摸范围,如原来320*240 现在想让触摸屏的有效触摸范围小一圈如:315*235 在有效范围之外不会触发中断 请问如何设置或者修改 谢谢各位!…

查看全部问答>

如何在Linux下与串口建立连接?

我按照文章《Linux 下串口编程入门》(IBM)试着在Linux下和GPRS Modem的串口建立连接,实现收发短信。 open( \"/dev/ttyS0\", O_RDWR | O_NOCTTY | O_NDELAY )过后,向串口设备写入命令用的是Linux的write(fd, \"AT\\r\", 3),从串口中读用的是 ...…

查看全部问答>

无接触式人体体温计

比赛使用过这个传感器,一直想做好,但是没做,呵呵…

查看全部问答>

【LaunchPad】 MSP430 LaunchPad新手引导贴

最近很多新同学都拿到了团购的开发板,但是很多同学和我一样第一次接触MSP430,拿到板子之后感觉无从下手,但是感谢论坛的各位大大,为我们提供了非常多的资料和教程,所以just follow~~~step1:下载并安装开发环境。MSP430的开发环境有IAR和CCS两 ...…

查看全部问答>

ALTERA Cyclone V 评估板 电路图 共36张

PDF文件: [ 本帖最后由 dontium 于 2012-12-6 14:42 编辑 ]…

查看全部问答>

【嵌入式】 wince 移植 必杀技

    结束了嵌入式生涯,现在改行了,以前的东西会慢慢被淡忘,真滴好担心,因此每天晚上都抽时间温习下,让自己每天都进步,我把自己的总结贴出来跟大家一起分享:   1.arm上wince的移植概要 需要的仅仅是bsp包,常常由厂家提 ...…

查看全部问答>

帮忙看看这烙铁头哪家淘宝店有卖

烙铁头用了很久,都钝了。帮忙看看这烙铁头哪家淘宝店有卖。 …

查看全部问答>