c语言sscanf函数的用法是什么
256
2022-11-07
采用双端口RAM技术实现智能型高速并行通讯卡的接口设计
1 系统描述
通讯卡包含了数字滤波、数据收集、传输等功能,对系统内的并、串行通讯实现分时操作。卡上由一片MCU负责管理各个分机,通过串行通讯方式将分机采集的各种数据,收集到通讯卡内,经过判断、筛选,将有效数据存贮到双端口RAM的规定区域内;计算机从双端口RAM内将数据读入,进行运算处理,与标准数据进行比较判断,将结果或控制命令写入双端口RAM内,实现整个系统统一协调运行。本文主要针对通讯卡的软、硬件设计和在VB环境下的软件实现,作重点的分析。
2 硬件设计
通讯卡的基本硬件设计简图如图1所示。利用计算机总线做扩展卡的技术已经广为应用,但很多都是利用计算机提供固定的I/O端口地址进行读写操作,“瓶颈效应”十分明显。在对实时性要求很高、数据传输量很大的场合,数据阻塞明显,无法满足系统的大量数据高速传输的需要。本系统利用计算机内存直接映象技术,对内存物理地址直接操作,实时性和速度明显改善,完全满足本系统的速度要求。
2.1 MCU和双端口RAM的选择
2.2 双端口RAM的地址范围的选择
计算机内部高端地址中有一段保留给I/O适配卡的128KB地址空间,段地址空间为0C0000H~0DFFFFH。利用这128KB中的一段2KB空间即可满足IDT7132的使用,按PC总线的协议经过地址译码和其它控制总线选能,实现内存直接映象方式。地址范围为0D0000H~0D07FFH之间。另一侧,MCU与IDT7132的接法只将IDT7132其中一侧总线接入MCU的总线上,其接法同普通RAM没有区别,设置地址范围在 8000H~87FFH之间。
2.3 对双端口RAM访问的特殊情况处理
IDT7132 两侧的BUSY线分别接到MCU的INT0中断上和PC总线的A10脚(IO-CH-RDY)上,作为MCU和计算机同时读写IDT7132的同一个地址单元时的“忙闲”状态线。当两侧访问不同的地址单元时,BUSY线无效,两侧操作互不影响。当两侧“几乎同时”访问同一个单元时,按IDT7132的总线仲裁逻辑,对两侧的片选信号和地址信号之一到达时间间隔只要大于5ns,就能对先到达的一侧提供读写通道,保证数据读写的真实性。同时将另一侧的BUSY 线置低,为MCU或计算机提供中断或等待信号。众所周知,89C51不具备插入等待周期延时操作的能力。当MCU一侧先行操作时,计算机一侧的BUSY线有效,PC总线上的IO-CH-RDY状态线被拉低,命令计算机CPU插入等待周期,延时等待MCU一侧完成读写操作后,再进行读写操作。当计算机一侧占据IDT7132的一个地址单元时,MCU一侧再操作该单元,MCU读写的数据无效。我们采用了判断标志位的方式解决此问题。当对应的BUSY线变低 INT0中断有效时,MCU完成该条读写指令后立即进入中断,置标志位,中断返回后,即执行查询标志位的指令同,判断此次操作是否有效。未成功,重复操作,直至读写成功。
3 软件设计
Visual Basic 6.0不具备对计算机底层地址操作的功能,不如Visual C++ 6.0、Delphi等。特别在本系统中采用的高速并行通信方式,对内存物理地址读写操作的频率很高,按常规应改用其它语言。但系统其它方面的工作,不是其它语言所能替代的,所以必须将VB语言环境下不能对底层地址读写操作的问题加以解决。经过实验,通过如下方法实现。
笔者采用的方法是调用动态链接库DLL。用VisualC++ 6.0编写对内存物理地址进行读写操作的DLL动态链接库函数,进行数据采集和发送;用Visual Basic 6.0调用DLL实现数据通信,从而弥补VB对底层数据操作的缺陷,使VB环境下开发数据通信系统软件更为方便。
(1)首先使用Visual C++ 6.0创建一个MFC Appwizard dll项目,这样就可以在DLL中编写程序。因为我们要对直接映象在高端内在范围内的地址进行操作,所以在编写程序时,要使用如下方法:
-asm{ mov A B
mov ……
…………
mov i A}
return i;
-asm{}是嵌入式汇编函数,在Visual C++6.0中只有使用此方法才可以访问高端内存地睛。还要在DLL中编写两个函数。一个从内存地址读数函数,一个对内存地址写数函数。这样才能完成对高端内存地址读写的操作,实现底层的数据传输。
(2)使用Visual Basic 6.0调用DLL动态链接库函数。
(ByVal localport%,ByVal value%)
(ByVal localport%)
其中:write( )函数是向高端内存地址写数据;
read( )函数是从高端内存地址读数据。
第二步:在窗体中放入三个文本框(Text 1,Text2,Text3),一个命令按扭(Command 1),就可以在代码窗口中编写代码:
Option Explicit
Dim Port 1 ‘内存地址 如:0D0000H
Dim Port 2 ‘16进制数 如:12H
Private Sub Command 1-click()
Port 1=Val(Text 1.Text) ‘把Text 1赋给port 1
Port 2=Val(Text 2.Text) ‘把Text 2赋给port 2
Gg=“write”(port 1,port2) ‘往Port 1地址中写Port 2
Salp=“read”(port 1) ‘从Port 1地址中读数
Text3.Text=Salp ‘在Text3中显示
Salp
End Sub
两个函数的调用过程如上所述,可根据编程的意图放在任何位置。特别注意,函数地址不能与其它硬件的地址或系统内存地址冲突,否则会造成计算机死机。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~