'54x中的主机接口(HPI)主要有三种:标准8位HPI-8接口、增强型8位HPI-8接口和16位HPI-16接口。其中'542~'549包含为 标准型HPI-8, '5402、'5410包含为增强型HPI-8, '5420以上为HPI-16,而'5409、'5416的HPI可以由用户设置为增强型HPI-8或HPI-16。增强型比标准型更优越之处主要在于增 强型允许主机访问DSP内部的所有片内RAM,而标准型只能访问RAM区中指定的2K字。
以TMS320VC5410(简称为'5410)包含的增强型HPI-8接口为例,它与外部主机或微处理器的连接如图13-10所示,其具有单独的8根数 据线HD0~HD7和10根控制线。控制信号的时序逻辑如图13-11。主机主动通过HPI口访问DSP,除了对主机发中断(通过置HPIC寄存器的 HINT位可以使HINT线有效)或清除主机发来的中断(通过清HPIC寄存器的DSPINT标志)需要DSP干涉外,'5410的CPU几乎不用进行其 它操作,片内的DMA通道会自动辅助完成RAM区和HPI数据寄存器的数据传输。主机由HCNTL0/1线来确定选择HPI的某个控制寄存器(如表 13-7)。通过对这四个寄存器的访问就可以在所设安全机制的允许范围下读/写DSP的所有或部分片内RAM。
图13-10 DSP主机接口HPI8与外部处理器的连接示意图
由于DSP最小存储单位的是字(16位),因此对于HPI-8,每个字的传递必须要有两个传递周期才能完成。HBIL信号用于区分传递的字节是当前字的第 一字节还是第二字节。通过设置HPIC寄存器的BOB位,可以决定第一字节是这个字的高字节还是低字节。
通过HPI实现程序下载属于'5410程序加载的五种途径之一。在需要与主机连接的应用设计中,采用HPI程序加载方式可以使电路设计简化,省去外部并行或串行的ROM或FLASH程序存储器。
图13-11 HPI-8控制信号的时序
表13-7 HCNTL0/1的选择功能描述
13.3.1 增强型HPI-8与主机并口的连接
'5410具有’54x系列的大部分特点,它包括3个多通道缓冲串口(McBSP)六通道DMA,8位增强型主机接口HPI-8,增强型外部并行接口(XIO2)、16K的片内ROM、56K的片内RAM等,可以说是一个功能强大的微处理器。
在实现DSP与计算机主机的并口通讯时,将主机并口的工作模式设置在扩展功能(ECP)模式下,在通讯速度要求不高的场合下可以将其设置为PS/2模式。PS/2模式是在SPP基础上扩展的双向传输模式,以字节为单位读写数据。
在一些DSP与主机并口通讯的设计中,采用了CPLD来产生接口时序,这种方式除了加大电路成本外,还给设计增加了复杂度。事实上,利用几个简单的逻辑门就可以实现DSP与主机的并口通讯。
对于DB25的主机并口线,Data0~Data7作为双向的数据线,Strobe反相作为HDS1控制信号、AutoFd、SelectIn 分别作为HCNTL0/1信号,Init作为HR/W控制信号。HBIL信号由Strobe信号触发J-K触发器翻转。考虑到HPI的程序加载功能,利用 J-K触发器将SelectIn和AutoFd信号逻辑组合得到对DSP的RESET复位控制。另外,由于'5410的I/O口线为3.3V CMOS电压,而并口则通常为5V TTL电压。因此,为达到电平匹配,在两级之间增加了电平转换的缓冲器SN74LVC245。具体电路设计如图13-12。
HCNTL0/1的状态变化规则如图4所示。可以看出,只有当HCNTL1为1,HCNTL0由0变1时,才会触发复位状态的翻转。所以,当需要从寄存器 HPIA切换到非增HPID时,为避免触发复位状态翻转,HCNTL1/HCNTL0应以10→00→01→10的方式进行转换。
图13-12 HPI-8与并口的接口电路设计
图13-13 HCNTL0/1 状态变化规则
13.3.2 程序设计
1.主机程序
主机程序主要完成HPI寄存器的选择、时序的构建和数据读写等。限于篇幅,此处只列举主机读DSP片内RAM存储区的时序构建、及其与DSP间的通讯握 手。其中, p_DATA、p_STATUS 、p_CONTROL分别代表LPT1的数据寄存器、状态寄存器和控制寄存器,ECP扩展控制寄存器ECR的bit7~5设置为'001'。HPI的 HPIC寄存器BOB位设置为'0'(第一字节为高字节)。
/* 读/写HPI寄存器,读/写的'字'存放在*data和*(data+1),r_w 为 0时代表写,为1时代表读。*/
void HPIregRW(char* reg, BYTE* data, BYTE r_w)
{
BYTE test;
BYTE CRW=0x00|(r_w1; latch the 1st byte, then HBIL =1
*(data++)=_inp(p_DATA);
while((_inp(p_STATUS) & 0x08) == 0); //wait for HBIL=1(2nd byte)
ChangeCONTROL(2,0);
_outp(p_CONTROL,CONTROL);
//在HPIR/W的上升沿对数据线采样。(第二字节)
ChangeCONTROL(2,1);
_outp(p_CONTROL,CONTROL);
ChangeCONTROL(0,0);
_outp(p_CONTROL,CONTROL); //HDS1: 1 -> 0, sampling HCNTL0/1,HR/W, HBIL
while((_inp(p_STATUS) & 0x10) == 0); //wait if HDRY=0, continue if HDRY=1
ChangeCONTROL(0,1);
_outp(p_CONTROL,CONTROL); // HDS1: 0 -> 1; latch the 2nd byte, then HBIL =0
*(data--)=_inp(p_DATA);
while((_inp(p_STATUS) & 0x08) != 0); //wait for HBIL=0(1st byte)
ChangeCONTROL(2,0);
_outp(p_CONTROL,CONTROL);
}
else //写{(略)}
}
…
void main(void)
{
/* HPI初始化 */ …
/* 等待DSP给主机发中断HINT(查询方式)后,从DSP读数(without auto-increase )*/
WriteHPIreg("HPIC",0x0808); //清HINT中断
/* 读取DSP片内RAM区数据 */
for(i=0;i |