基于ModBus协议及嵌入式的MultiBus—CPU模块

基于ModBus协议及嵌入式的MultiBus—CPU模块,第1张


    MulTIBus—CPU模块是基于AT91RM9200微控制器的智能化多总线测控模块。该CPU模块主要实现对下位机的控制,并建立基于Modbus—RTU总线协议的总线通信体系结构,让系统设备可以无缝接入基于Modbus—RTU模式的总线系统,可靠、实时、准确地实现工业现场数据采集、信号输出等功能;同时,提供标准视频接口用于显示16位色图像,提供标准音频输入输出接口用于实现录放音功能。该模块作为嵌入式开发环境的核心,可实现人机界面的交互 *** 作和显示、海量数据的存储、多串口、多USB口、音频信号输入输出、以太网口等接口;运行Linux *** 作系统,可以快速搭建面向应用的嵌入式应用系统。

1 MulTIBus—CPU模块软件设计方案
    为了满足实际应用对实时性的要求,MulTIBus—CPU模块软件采用了Linux2.6.21 *** 作系统。其中,Linux2.6的内核任务可以被抢占,这一特性使得Linux2.6内核适用于实时系统和嵌入式系统中。驱动程序在Linux环境下进行开发,应用层采用标准的通信协议——Modbus协议,控制设备可以连成工业网络进行集中监控。通过一致的Modbus接口,MulTIBus—CPU模块与扩展下位机均可作为对等设备在工业网络中进行对话,使得各个设备无缝接入到工业控制网络中。MultiBus—CPU模块支持现阶段工业测控系统中最常用的以太网(UDP)通信及RS485通信协议。因此,本模块在与其他功能模块进行通信时,采用Modbus—RTU数据通信方式,利用以太网(UDP)/RS485总线进行数据的发送与接收,实现对各功能模块的集中监控。软件总体结构如图l所示。

基于ModBus协议及嵌入式的MultiBus—CPU模块,第2张

2 MulitiBus—CPU模块硬件设计方案
    硬件设计原理图如图2所示。MultiBus—CPU模块选用Atmel公司的AT91RM9200为主处理器,融合了ARM920T ARM Thumb处理器。其工作于180 MHz时性能高达200 MIPS;具备存储器管理单元,可以运行Linux等实时 *** 作系统;具备10/100 Base—T型以太网卡接口,只需外扩一个PHY即可实现以太网通信;具备USB 2.O全速(12 Mb/s)主机双端口,可以扩展键盘、鼠标、U盘等标准外设。

基于ModBus协议及嵌入式的MultiBus—CPU模块,第3张


    主处理器AT91RM9200具备5个串口:1个DEBUG串口,设计为RS232接口,可以直接连接PC的串口进行调试;1个RS485接口,可以与其他功能模块的RS485接口组成网络;其余3个串口均设计为RS232接口。
    通过CPU模块的外部总线和Epson公司的S1D13506显示芯片扩展了一个VGA接口,分辨率为640×480,256色。IS41LVl6100为其提供独立显存,容量为1M×16位,支持EDO PAGE模式。
    GL850A芯片是一个低功耗的USB 2.0 HUB控制器,AT91RM9200本身的USB HOST接口通过GL850A芯片扩展为4个USB HOST接口。
DS3231是精度非常高的I2C集成实时时钟。其精度在0~40℃内高达±2 ppm,在-40~85℃内精度可达±3.5ppm;板载电池,掉电后可以保持时间;可为系统提供秒、分、小时、日、日期、月、年等信息,具有自动闰年调整功能。
    WM8731是一个低功耗网络音频编解码器(CO-DEC),具有输出功率放大器和可编程采样速率设定功能。WM8731芯片通过I2S接口与CPU连接,为CPU模块扩展了音频信号的输入输出接口,使系统具备音频采样功能,音频信号数字化后可以通过以太网传送。
    DM9161为10/100M快速以太网物理层单芯片收发器,H1102为网络隔离变压器,用于实现10/100M自适应的可靠网络传输功能。
    MultiBus—CPU模块通过增加显示控制芯片及其驱动实现了显示接口,系统运行信息可以直接通过VGA显示器显示出来,大大提高了人机交互的可 *** 作性。

