摘 要:结合主机并行接口(HPI)的设计经验,详细讨论了DSP和主机(HOST)通过Enhanced 8bit HPI自举引导的通信方案。
关键词:主机并行接口 个人计算机 自举引导
随着信号处理技术的高速发展,DSP已经成为首选的数字信号处理芯片,如许多手机和硬盘中都嵌入了DSP芯片。目前的系统已经很少有单机系统,因此如何实现DSP与其他机器之间的通信是个关键问题。主机并行接口(HPI)为用户提供了高速的并行接口,使DSP拥有最优的工作效率,也使得HOST CPU有更强大的控制权。
1 资源环境简介
TMS320VC5402是TI公司推出的一款高性能、低功耗定点DSP,广泛应用于嵌入式系统以及无线通信领域。其CPU具有增强的多总线哈佛结构,速度为100MIPS,片内有4KB ROM和16KB双访问RAM。片上其他硬件资源主要有可编程等待状态发生器、锁相环(PLL)发生器、二路多通道缓冲串行口(McBSP)和增强型8bit并行主机接口(HPI-8)等。
该方案中HOST为PC机。PC的I/O并口(常用做打印机接口)端口地址为0x378~0x37A,0x378是数据口基地址,0x379为状态口地址,而0x37A为控制口地址[1]。在Windows2000操作系统下,系统不能直接对I/O端口的读写操作,而WIN98可以直接对I/O端口读写操作。本文中所讨论的引导方案是在WIN98 实模式DOS环境下实现的。需注意的是PC的0x378数据端口对应的输出芯片是74LS374。对于非增强型并口(SPP)只能输出数据,不能读取外部数据,读操作所读的数据只能是前一次PC机所写的数据,如需读取数据可在CMOS中将其设置为EPP。
TMS320VC5402的8bit HPI口为增强型。增强型HPI可访问片内所有RAM空间。在非主机独占模式下访问RAM时,HOST的HPI访问一直和DSP同步,且HPI和DSP都有访问权。HPI通过对3个寄存器HPIC(控制寄存器)、HPIA(地址寄存器)和HPID(数据寄存器)访问片内RAM。HOST用HCNT0/1引脚区分各寄存器,HBIL高低电平区分高低字节,HDS1/2和HAS产生内部控制传送信号。由于HPI为8bit,所以每次都是传送2字节再组成内部的1个字(具体控制见后面程序)[2]。DSP/HPI工作时序图如图1所示。
2 引导及程序实现
DSP上电后,当MP/MC为低电平时,DSP开始执行片内自举引导程序。先清除IFR,置HINT为低,再检测INT2位是否置位(置位可通过将HINT和INT2相连实现),如置位则进行HPI引导,HOST按照图1的时序将应用程序或数据以字(分为2字节)为单位下载到RAM。下载完后再在0X7F写入程序入口地址。该过程中DSP将一直检测0X7F是否为0,如不为0,则跳转到该地址(0X7F中的内容)执行程序。DSP在该过程中执行以下代码[3]:
;从VC5402 ROM中截取的程序
ssbx intm;屏蔽所有中断
stm #0FFFFh,@ifr ;清除所有 IFR 标志
stm #0,@HPIentry ;设置HPI入口点(0X7F)的值为0
stm #08h,hpic ;置HINT为低
bitf @ifr,#int2msk ;检查INT2标志位是否置位
bc HPI,tc;如果INT2置位则进行HPI引导
……
HPI
ldm HPIentry,a ;获取HPI入口向量
bc hpiboot,aneq ;如果0x7F内容不为0,
;则进行HPI引导
b $-3;否则一直循环
PC机并行打印口和DSP/HPI通信原理图如图2所示。由于PC机的并口输出TTL电平,而DSP可接受的最高电平是3.6V,故需要电平转换,图中芯片SN74LVC16245就是起电平转换作用的。此外,图2中DSP的HINT和INT2相连(以选择HPI引导),PC的STROBE(打印口引脚1)接DSP的HBIL,BUSY(打印口引脚11)接HRDY,AUTOFE(打印口引脚14)接HCNT0,INIT(打印口引脚16)接HDS1和SLCTIN(打印口引脚17)接HCNT1。
在图2的电路基础上开始HPI自举引导。首先HOST初始化HPIC,向HPIC发送2个相同的8位数据的控制字。HPIC初始化完成后,HOST开始写HPIA(HPIA存放数据地址)。在上述2个寄存器初始化都完成后,HOST便可向DSP的RAM写数据。实际上HOST通过写HPID,然后DSP按照HPIA指定的地址,自行将HPID的数据写到片内RAM,且该过程对用户完全透明。
地址寄存器HPIA有多种模式,可选是否自动增加,即可以只写1次HPIA且设定HPIA自动增加,此后便不用写地址即可实现连续数据的写入或读出。在该引导过程中,HBIL引脚为低电平时,表示HOST传送的是第1字节,而当HBIL引脚为高电平时,传送的是第2字节。与其相配合的HPIC控制寄存器的BOB位为1时,将传送第1字节并将其放在RAM的低8位,第2字节放在高8位;当BOB位为0时置放顺序颠倒。
下面是实现HOST(PC机)控制HPI进行自举引导的程序,主要由以下3个函数完成:(1)write_port_a( )函数实现向地址寄存器HPIA写地址字。(2)write_port_d( )函数实现向DSP的RAM写数据字。(3)write_port_c( )函数实现向控制寄存器HPIC写控制字。其自举引导程序如下:
#define PORT_D 0x378 //PC数据口
#define PORT_S 0x379 //PC状态口(其中输出STROBE,
//BUSY和SLCTIN的数据反向)
#define PORT_C 0x37a//PC控制口(其中BUSY反向)
write_port_a(int write_data)//向HPI的HPIA写1个字
{
_outp(PORT_C,0x0009);//控制口hcnt1=0 hcnt0=1
//hbil=0 hds1=0
_outp(PORT_D,write_data);//输出数据低8位
_outp(PORT_C,0x000d);//控制口hcnt1=0 hcnt0=1
//hbil=0 hds1=1
_outp(PORT_C,0x0009);//控制口hcnt1=0 hcnt0=1
//hbil=0 hds1=0
read_data=_inp(PORT_S);
while(1) { if((read_data&hrdy)<1) break;
else read_data=_inp(PORT_S);}
_outp(PORT_C,0x0008);//控制口hcnt1=0 hcnt0=1
//hbil=1 hds1=0
write_data=write_data>>8;
_outp(PORT_D,write_data);//输出数据的高8位
_outp(PORT_C,0x000c);//控制口hcnt1=0 hcnt0=1
//hbil=1 hds1=1
_outp(PORT_C,0x0008);//控制口hcnt1=0 hcnt0=1
//hbil=1 hds1=0
}
write_port_d(int write_data)//向HPI的HPID,即向RAM
//写1个字,地址非自动增加
{
_outp(PORT_C,0x0003);//控制口hcnt1=1 hch0=0
//hbil=0 hds1=0
……
}
函数write_port_d( )类似于函数write_port_a( ),只需将操作HPIA的程序中的hcnt1/0改变,在写控制数据时所有数据值减6,即可省略部分程序。
write_port_c(int write_data)//向HPI的HPIC写1个字,
//要求该字中是2个完全相同的字节
{
_outp(PORT_C,0x000b);//控制口hcnt1=0 hcnt0=0
//hbil=0 hds1=0
……
函数write_port_c( )类似于函数write_port_a( ),只需将操作HPIA的程序中的hcnt1/0改变,在写控制数据时所有数据值加2,即可省略部分程序。
利用上述3个函数,PC机可以将1组每字16位的数据写到DSP的RAM里。但要注意先初始化控制寄存器HPIC,控制主机写进去的每个字的2个字节如何组成RAM里的1个字,否则将会产生错误。如把第1个字节放在低8位,第2个字节放在高8位,即BOB位为1。可通过下面语句实现:
write_port_c(0x0101);
该函数初始化控制寄存器HPIC,以使HPIC中的BOB位为1,XHPIA为0。
3 将完整的应用程序全部写进DSP
将一个完整的应用程序按每字16位写到RAM中后,要实现自举引导还需改变0X7F的内容,使其指向程序入口地址。写完后DSP将自动转向应用程序并运行。
write_port_a(0x7f);
write_port_d(0x3000);//假设0x3000为程序入口点
下面讨论如何将一个含多个段的可执行COFF文件转化为程序所需的格式[4]。例如将test.asm源程序链接并编译生成test.out文件,而该程序有.text段和.data段。其方法:用hex500.exe转换工具将test.out生成2个16位的HEX文件,分别对应text段和data段。其命令文件如下:
test.out//输入文件
-I//生成Intel格式
-memwidth 16//存储器数据宽度
ROMS
{
PAGE 0:
ROM1:origin=0x3000,length=0x2000,romwidth=16
files={t1.dat} //text段起始地址为0x3000
PAGE 1:
ROM2:origin=0x80,length=0x1f80,romwidth=16
files={t2.dat} //data段起始地址为0x80
}
SECTIONS //如有多段就可增加多个ROM
{
.text: paddr=0x3000
.data: paddr=0x80
}
再通过编程实现将t1.dat和t2.dat连续写入RAM,完成后再将0x7F的内容写成0x3000就可以实现引导。
4 探讨和总结
以上讨论的是增强型8bit HPI,HOST通过该HPI只能访问片内RAM空间。如要访问所有存储器空间,DSP必须再次引导。先执行本身片内ROM中的引导程序将HOST的二次引导程序代码下载到片内RAM,再通过执行二次引导程序访问其他非片内数据。HPI 自举引导本身也是一种数据通信,在本方案中已详细地讨论了HPI的自举引导。
现实应用中通常为多机系统,由于DSP的控制能力不很强,通常只是作为信号处理器,其信息及控制数据通常来自主机。而增强型HPI具有高速数据通信速率,且通信控制方式简单。故HPI是DSP与其他机器通信的一种良好途径。
参考文献
1 钱晓捷,陈涛.微型计算机原理及接口技术.北京:机械工业出版社,1999
2 TMS320C54x DSP Reference Set,Volume 5:Enhanced Peripherals.Texas Instruments Incorporated(SPRU302) Copyright(C),2001
3 TMS320C54x Assembly Language Tools User′s Guide (SPRU102).TMS320VC5402 and TMS320UC5402 Bootloader.Texas Instruments Incorporated(SPRA618) Copyright(C),2001
4 刘益成.TMS320C54X DSP应用程序设计与开发.北京:北京航空航天大学出版社,2002