基于ARM9嵌入式的RS485总线接口设计,自动控制IO口实现通信方向控制

MCU开发加油站 2018-01-01 08:20 次阅读

随着ARM处理器应用的范围的不断深入,根据需求的不同ARM提供的外设也越来越丰富,常用的通信接口有RS232、RS485、CAN、以太网等。RS485总线凭其传输距离远、抗干扰能力强、价格低廉等优点在各种工业场合得到广泛的应用。设计使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建具有电源隔离、电气隔离、总线保护的RS485总线接口,通过对嵌入式Linux系统RS232驱动程序的修改,使的在通过该修改后的串口驱动程序发送数据时,自动控制IO来实现RS485通信的方向控制,从而简化了RS485通信的控制流程,Linux下RS485通信程序通过对该串口的读写,实现与RS485总线上的其他设备通信。

1.通信接口的硬件设计

S3C2440处理器片内集成了丰富的外设资源,可以方便的实现嵌入式应用中的各种接口通信。设计中用到了Samsung-ARM9-S3C2440,其片内集成的3个UART,在设计中UART0用于嵌入式Linux操作系统的控制台(console)接口,UART1作为RS232接口与其他RS232接口设备通信,UART3用作RS485的数据通信接口。由于ARM9处理器的IO电平与RS485的电气标准不同,RS485采用差分信号负逻辑,+2~+6V表示“0”,-6~-2V表示“1”。为了达到RS485总线的电气特性标准,所以必须要外接电平转换芯片[1,3-5],同时考虑工业应用环境恶劣等因素,需要考虑RS485总线的电源隔离、电气隔离、总线保护等因素,设计中用到广州周立功的RSM485模块。

RSM485隔离收发器模块,是集成电源隔离、电气隔离、RS485接口芯片,总线保护器件于一身。该模块采用灌封工艺,具有很好的隔离特性,隔离电压高达2500VDC,最多支持400个节点,最高通信波特率115200。

图1为系统中利用S3C2440中的UART2实现半双工的RS485总线的原理图,在同一时刻里数据只能往一个方向传输。其中的引脚CON为接收、发送控制脚,现在将其与S3C2440的IO引脚相连,由该引脚的电平控制芯片数据的方向。要发送数据时将其置0,接收数据时将其置1。

图1S3C2440-485接口

2.软件设计

2.1RS485通信设计

图2中首先打开驱动部分针对RS485通信修改过的串口2,设置其串口参数,此时串口2处于RS485总线接收模式,然后向总线上第一个设备节点发送数据读取指令,完成select函数调用图1S3C2440-485接口初始化后,select函数根据用户设定的超时时间,等待设备返回数据,若select函数返回异常,则重新进行初始化,若在设定时间内,未接受到从设备的数据,select函数返回超时,则重设下一从设备节点等待超时时间,并发送下一设备数据读取指令,重新进入select等待设备返回数据;若在设定时间内,接到从设备返回数据,则从串口接收缓冲读取数据,并完成用户协议数据解析,完成一次主从设备的数据通信,然后轮询到下一设备。

图2RS485通信软件流程

2.2RS485驱动设计

设计中使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建而成,其驱动程序与RS232驱动程序相比多了一个通信方向控制引脚的控制,所以在Linux操作系统中,完全可以借助内核的串口驱动添加方向控制IO相关代码即可实现[4,6,7]。在linux2.6.32内核源码中,串口驱动相关代码在文件linux-2.6.32.2/drivers/seria/samsung.c中,为了实现RS485的通信,修改部分主要包括3个部分:

(1)在串口驱动的初始化代码中加入RS485通信方向控制IO口设备的初始化工作,关键代码片段为:

if(port-》line==2){//如果初始化的是串口2

s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP);//将GPG2,设为输出功能

s3c2410_gpio_setpin(S3C2410_GPH0,0);//设为高电平,使串口启动时处于接收数据状态。

RS485方向控制IO口初始化使用到了2个内核函数(在arch/arm/plat-s3c24xx/gpio.c),其函数原型为:

voids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunc-TIon)

此函数的功能是设置引脚的功能,参数pin是要设置的引脚,对应着是GPH0也即是S3C2410_GPH0引脚,参数funcTIon是要设置引脚的功能,设置中用到的是输出功能,所以该值是S3C2410_GPH0_OUTP.

voids3c2410_gpio_setpin(unsignedintpin,unsignedintx)

此函数的功能是设置引脚的输出值,参数pin是要设置的引脚,参数x是要设置引脚的输出值0或者1.

(2)在串口数据开始发送前,将方向控制IO置0,使的RSM485处于发送状态,关键代码片段如下:

if(port-》line==2){s3c2410_gpio_setpin(S3C2410_GPH0,1);//设为低电平,使串口启动时处于接收数据状态。

udelay(30);//等待方向IO控制脚状态稳定}

在设置方向控制IO口状态后,加入一定延时,等待方向IO控制脚状态稳定,避免出现由于方向控制状态不稳定导致发送数据出错。

(3)在串口数据发送完成后,自动进入到数据接收模式,关键代码片段为:

if(port-》line==2){

while(!(rd_regl(port,S3C2410_UTRSTAT)&0x04));//等待串口发送完成,这句千万不能少

s3c2410_gpio_setpin(S3C2410_GPH0,0);}

由于S3C2440处理器自带串口带有硬件缓冲区,串口驱动中,数据发送完成是指数据已有驱动程序全部写入到发送缓冲中,但此时串口数据并为正在发送出去,所以必须等待数据完全发送完成后,再将方向控制IO口置1。

2.3Linux下RS485通信编程

RS485驱动程序修改完成后,可以像操作串口一样操作RS485接口。在嵌入式Linux系统下,串口的设备文件位于/dev目录下,可以使用文件打开、读写函数[2,8,9]直接操作RS485设备。设备打开和读写部分关键代码片段为:

intfd=open(Dev,O_RDWR|O_NOCTTY);//打开设备……

nread=read(fd,s1_buf,64);//读取设备数据……

write(fd,send_buff,6);//写入发送数据

在设计中,ARM9作为RS485通信的主控设备与个从设备进行通信,主控设备从每个从设备读取数据时,主设备先向该设备发送数据读取命令,然后设备等待从设备返回数据。所以在实际应用中,因合理设置等待从设备返回数据的等待时间。在设计中使用select函数来实现等待延时,关键代码为:

switch(select(max_fd,&fds,NULL,NULL,&TImeout))//select使用

{case-1:break;//select错误,退出程序

case0:Find_endp(&pth_endp_line1);

send_buff[1]=pth_endp_line1.index+1;

send_buff[4]=send_buff[1]+1;

write(fd1,send_buff,6);

TImeout.tv_sec=time1;

timeout.tv_usec=time2;break;//超时,再次轮询

default:if(FD_ISSET(fd1,&fds))//串口1数据

{nread=read(fd1,s1_buf,64);

if(nread》=20)

{i2c_led_set(8,1);

Value_t=myrount(Value_t,100);

Value_h=myrount(Value_h,100);

Value_p=myrount(Value_p,100);

Value_pt=myrount(Value_pt,100);

}}}//endswitch

3实验结果及应用

图3RS485接口应用

设计成功应用到环境参数采集系统中,系统中主要有采集节点、采集终端、数据服务器组成,如图3所示。采集节点负责完成气压、温度、湿度参数的采集;采集终端通过RS485总线从分个采集节点读取采集数据,并通过以太网将采集数据上报到数据服务器;数据服务器完成数据的存储,并为其他形式的应用提供应用接口。在设计中主设备循环轮询RS485总线上所有设备,每间隔1s主控设备ARM发送1次数据读取指令,读取指令中包含了从设备识别码,符合识别码的从设备立即返回采集数据。如果数据出错主设备将丢弃该数据包,等待下一次轮询,所以在通信程序设计时未考虑数据包错误重发机制。设计达到预期目标。尽管偶尔有误码出现,但设计中避免了涉及linux内核复杂代码的的修改,仍不失为有实用价值的设计方法。

MCU开发加油站 技术专区

原文标题:基于ARM9与LINUX的RS485总线的通信接口设计

文章出处:【微信号:mcugeek,微信公众号:MCU开发加油站】欢迎添加关注!文章转载请注明出处。

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

如何成为嵌入式高手的学习路线解析

了解linux系统;区分各种版本的Linux系统,以便于拓展 Linux视野。 1、Linux....

的头像 EDN电子技术设计 发表于 01-19 11:01 次阅读 0条评论
如何成为嵌入式高手的学习路线解析

广州市政府信息化云服务平台招标:红旗Linux成功入围

在最新一期的《广州市政府信息化云服务平台》招标采购中,服务器操作系统均本土企业的身影,红旗Linux....

发表于 01-19 09:05 次阅读 0条评论
广州市政府信息化云服务平台招标:红旗Linux成功入围

详细剖析交流充电桩上电源和RS485隔离原理

较直流桩而言, 交流 桩少了大功率的 电源模块 ,充电的功率也小很多,电磁环境相对友好,但仍不可轻视....

的头像 电子设计 发表于 01-18 07:28 次阅读 0条评论
详细剖析交流充电桩上电源和RS485隔离原理

对于嵌入式为什么要有uboot的深度解析

(1)uboot主要作用是用来启动操作系统内核。 (2)uboot还要负责部署整个计算机系统。....

的头像 EDN电子技术设计 发表于 01-17 17:15 次阅读 0条评论
对于嵌入式为什么要有uboot的深度解析

传感器厂商正在迎来发展的黄金时间,华捷艾米要做嵌入式的3D感知芯片

机器视觉市场腥风血雨,华捷艾米要做嵌入式的3D感知芯片。

的头像 机器人大讲堂 发表于 01-17 15:20 次阅读 0条评论
传感器厂商正在迎来发展的黄金时间,华捷艾米要做嵌入式的3D感知芯片

安装 Pick以及其用法解析

今天,我们要讲的是一款有趣的命令行工具,名叫 Pick。它允许用户通过 ncurses(3X) 界面....

的头像 嵌入式资讯精选 发表于 01-17 14:15 次阅读 0条评论
安装 Pick以及其用法解析

详细剖析嵌入式和单片机的区别

以上就是一块基本的嵌入式核心板所具有的性能参数,和上面说到的单片机的性能参数相比较,单片机的处理能力....

的头像 玩转单片机 发表于 01-16 14:01 次阅读 0条评论
详细剖析嵌入式和单片机的区别

大联大世平集团联合北京飞图科技推出基于展讯SC7701的共享单车解决方案

2018年1月16日,致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下世平联合....

的头像 人间烟火123 发表于 01-16 11:57 次阅读 0条评论
大联大世平集团联合北京飞图科技推出基于展讯SC7701的共享单车解决方案

解析对Linux系统管理员有用的并且最常用的20个命令行系统监视工具

对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作。我....

的头像 马哥Linux运维 发表于 01-16 09:03 次阅读 0条评论
解析对Linux系统管理员有用的并且最常用的20个命令行系统监视工具

讨论 fmt 的基本用法以及它提供的一些主要功能

好在,有一个命令可以满足至少一部分的文本格式化的需求。这个工具就是 fmt。本教程将会讨论 fmt ....

的头像 Linux爱好者 发表于 01-16 09:00 次阅读 0条评论
讨论 fmt 的基本用法以及它提供的一些主要功能

以CAN与RS485为例总结各自优势 解疑“为什么CAN能取代RS485”

近年来CAN总线逐渐被工程师认知,并以其突出特点,逐渐在取代RS485等总线,本文将以CAN与RS4....

的头像 ZLG致远电子 发表于 01-15 14:58 次阅读 0条评论
以CAN与RS485为例总结各自优势 解疑“为什么CAN能取代RS485”

基于Linux 软中断机制以及tasklet、工作队列机制分析

软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这....

的头像 马哥Linux运维 发表于 01-15 12:55 次阅读 0条评论
基于Linux 软中断机制以及tasklet、工作队列机制分析

基于具有Arduino Leonardo的树莓派扩展板的介绍

树莓派是完整的计算机具有很强的处理能力,虽然也有IO口可以扩展外部的应用,但是还有有些不足,不能很方....

的头像 21ic电子网 发表于 01-15 11:15 次阅读 0条评论
基于具有Arduino Leonardo的树莓派扩展板的介绍

基于Linux的内存管理方式解析

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行....

的头像 马哥Linux运维 发表于 01-15 10:19 次阅读 0条评论
基于Linux的内存管理方式解析

Cortex-A8和ARM9有何不同?-Cortex-A8和ARM9的区别

arm系列从arm11开始,以后的就命名为cortex,并且性能上大幅度提升。Cortex-A8和A....

发表于 01-14 09:56 次阅读 0条评论
Cortex-A8和ARM9有何不同?-Cortex-A8和ARM9的区别

利用6 个 Linux 运维典型问题来分析处理问题的思路

结合上面介绍的 Linux 运维问题的解决思路后,下面我们挑选了6个比较典型的 Linux 运维问题....

的头像 Linux爱好者 发表于 01-13 10:37 次阅读 0条评论
利用6 个 Linux 运维典型问题来分析处理问题的思路

解析Linux如何判断自己的服务器是否被入侵的检测方法

如何判断自己的服务器是否被入侵了呢?仅仅靠两只手是不够的,但两只手也能起到一些作用,我们先来看看UN....

的头像 马哥Linux运维 发表于 01-13 10:27 次阅读 0条评论
解析Linux如何判断自己的服务器是否被入侵的检测方法

MCU+MPU双处理器架构的电力馈线终端设计方案

目前市面上大多电力FTU产品均采用MCU+MPU双处理器架构,以利用MCU的实时性和MPU上运行的稳....

的头像 ZLG致远电子 发表于 01-12 09:24 次阅读 0条评论
MCU+MPU双处理器架构的电力馈线终端设计方案

AllWinner+MiniGUI推进物联网产品化的发展浪潮

全志科技与飞漫公司达成合作,在智能硬件领域共同推动Tina Linux+MiniGUI系统的平台生态....

的头像 全志科技 发表于 01-11 11:02 次阅读 0条评论
AllWinner+MiniGUI推进物联网产品化的发展浪潮