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

出处:维库电子市场网 发布于:2018-09-14 14:43:17

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

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

  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。

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!