3 显示模块硬件设计方案
3.1 接口芯片选择
    接口芯片选用Epson公司生产的大规模显示控制器S1D13506。它是以SEDl354控制器为基础发展起来的具有更多功能的LCD显示控制器,支持全类型、大规模的LCD及CRT/TV显示器。S1D13506内置RAMDAC(Random Access Memory Digital-to-Analog Converter,随机数模转换记忆体)硬件X-Y轴转置二维加速,共有114个寄存器,可以灵活地设置各种不同的显示方式。
3.2 接口硬件设计
    S1D13506与处理器的接口采用通用类型总线(包括数据总线、地址总线、控制总线)。接口定义如表1所列。芯片所用像素时钟CLKl、CLK2是由同步信号发生器ICSl523来提供的,外接1M×16位的EDO-DRAM IS41LVl6100。

基于ModBus协议及嵌入式的MultiBus—CPU模块,第4张基于ModBus协议及嵌入式的MultiBus—CPU模块,第5张


    图3是显示电路总体连接图。S1D13506连接到AT9IRM9200的信号有:
基于ModBus协议及嵌入式的MultiBus—CPU模块,第6张、ABl~AB20、DBl~DBl5、基于ModBus协议及嵌入式的MultiBus—CPU模块,第7张。连接到ICSl523的信号有:CLCKI、CLCKl2(用于内部显示及外部媒体接口时钟)。连接到IS41LVl6100的信号有:DRAM-WE、DRAM-RAS、LCAS、UCAS、MA0~MA9、MD0~MDl5。其中,MDl、MD2、MD4、MD6、MDl5需要外接上拉电阻用于S1D13506初始配置。其他控制信号连接到LCD/CRT显示器。S1D13506芯片有个测试使能引脚TESTEN在芯片正常工作时接地。如果不使用RAMDAC的数模转换功能,那么IREF引脚必须接地。ICSl523通过I2C串行总线(TWD、TWCK)接受AT91RM9200对它的寄存器配置。本设计中,ICSl523的输入时钟是50 MHz,输出CLKl为25 MHz,CLK2为12.5 MHz.

4 显示模块软件设计方案
4.1 Linux下LOD驱动程序开发
    在Linux内核中,设备驱动程序是一个个独立的“黑盒子”,可以使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节,用户 *** 作只需要通过一组标准化的调用即可完成。把这些调用映射到设备特定的 *** 作上,则是设备驱动程序的任务。而每一个设备都可以看作是一个文件,所以打开的设备在内核中都可以由一个File结构标识,内核使用File_operations结构访问驱动程序的函数。每个文件(设备)都与它自己的函数集相关联。这些 *** 作函数主要负责上面所提到的系统调用的实现,并因此被命名为open、read、for-k,ioctl等。
    LCD控制器的功能是显示驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,就可以配置和显示驱动。配置LCD控制器时,最重要的一步是帧缓冲区(FrameBuffer)的指定。帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。用户程序只需与帧缓冲驱动程序抽象出来的接口打交道,就可以把要显示的内容从缓冲区中读出,从而显示到屏幕上。
    在FrameBuffer驱动程序中,最核心的结构体是帧缓冲区驱动程序接口,即struct fb_info。它记录了当前FrameBtlffer硬件设备的状态,通常在Linux的inctLtde/Linux/fb.h中定义。最主要的结构体有:Struct fb_fiX_screeninfo,定义显示输出设备自身的属性,如屏幕缓冲区的物理地址和长度;Struct fb_var_screeninfo,记录帧缓冲设备和指定显示模式的可修改信息,包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。
    若要先设定帧缓冲区的物理地址和长度,就要在SlDl3506.h里指定,然后在驱动程序里通过对fb_fiX_screeninf0赋值来实现:
    基于ModBus协议及嵌入式的MultiBus—CPU模块,第8张基于ModBus协议及嵌入式的MultiBus—CPU模块,第9张基于ModBus协议及嵌入式的MultiBus—CPU模块,第10张
    
    首先对LCD的背光灯进行点亮。LCD显示是一种被动的显示模式,不能发光,只能依靠控制透射或反射周围环境的光来达到显示的目的。因此,必须通过写寄存器用高电平指示对LCD加3.2 V电压来实现背光灯的点亮。其函数的部分代码如下:
    基于ModBus协议及嵌入式的MultiBus—CPU模块,第11张
    数组里每个元素的第1个值代表寄存器的名称,第2个值代表要设定的数值(1个十六进制的数)。32h寄存器用于设定LCD显示的水平像素数目,计算方法是把第2个值转换成十进制,加1再乘以8就得出水平像素。例如,0x63换算成十进制为99,加1乘以8就是800。38h和39h寄存器分别设置成0x57和0x02,就可以显示600的垂直分辨率。计算方法是以39h寄存器的bitO和bitl位为高位,38h寄存器的bitO~bit7为低位,组成的一个十六进制的数,再转换成十进制。除了要修改这3个寄存器外,34h和3Ah这两个寄存器也会对显示的分辨率有影响。
    帧缓冲设备也属于字符设备,要通过“文件层-驱动层”的接口方式来对LCD进行驱动,就必须对File operationes数据结构的参数fb_ops进行填充,并实现其对应的成员函数。本系统在include/Linux/fb.h中定义了帧缓冲区的文件 *** 作,部分代码如下:
    基于ModBus协议及嵌入式的MultiBus—CPU模块,第12张
    这个结构中的每一个字段都必须指向驱动程序中实现特定 *** 作的函数。对于不支持的 *** 作,对应的字段可以被置为NULL,或留到后续开发时再添加。本模块中实现特定 *** 作的成员函数的代码如下:


