外围设备或器件软件仿真的方法及建议
扫描二维码
随时随地手机看文章
有一点必须先肯定,软件仿真不能替代硬件仿真。软件仿真只是对硬件的仿真模拟,但是软件仿真仍有必要。目标系统是千变万化的,需要开发者去实现。实现可能需要相当长一段时间,甚至完成后不能随意调试,因此有必要对目标系统进行模拟或仿真,以便开发、检测嵌入式软件。
外围设备软件仿真可以快速建立开发目标的模拟系统。由于各仿真部件是软件,因此只要部件存在,就没有采购、制作电路板的过程。将各部件按规则布置、用软件连接,就构成了目标模拟系统。
外围设备软件仿真可以使嵌入式的软件设计与硬件设计相对独立。软件设计者可以先在模拟软件上进行功能和逻辑测试,从而减少了对硬件的依赖。
外围设备仿真软件在一定条件下可以制作为检测硬件功能的工具。如果仿真部件的连接口可以转化为硬件接口,那么就可以在硬件上用软件仿真部件代替被仿真部件运行。
外围设备软件仿真可以降低开发成本。过去有时为了配合软件开发,需要在硬件开发初期制作一些测试硬件。而现在,硬件开发可以按自己的需要按部就班地进行,只要在必要时与软件设计者沟通就可以了。
外围设备软件仿真可以方便单片机程序的调试,在程序涉及外围设备时不必做任何处理直接运行,仿真软件会自动处理对它的访问。
2 单片机外围设备或器件的相似性
经过几个项目的开发,会发现各项目所采用的外围设备或者器件大多相同。只是在功能不同时,才使用不同的外围设备或器件。对于不同的器件或设备,可以发现部件与单片机接口常使用如下几种:I2C、SPI、并口8(16)位、UART。
因此,对外围设备或器件的仿真部件,在今后的各项目中被采用的可能性很大,制作仿真部件的功夫不会白费。如果将部件特有的接口与部件功能部分分开,两部分再用通用的接口连接(例如将I2C接口单独仿真,然后单独仿真器件的功能部分,再将这两部分用通用接口连接),那么经过这样的设计,由于I2C接口的通用性,I2C接口的仿真使用率会很高,同时各部件由于接口全都一样也便于各部件集成。
3 外围设备或器件仿真方法及建议
建议单片机软件调试器预留软件接口。这样其他程序就可以监视单片机的I/O引脚或寄存器,从而使仿真外围设备有了可能。
将I2C、SPI、并口8(16)位、UART接口封装以Socket形式输出。由于各种单片机的调试器接口不大可能一样,所以单独封装部件接口对应付不同的单片机调试器有好处。以Socket形式输出,可使各部件功能仿真部分高度独立,仿真部件甚至可与其接口和调试器不在同一个计算机内。
仿真部件的全部接口改为Socket形式。由于关于Socket编程的例程很多,所以不用担心其中的复杂性。经过这样设计后,仿真部件间、仿真部件和调试器间存在复杂的Socket多点连接问题。为了减少复杂的连接须做些修改,可将仿真部件与调试器连接的Socket程序单独制作程序模块,各部件功能仿真部分制作成控件,在需要时放入仿真程序中。仿真软件结构如图1所示。
4 外围软件仿真方法实例
(1)电路原理
图2为电路原理框图。
AT89S52的编译调试器选择Keil C5l。Keil C5l的调试器有AGSI(Advanced Generic Simulator Interface)的软件接口。
(2)定义通信协议
I2C仿真接口和ZLG7290仿真器件问相互动作必须有一个通信协议。通信数据格式定义如表1所列,指令值含义如表2所列。
(3)I2C接口封装
根据Keil C5l调试器关于AGSI的说明,将I2C接口封装。从Keil网站下载AGSI例程SPeriDLL,从网上搜索一个Visual C++的点对点的聊天程序。
将SPeriDLL中不用的控件及相关代码删去(保留也可以),“按键”、“文本框”等控件的使用方法都以例程为准。修改DefineAllWatclhes函数,将监视的51芯片的引脚或存储器的参数修改为:
Agsi.SetWatchOnSFR(Zlg7290.SDAPort.ZLG7290Write,AGSIWRITE);
其中:Zlg7290.SDAPort为控制ZLG7290的51芯片的端口;ZLG7290Write为Zlg7290.SDAPort有动作时调用的函数。
将DefineAllWatches中不必要的代码删除。复制Socket例程,并设置好类及变量。在ZLG7290Write函数体中添加处理I2C和调用Socket发送数据的代码。ZLG7290Write的流程如图3所示。
在对话框消息函数中处理Socket接收信息的地方添加代码(Socket例程中是在此处处理接收数据的)。按自定义协议将接收到的仿真设备的数据存入相应的缓存,或对I2C器件的输出引脚进行操作。SPeriiDLL修改后的对话框如图4所示。
(4)用VB编制仿真软件
从www.zlgmcu.com下载ZLG7290的例程和数据手册。选择一个VB(Visual Basic)的点到点的Socket聊天程序进行修改。增加一个“Form”,并在上面添加ZLG7290要用到的8个数码管控件(自制)、64个按钮控件和1个定时器,如图5所示。建立ZLG7290程序模块,自定义一个ZLG7290的数据类型,并用此类型定义数据变量Reg7290用于保存数据。
修改Socket控件的DataArrival事件的代码。当接收的数据为ZLG7290的地址时,数据交由ZLG7290程序模块处理。数据处理部分根据ZLG7290数据手册和通信协议编写,如果是向某地址写数据,则写到Reg7290的相应位置;如果写到命令地址,则直即执行相应动作程序。
对按键事件进行处理,根据接键保存相应值到Reg7290的按键寄存器,并通过Socket发出按键数据和按键中断输出引脚动作。
在定时器事件中调用刷新数码管数据的程序。仿真软件的Socket部分显示窗如图6所示。
(5)仿真
按照AGSI的说明文件apnt_154.pdf设置Keil C51调试器,调试器打开ZLG7290例程和I2C接口;运行VB下编制的仿真软件;用Socket连接;全速运行ZLG7290例程。数码管显示如图5所示。
运行时,ZLG7290的例程中不停地向I2C总线查询按键和发送显示数据。在这样的情况下,仿真软件各项仿真功能工作正常,表明这种仿真方法是可行的。
(6)说明
在实例中只有一种接口,如果接口种类增加,则只需在VB仿真软件端增加Socket控件。如果不想用VB开发仿真软件,那么也可以选择其他语言。
5 结论
实践证明,本文的仿真方法是可行的,但需要单片机调试器提供软件接口。如果各种单片机调试器都有接口,那么仿真部件就可以得到充分利用。