随着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内核复杂代码的的修改,仍不失为有实用价值的设计方法。
亮点直击 | 东芝NEAS CHINA 2023芯见闻
浅谈人工智能技术与物联网结合带来的好处
物联网职业你看中哪一个
超声波清洗机价格多少钱一台?
VR--拓展虚拟视界,畅游梦幻与现实的未来
基于ARM9嵌入式的RS485总线接口设计,自动控制IO口实现通信方向控制
人工智能属于什么专业_人工智能专业就业前景如何_人工智能专业就业方向
环球企业联合发布HDWDR视频监控芯片组
数码相机的存储介质有哪些
复旦微电子携手睿感(ScioSense)合作推出FM33LE0系列MCU + TDC-GP30的超声波计量方案
比特大陆区块链芯片占全球份额八成左右
擦地吸尘器成爆款?多款家用吸尘器黑科技大比拼
海康威视为什么能帮助各行各业实现数字化转型?
SAP将传统CRM解决方案进行扩展,成为智慧型的客户体验套件
Mitcalc:产品/ 材料的热性能
在使用模块电源的时候,应该如何提高模块电源的稳定性和可靠性呢?
内网环境下的渗透测试
CHA6550-98F Ku/K波段功率放大器UMS
美图手机T9浆果红色版高清图赏
如何实现PCB高效自动布线