基于ModBus协议及嵌入式的MultiBus—CPU模块,第13张
    
    接下来把一些调用的函数写完整,编写好程序后用arm-linux-gcc编译驱动模块;然后对其动态加载,或静态将其编译到Linux内核;加载完程序后,就可以编写应用程序进行读/写等 *** 作了。
4.2 MinilGUI的移植
    在嵌入式开发环境中,独立的显示 *** 作人机界面是非常必要的。它可以使嵌入式系统对PC系统的依赖性降到最低,可以直接 *** 作嵌入式系统并显示运行结果。MultiBus-CPU模块采用标准的USB键盘、USB鼠标、VGA显示器作为人机交互界面,使用习惯类同于PC机,简易了开发者的开发过程,并且用户的使用过程也变得简单、快捷、易于 *** 作。
    MiniGUI是遵循GPL条款发布的自由软件,其目标是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。与QT/Em-bedded、MicoroWindows等其他GUI相比,MiniGUI的最显著特点就是轻型、占用资源少。据称MiniGUI能够在CPU主频为30 MHz、仅有4 MB RAM的系统上正常运行,这是其他多种GUI所无法达到的。
    MiniGUI在AT91RlM9200上的移植包括4个步骤:
    ①构建Linux交叉编译环境。通常使用的交叉编译工具是arm-Linux-gcc2.95.3版本。下载此交叉编译工具后在Linux内安装好,并且在PATH中添加/usr/loeal/arm-Linux/bin路径,交叉编译环境就构建好了。
    ②交叉编译MiniGUI,这是最关键的一步。首先从网上下载MiniGUI源程序包(包括库文件和资源文件),以及其他支持图形界面的源程序包;然后用上一步安装好的交叉编译工具对其进行编译,编译时可指定编译后库文件及资源文件的安装位置。
    ③拷贝MiniGUI资源到开发板。将第2步编译好的库文件及资源文件拷贝到开发板上。拷贝之前先用arm-Linux-strip命令清除文件中的调试信息,这样就使文件体积大大缩小,可以满足嵌入式系统的需要。
    ④板载Linux的MiniGUI环境配置。将第2步安装好的MiniGUI配置文件MiniGUI.cfg下载到板子中,并将其中fbcon的defaultmode设置为合适的显示模式。

结语
    本文基于嵌入式技术设计了一种MultiBus—CPU模块,能够满足各种嵌入式开发环境的设计要求。该模块软硬件均采用模块化设计,采用国外广泛应用的ModBus通信协议,可满足工业现场的测控需要。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2712649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存