历史上的今天
返回首页

历史上的今天

今天是:2026年02月01日(星期日)

正在发生

2023年02月01日 | 基于ARM9与LINUX的RS485总线的通信接口设计

2023-02-01 来源:elecfans

  摘要:在ARM9处理器S3C2440上设计RS485通信接口,实现与总线上其他设备的通信,利用ARM9处理器内部集成的UART外设和RSM485CT模块组成RS485通信硬件接口,在嵌入式Linux系统下设计RS485通信程序实现与RS485总线上的其他外设间的数据互通。实验效果良好,表明该设计是行之有效的。文中在介绍了通信接口的硬件设计、Linux下RS485驱动设计、通信程序设计的同时,重点介绍了Linux系统下RS485通信程序的编写方法以及RS485总线上设备通信的实现过程。


  0引言

  随着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。

  基于ARM9与LINUX的RS485总线的通信接口设计

  图1S3C2440-485接口


  2软件设计

  2.1RS485通信设计

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

  基于ARM9与LINUX的RS485总线的通信接口设计

  图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实验结果及应用

  基于ARM9与LINUX的RS485总线的通信接口设计

  图3RS485接口应用

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


推荐阅读

史海拾趣

爱普特半导体(APTSEMI)公司的发展小趣事

凭借卓越的产品性能和稳定的市场表现,爱普特半导体的市场占有率持续提升。目前,公司在国内非ARM核MCU市场的出货量已经位居第一,市场占有率也遥遥领先。这一成绩的取得,不仅彰显了爱普特在MCU行业的领先地位,也反映了公司在技术创新和市场拓展方面的强大实力。随着公司研发能力的不断提升和市场布局的逐步完善,相信爱普特在未来的市场竞争中将继续保持领先地位。

这些故事只是爱普特半导体发展过程中的一部分,它们共同展现了公司在电子行业中的崛起和成长。作为一家坚持自主创新、构建高端人才队伍、与大型企业战略合作、践行纯国产化发展理念并持续提升市场占有率的企业,爱普特半导体在电子行业的发展道路上正稳步前行。

功得(CONQUER)公司的发展小趣事

功得公司最初成立时,只是一家专注于电子元器件代理的小公司。创始人李明看准了电子行业快速发展的趋势,决定投身于这一领域。他带领团队深入市场调研,发现了一种新型的集成电路芯片在市场上有着巨大的潜力。于是,功得公司投入大量资金研发这种芯片,并通过不断改进和优化,最终成功推出了具有竞争力的产品。凭借这一创新产品,功得公司在市场上获得了初步的成功,为后续发展奠定了基础。

杰力(EMC)公司的发展小趣事

为了保持市场竞争力,杰力不断投入研发资源,致力于技术创新和产品升级。公司成功研发出多款高性能、低功耗的功率组件和集成电路产品,并获得了多项专利。这些产品不仅满足了客户对高品质电子元件的需求,还推动了整个电子行业的发展。同时,杰力还密切关注市场动态和技术趋势,不断调整产品策略,以适应市场的变化。

广芯电子(BROADCHIP)公司的发展小趣事

为了确保产品质量和客户满意度,杰力建立了一套完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理。同时,杰力还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施使得杰力的产品在质量上得到了有效保障,并赢得了客户的信赖和好评。

大毅科技公司的发展小趣事

大毅科技一直注重技术创新和研发投入。公司拥有一支高素质的研发团队,不断推出具有市场竞争力的新产品。其中,高压电阻和可修整电阻等产品得到了客户的广泛认可。此外,大毅科技还积极投入于新型材料的研发,以提高产品的性能和降低成本。这些技术创新的成果不仅使大毅科技在市场中保持了领先地位,还为公司的持续发展奠定了坚实基础。

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

可遥控清零的四位遥控组件

四位无线发射接收组件以外围电路简单、遥控距离远等优点,被广泛的应用在各种电路中。但目前市场上所有的四位遥控组件都有一个共同的缺点,就是接收电路只要首次译码成功,总有一路输出高电平,无法遥控清零。这就使组件的使用受到限制,如:用来做 ...…

查看全部问答>

protel99se教程

求 protel99se教程和练习题…

查看全部问答>

PIC16F73的AD结果存储器只有一个?

只有ADRES? 877好像有ADRESL,ADRESH?…

查看全部问答>

聘深圳地区嵌入式WindowsCE 软件工程师

用WINDOWS CE开发PMP播放器,GPS,高薪聘请有嵌入式WindowsCE 开发经验的工程师. 工作地点:深圳宝安 待遇:6000-8000/月 联系方式:bm9887@126.com…

查看全部问答>

各位仁兄有没有ttytest.c的源程序阿?

各位仁兄有没有ttytest.c的源程序阿? 能不能发我一份 谢谢了 tiplinky2002@yahoo.com.cn…

查看全部问答>

没有开发板能用CCS进行仿真模拟吗?

没有开发板,CCS还能用吗?好象有什么toolset是不是也可以仿真?谢谢…

查看全部问答>

弱弱的问一下:请问C6713和C6713B有什么区别?

请问C6713和C6713B有什么区别?还有就是GDP,PYP等后缀是什么意思?…

查看全部问答>

EthernetPOWERLINK在机器控制领域的应用

EthernetPOWERLINK在机器控制领域的应用…

查看全部问答>

智能指针作为容器元素使用技巧

对C++语言本身来说,它并不在乎用户把什么类型的对象作为STL容器的元素,因为模板类型参数在理论上可以为任何类型,比如说STL容器仅支持值语义而不支持引用&语义,这并非因为模板类型参数不能为引用,而是因为如果容器元素为引用类型,就会出现“引 ...…

查看全部问答>

A8+KSZ9021网卡驱动问题

请教各位高人 我的网络驱动在ping时,如果拔掉网线,在一段时间后会出现 No buffer space available。的错误,如何修改驱动,使驱动在长时间无法收到数据时超时退出而不是出现上述错误?64 bytes from 192.168.232.26: icmp_seq=28 ttl=64 time=0 m ...…

查看全部问答>