利用ISA总线实现对DSP芯片VC5402的软配置_DSP论文
摘要:以pc机作为主机,通过pc的isa总线与dsp的hpi主机并口连接作为传输通道,实现对pc机isa插卡上的dsp芯片tms320vc5402进行实时在线程序装载。
关键词:dsp hpi主机并口 isa总线 软配置
一、引言
目前,随着微电子技术的飞速发展,在基于工业测控和数据采集领域的pc机板卡产品中,高速dsp芯片的使用已经是越来越普及。众多厂家生产的dsp芯片中以美国ti公司(德州仪器)生产的dsp芯片的应用最为普遍。同传统的诸如单片机的程序装载过程相比,dsp厂家为芯片提供了更多、更灵活的程序装载方法。电子工程师在设计dsp系统中究竟采用那种程序装载方法,应视产品类型的不同而有所选择。当前许多厂家所生产的dsp芯片中都集成了主机并行接口,利用主机并口可以完成主机和dsp之间的并行数据交换。例如ti公司的tms320c54x系列的dsp芯片、ad公司adsp21xx系列的dsp芯片等。而主机并口在完成主机与dsp进行数据交换的同时,还大都具有程序装载的功能。在pc板卡类电子产品上使用dsp芯片时,实际上是一种主从模式的应用,即把pc机作为主机,dsp芯片作为从机。这时采用主机并口通过pc机的系统总线来完成程序的装载就成了一种既经济实用又灵活方便的方式。下面以ti公司的tms320vc5402为例(以下简称为vc5402),本文介绍了如何由pc的isa总线来完成dsp程序的hpi(主机并行接口)装载,并给出了软硬件开发的实例。
二、硬件设计
1.vc5402的hpi程序装载过程
vc5402内部具有4k×16位字的rom,当系统上电复位后,如果vc5402的mp/mc引脚为低,那么vc5402的pc程序指针跳到地址为0xff80的rom处开始执行复位向量段的程序。该段程序是厂家在出厂时就固化好的一段程序,它首先执行跳转指令,跳到地址为0xf800处开始执行,从0xf800开始的rom的内容被称为程序装载器(bootloader)。在那里dsp将要判断用户究竟采用了那种程序装载方式,而判断的依据是通过诸如中断的有无、数据或i/o空间固定地址单元内特定的标志字的有无等厂家已经定义好的方式来识别的。值得注意的是,vc5402的hpi装载方式与c54x系列的其它型号稍有不同。其不同有以下两点:
⑴ vc5402的hpi装载过程是在复位过程(reset)以后完成的,不是在复位过程中完成的。
⑵ /int2标志位不是判断hpi装载模式的唯一方法,vc5402内地址为0x007f的ram单元的内容也是判断hpi装载模式的一种方法。
pc机的isa总线作为主机(以后称为host)可以通过hpi口把vc5402的程序装载到vc5402内部双存取ram中开始执行。
图1 isa总线与vc5402的hpi接口电路
2.硬件实现
实现isa总线与vc5402的hpi硬件接口比较简单,需要注意的一点就是vc5402与isa总线需要电平转换。由于isa总线电平是5v ttl电平,而vc5402是3.3v电平,所以两者不能直接接口。我们可以使用philips公司的74lvc245电平转换芯片,这种芯片采用3.3v供电,能允许5v和3.3v两种电平的输入信号。输出为3.3v电平,可以和3.3v器件直接接口。电路原理图见图一:
由于需要pc对vc5402进行实时的程序装载,那么vc5402的复位就不能用简单的rc电路来完成,这里采用一片74hc74的d触发器由pc控制完成vc5402的复位过程。图中,我们把/hint和/int2连在一起,是因为vc5402在运行bootloader时会自动在/hint引脚输出一个低电平,这样会使vc5402在复位结束后马上能识别到当前的装载模式为hpi模式,而忽略对其它模式的循环搜索。电路设计时需要注意对vc5402的hpi相关控制引脚的接法。对于控制引脚,采用不同的host时,接法也会有所不同。这里需要了解一下hpi主机并口工作的时序,时序图见图二。图中的/hcs信号是hpi使能输入信号,当使用hpi时,/hcs信号必须接地。/has是hpi的地址锁存输入信号,这个信号在地址总线与数据总线分时复用的处理器(例如8031)作为host时作为地址锁存信号来使用;对于isa总线,其地址线和数据线是分开的,所以/has只要接3.3v即可。/hds1和/hds2是两个数据锁存信号,事实上使用其中的一个就可以了,而另一个则必须接3.3v。本例子中使用了/hds1,而/hds2接了3.3v。应该指出,当不使用/has信号时,/hds1和/hds2两个输入信号也具有地址锁存作用,在它们的下降沿时刻,vc5402的hpi锁存hcntl0、hcntl1、hbil和hr/w四个控制输入信号的值。通过这四个信号的值,vc5402可以确定当前是对那个寄存器进行操作、是读操作还是写操作、是对16位字长的高八位还是低八位进行传输,因此电路设计时必须确保在/hds1或/hds2下降沿时上述四个控制信号具有正确的逻辑电平,否则整个程序装载过程将会失败。
图2 hpi操作时序图
由于vc5402内部是16位的数据总线,而其hpi主机并口却是一个8位的数据总线,所以通过hpi与host进行一个16位字的数据交换需要分两次来完成,hbil信号来指出当前是第一个字节还是第二个字节。hr/w输入信号来指出当前host的数据传输方向,由于这里只是对vc5402进行程序装载,即host只对hpi进行写操作,所以把hr/w接地。至于hcntl0、hcntl1两个输入控制信号的作用,这里不妨简述如下:
host通过hpi与vc5402进行数据交换时,实际上只是对vc5402的三个寄存器进行访问,它们是hpi控制寄存器hpic、hpi地址寄存器hpia和hpi数据寄存器hpid。host对这三个寄存器的寻址,是通过输入信号线hcntl0和hcntl1来完成的,具体过程如下表一。实际应用中通常是把hcntl0、hcntl1连同hbil接到host的地址线上。
表一 hpi主机并口的地址分配
hcntl0 | hcntl1 | 功 能 描 述 |
0 | 0 | host读写hpi控制寄存器hpic |
0 | 1 | host读写hpi控制寄存器hpid,同时hpia具有自动加1的功能,这种方式可以数据交换的速度 |
1 | 0 | host读写hpi地址寄存器hpia |
1 | 1 | host读写hpi数据寄存器hpid,hpia寄存器不受影响 |
电路中用一片gal16v8来完成pc的i/o地址译码。下面来对vc5402进行i/o资源分配。分配情况见表二。根据资源分配,对照图一所示电原理图,写出gal16v8的译码状态方程:
io4=a9*/a8*/a7*/a6*a5*a4*/a3*/a2*/a1*/a0*aen*/iow ;对vc5402复位译码
/io1=/iow ;送/hds1进行数据锁存
/io6=a9*/a8*/a7*/a6*a5*a4*a3*aen ;hpi地址选通
为了防止74lvc245高阻输出时的不稳定对/hds1造成误操作,使用10kΩ的电阻对/hds1进行上拉是必要的。
表二 pc对vc5402的i/o资源分配
i/o地址 | 操 作 |
230h | 对vc5402进行复位,当写00h时是执行复位,当写入01h时是跳出复位状态 |
238h | 写hpic是第一个字节 |
239h | 写hpic是第二个字节 |
23ch | 写hpia是第一个字节 |
23dh | 写hpia是第二个字节 |
23eh | 写hpid是第一个字节 |
23fh | 写hpid是第二个字节 |
三、软件设计
1.软件开发步骤
基于isa总线实现对vc5402的软配置,软件的关键在于host方软件的编写,至于vc5402的运行程序的编写当然不在讨论的范畴。host方软件所要完成的任务就是把vc5402的运行程序按照编程者事先指定好的地址进行定位装载然后运行。那么究竟应该把什么格式的文件装载到vc5402的内部,又怎样装载呢?鉴于此,可以把host方软件用下面四个步骤来概括:
⑴生成* .out形式的公用目标文件(coff)。
当在ti公司的c54x集成开发环境ccs 5000 下进行c54x系列的程序开发时,都会经过编译,链接最后生成*.out文件。
⑵对*.out文件进行提取,从中筛选出对最后装载有用的代码和地址。
第一步所产生的*.out文件由于是coff格式的文件,也就是一种模块化的经过bootload后就可执行的文件,它的可重定位特性使得用户可以对程序在允许的地址范围内灵活地安排。正因为如此,*.out文件还不是一个完完全全的可执行代码,它里面包含有一些关于程序中各个段的诸如起始地址、段的长度这样的辅助信息,如果把这些信息连同程序代码都装入dsp内部,程序是不会被正常执行的。这时必须要对*.out进行辅助与可执行代码的提取与分离。完成这个任务是靠专门的程序完成的,是ti公司提供的,程序的名称是:coff_both.exe。这个程序可以在ti的网站上免费下载,空间为120k。利用该程序对*.out文件进行操作最后生成第三步所需的*.out.c的文件。
⑶把经过提取的*.out.c文件按照文件提供的起始地址和程序代码通过hpi装载到vc5402内部。
第二步生成的*.out.c文件明确地告诉了程序有几个段,每个段的大小,段的起始地址以及每个段的16进制代码。有了这个文件,就知道了该写些什么内容到vc5402里去才能够开始执行vc5402的程序了。接下来要做的就是通过编写自己的应用程序把*.out.c文件中的16进制代码通过hpi写入vc5402内部。
⑷把程序执行的首地址写入vc5402内部地址为0x007f的单元内部。
在把所有的代码都装载完毕后,最后必须要在vc5402内部0x007f的ram单元内写入程序执行的首地址。当vc5402检测到0x007f单元内的值为非0值时,就知道hpi装载过程已经结束,并从0x007f单元指定的地址开始执行程序,至此整个装载过程结束。
2.软件开发实例
结合图一的硬件电路,对照软件开发的每一个步骤,我们给出了一个简单的软件开发的例子,意在使对此感兴趣的读者能够通过此例,真正明白用hpi进行vc5402装载的全过程。图一中vc5402的xf输出引脚接了一个发光二极管,vc5402程序的功能就是使该二极管不停的闪烁。下面按照上述的四步流程进行:
⑴编写example.asm 和example.cmd 文件,用ccs 5000集成开发软件生成example.out文件。关于通过控制xf引脚来使发光二极管闪烁的vc5402程序的编写,这里就不再赘述。
⑵把coff_both.exe 和example.out文件放在同一目录下,在dos命令提示符下键入:coff_both -out example.out 。这时就会生成example.out.c格式的文件。该文件的形式见图三。这个程序只有一段程序,即.text段,这段程序一共由41个字组成,该程序段需要装载到开始地址为0x0080开始的内部ram中去运行。而这41个字的16进制代码则是最后真正被执行的vc5402的程序代码。
⑶把example.out.c文件中的代码由hpi写到vc5402的内部ram中。 host主机软件,需要用户自己来编写,可以采用vc或vb调用驱动程序来完成,也可以通过turb0 c 2.0直接通过i/o操作来完成,甚至可用masm的汇编语言来编写,程序的主要任务就是读取example.out.c文件和写i/o端口。host主机软件的流程图见图四。为了便于读者编程验证,我们用turbo c 2.0编写了名为host_hpi.c的主机程序,读者可以运行该程序来读取example.out.c文件,把41字的代码装载入vc5402。使用方法如下:在dos命令提示符下键入:host_hpi.exe后,屏幕将提示输入example.out.c文件的路径,例如:键入:c:\ti\myprojects\example.out.c后,host_hpi.exe将完成host装载vc5402的任务,如果看到发光二级管不停的闪烁,表明vc5402已经开始正常运行程序了。至此,整个装载过程完毕。
3. host_hpi.c源程序
/*host_hpi.c*/
#include"stdio.h"
#include"dos.h"
#define size 100
main()
{
file *fp;
unsigned int dsp_res,hpic_h,hpic_l;
unsigned int hpia_h,hpia_l,hpid_h,hpid_l;
char *a,ch,filename;
unsigned int i,j,length,addr,start[10],*data;
printf("please input the name file:\n");
scanf("%s",filename); /*输入程序文件名*/
if((fp=fopen(filename,"r"))==null) /*打开程序文件*/
{
printf("cannot open file:\n");
exit(0);
}
dsp_res=0x240; /*设置dsp各寄存器的i/o地址*/
hpic_h=0x230;
hpic_l=0x231;
hpia_h=0x234;
hpia_l=0x235;
hpid_h=0x236;
hpid_l=0x237;
outportb(dsp_res,0x00); /*dsp复位(dsp_res寄存器置00h)*/
delay(2000); /*延时以保证dsp准确的复位*/
outportb(dsp_res,0x01); /*dsp跳出复位(dsp_res寄存器置01h)*/
outportb(hpic_h,0x00); /*dsp的hpic寄存器置0000h*/
outportb(hpic_l,0x00);
i=0;
while(!feof(fp)) /*判断程序文件是否结束*/
{
fgets(a,size,fp);
fgets(a,size,fp);
fscanf(fp,"%s",a);
fscanf(fp,"%s",a);
fscanf(fp,"%x",&length); /*读取数据的长度*/
fgets(a,size,fp);
fscanf(fp,"%s",a);
fscanf(fp,"%s",a);
fscanf(fp,"%x",&addr); /*读取程序的开始地址*/
fgets(a,size,fp);
fgets(a,size,fp);
for(j=0;j<length;j++)
fscanf(fp,"%x,",data+j);
start[i]=addr; /*保存程序开始地址*/
for(j=0;j<length;j++) /*为dsp装入数据*/
{
/*给dsp的hpia寄存器赋程序地址,先赋高位再赋低位*/
outportb(hpia_h,addr>>8);
outportb(hpia_l,addr&0x00ff);
/*给dsp的hpid寄存器赋程序数据,先赋高位再赋低位*/
outportb(hpid_h,*(data+j)>>8);
outportb(hpid_l,*(data+j)&0x00ff);
addr++; /*程序地址加1*/
}
for(j=0;j<4;j++)
fgets(a,size,fp);
i++; /*循环次数加1*/
}
fclose(fp); /*关闭程序文件*/
outportb(hpia_h,0x00); /*给dsp的hpia寄存器赋007fh*/
outportb(hpia_l,0x7f);
/*将程序的起始地址start [0] 赋予dsp的hpid寄存器*/
outportb(hpid_h,start[0]>>8);
outportb(hpid_l,start[0]&0x00ff);
printf("write data to dsp success!\n"); /*返回写数据成功提示,程序结束*/
}
四、结论
通过本文可以看出,通过pc对vc5402进行hpi的程序装载属于一种基于ram的在线编程,相比于使用并行或串行eeprom进行dsp程序装载的方法,它不用对程序存储器进行烧写,属于一种软配置。在基于pc的插卡式测试设备开发过程中,这种方法避免了多次断电、烧写程序的不便,使设备具有了在线开发的特点。