当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]RS485接口具有良好的抗噪声干扰性能、长传输距离和多站能力等特点,使其成为工业控制的首选串行接口。嵌入式系统中也广泛采用RS485接口作为设备控制的串行接口。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的控制。



表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(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({

if(up->port.ops->tx_empty(

return;//added for last transmit

serial_omap_stop_tx(

return;

}

……//此处代码省略

if(uart_circ_empty(xmit)){

if(up->port.ops->tx_empty(

return;//added for last transmit

serial_omap_stop_tx(

}

}

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

2024年4月18日,国民技术第四代可信计算芯片NS350 v32/v33系列产品正式发布并开始量产供货。NS350 v32/v33是一款高安全、高性能、超值可信密码模块2.0 (TCM 2.0)安全芯片,适用于PC、服...

关键字: PC 服务器平台 嵌入式系统

2024年,嵌入式系统将走向何方?如何才能走在趋势的前沿?从工厂到家电,从医院里昂贵的医疗设备,到随处可见的可穿戴设备,我们身边的联网设备越来越多,生活更加绿色低碳,嵌入式系统功不可没。ST于3月19日成功举办STM32...

关键字: 嵌入式系统 可穿戴设备

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备

Windows Embedded Compact 7(简称WinCE)是一种专为嵌入式系统设计的操作系统,具有体积小、效率高、可定制性强的特点。在WinCE中设置自动运行软件,通常是为了满足设备在启动后自动执行特定任务的...

关键字: 嵌入式系统 软件 操作系统

【2024年3月25日,德国慕尼黑和瑞典瓦尔贝格讯】不同汽车的独特性给汽车零部件供应商和OEM厂商等带来了挑战,因为每辆车的驾驶方式、驾驶地点、驾驶者、设计、用途以及道路和交通状况都是独一无二的。为保证每辆汽车都能正常运...

关键字: AI 机器学习 嵌入式系统

GD32F303作为一款先进的微控制器,在嵌入式系统领域有着广泛的应用。本文旨在深入探究GD32F303的发布时间,并分析其背后的技术背景和市场环境。通过对相关资料的梳理和分析,本文揭示了GD32F303发布的历史背景、...

关键字: GD32F303 微控制器 嵌入式系统

物联网控制模块作为连接物理世界与数字世界的桥梁,在现代科技领域扮演着至关重要的角色。本文将详细探讨物联网控制模块的定义、功能、应用领域以及未来发展趋势,旨在为读者提供全面而深入的了解,并展望其在未来物联网产业中的广阔前景...

关键字: 物联网 控制模块 嵌入式系统

以下内容中,小编将对嵌入式开发的相关内容进行着重介绍和阐述,希望本文能帮您增进对嵌入式开发的了解,和小编一起来看看吧。

关键字: 嵌入式 嵌入式开发 嵌入式系统

众多周知,TI Sitara系列在近10多年间推出了很多优秀的处理器,其中最具代表性的AM335x系列处理器,引领工业市场从MCU向MPU演进,帮助产业界从ARM9迅速迁移至高性能Cortex-A8处理器,成为一代经典!...

关键字: 处理器 工业4.0 嵌入式系统
关闭
关闭