由于DSP最小的存儲單位是字(16位),因此對于HPI-8,每個的傳遞必須要有2個傳遞周期才能完成。HBLL信號用于區(qū)分傳遞的字節(jié)是當(dāng)前字的第一字節(jié)還是第二字節(jié)。通過設(shè)置HPIC寄存器的BOB位,可以決定第一字節(jié)是這個字的高字節(jié)還是低字節(jié)。
通過HPI實(shí)現(xiàn)程序下載屬于''5410程序加載的五種途徑之一。在需要與主機(jī)連接的應(yīng)用設(shè)計中,采用HPI程序加載方式可以使電路設(shè)計簡化,省去外部并行或串行的ROM或FLASH程序存儲器。
3 增強(qiáng)型HPI-8與主機(jī)并口的連接
''5410具有C54x系列的大部分特點(diǎn),它包括3個多通道緩沖串口(McBSP)六通道DMA、8位增強(qiáng)型主機(jī)接口HPI-8、增強(qiáng)型外部并行接口(XIO2)、16K字的片內(nèi)ROM、56K字的片內(nèi)RAM等,可以說是一個功能強(qiáng)大的微處理器。
在實(shí)現(xiàn)DSP與計算機(jī)主機(jī)的并口通信時,將主機(jī)并口的工作模式設(shè)置在擴(kuò)展功能(ECP)模式下,在通信速率要求不高的場合,可以將其設(shè)置為PS/2模式。PS/2模式是在SPP基礎(chǔ)上擴(kuò)展的雙向傳輸模式,以字節(jié)為單位讀/寫數(shù)據(jù)。

在一些DSP與主機(jī)并口通信的設(shè)計中,采用了CPLD來產(chǎn)生接口時序,這種方式除了加大電路成本外,還給設(shè)計增加了復(fù)雜度。事實(shí)上,利用幾個簡單的邏輯門就可以實(shí)現(xiàn)DSP與主機(jī)的并口通信。
對于DB25的主機(jī)并口線,Data0~Data7作為雙作為HDS1控制信號,AudoFd、SelechIn分別作為HCNTL0/1信號。Init作為HR/W控制信號。HBIL信號由Strobe信號觸發(fā)J-K觸發(fā)器翻轉(zhuǎn)?紤]到HPI的程序加載功能,利用J-K觸發(fā)器將SelectIn和AutoFd信號邏輯組合得到對DSP的RESET復(fù)位控制。另外,''5410的I/O口線為3.3V CMOS電壓,而并口則通常為5 V TTL電壓。因此,為達(dá)到電平匹配,在兩級之間增加了電壓轉(zhuǎn)換的緩沖器SN74LVC245。具體電路設(shè)計如圖5所示。
HCNTL0/1的狀態(tài)變化規(guī)則如圖4所示?梢钥闯,只有當(dāng)HCNTL1為1,HCNTL0由0變1時,才會觸發(fā)復(fù)位狀態(tài)的翻轉(zhuǎn)。所以,當(dāng)需要從寄存器HPIA切換到非增HPID時,為避免觸發(fā)復(fù)位狀態(tài)翻轉(zhuǎn),HCNTL1/HCNTL0應(yīng)以10-00-01-10的方式進(jìn)行轉(zhuǎn)換。
4 程序設(shè)計
4.1 主機(jī)程序
主機(jī)程序主要完成HPI寄存器的選擇、時序的構(gòu)建和數(shù)據(jù)讀/寫等。限于篇幅,此處只列舉主機(jī)讀DSP片內(nèi)RAM存儲區(qū)的時序構(gòu)建及其與DSP間的通信握手。其中,p_DATA、p_STATUS、p_CONTROL分別代表LPT1的數(shù)據(jù)寄存器、狀態(tài)寄存器和控制寄存器。ECP擴(kuò)展控制寄存器ECR的bit7~5設(shè)置為''001''。HPI的HPIC寄存器BOB位設(shè)置為''0''(第一字節(jié)為高字節(jié))。
/*讀/寫HPI寄存器,讀/寫的''字''存放在*data和*(data+),
r_w為0時代表寫,為1時代表讀。*/
void HPIregRW(char*reg,BYTE*data,BYTEr_w)
{
BYTE test;
BYTE CRW=0x00 (r_w<<5);
int i_HBIL=0;
/*切換選擇HPIC、HPIA、HPID_I、HPID_n寄存器之一*/
if(strcmp(reg,"HPIC"==0)
{
ChangeCONTROL(0x0b CRW);
//ChangeCONTROL(BYTE bValue)

}
else if(strcmp(reg,"HPIA"= =0)
ChangeCONTROL(0x03 CRW);
else if(strcmp(reg,"HPID_I"= =0)//采用自增地址主機(jī)寫
ChangeCONTROL(0x09 CRW);
else if(strcmp(reg,"HPID_n"= =0) //主機(jī)寫
ChangeCONTROL(0x01 CRW);
else
{
printf("Wrong register for HPI write.";
exit(-1);
}
outp(p_CONTROL,CONTROL);
if((_inp(p_STATUS)&0x08)!=0) //如果HBIL!=0
{
ChangeCONTROL(0,0); //重載函數(shù)
//ChangCONTROL(BYTE bit,BYTE bValue)
_outp(p_CONTROL,CONTROL); //HDS1=0
ChangeCONTROL(0,1);
_outp(p_CONTROL,CONTROL); //HDS1=1
}
/*開始時序的準(zhǔn)備*/
while((_inp(p_STATUS)&0x08)!=0); //等待HBIL=0
//(lst byte)
if(r_w)//讀
{
//在HPIR/W的上升沿對數(shù)據(jù)線采樣(第一字節(jié))
ChangeCONTROL(2,1);
-outp(p_CONTROL,CONTROL);
ChangeCONTROL(0,0);
_outp(p_CONTROL,CONTROL);//HDS1:1->0, //采樣HCNTL0/1,HR/W,HBIL
while(_inp(p_STATUS)&0x10= =0); //若HDRY=0,//等待;HDRY=1,繼續(xù)
ChangeCONTROL(0,1);
outp(pCONTROL,CONTROL);//HDS1:0->1; //鎖存第1字節(jié),然后HBIL=1
*(data++)=_inp(p_DATA);
while((_inp(p_STATUS)& 0x08)= =0); //等待HBIL//=1(2nd byte)
ChangeCONTROL(2,0);
_outp(p_CONTROL,CONTROL);
//在HPIR/W的上升沿對數(shù)據(jù)線采樣(第二字節(jié))
ChangeCONTROL(2,1);
_outp(p_CONTROL,CONTROL);
ChangeCONT^ROL(0,0);
_outp(p_CONTROL,CONTROL);//HDS1:1->0,
//采樣HCNTL0/1,HR/W,HBIL
while(_inp(p_STATUS)&0x10)= =0);//若HDRY=0//等待,HDRY=1繼續(xù)
ChangeCONTROL(0,1);
_outp(p_CONTROL,CONTROL);//HDS1:0->1; //鎖存第2字節(jié),然后HBIL=0
*(data- -=_inp(p_DATA);
while((_inp(p_STATUS)&0x08)!=0); //等待HBIL=0
(lst byte)
ChangeCONTROL(2,0);
_outp(p_CONTROL,CONTROL);
}
else//寫{(略)}
}
…
void main(void)
{
/*HPI初始化*/…
/*等待DSP給主機(jī)發(fā)中斷HINT(查詢方式)后,從DSP讀數(shù)*/
WriteHPIreg("HPIC",0x0808); //清HINT中斷
/*讀取DSP片內(nèi)RAM區(qū)數(shù)據(jù)*/
for(i=0;i<data_length;i++)//data_length:讀取數(shù)據(jù)的長度
{
HPIA=resultAddr++;//resultAdd:要讀取的RAM數(shù)//據(jù)區(qū)起始地址
WriteHPIreg("HPIA",HPIA);
while((_inp(p_STATUS)&0x40)!=0);//等待DSP發(fā)//送HINT有效信號(握手信號)
//調(diào)用讀RAM區(qū)數(shù)據(jù)的函數(shù),并寫入創(chuàng)建的文件data.dat
WriteHPIreg("HPIC",0x0808); //清HINT中斷
WriteHPIreg("HPIC",0x0404); //主機(jī)發(fā)送DSINT有//效給DSP(握手信號)
}
WriteHPIreg("HPIC",0x0808); //清NINT中斷
}
試驗(yàn)證明,主機(jī)并口的讀取速度遠(yuǎn)低于DSP的執(zhí)行速度,因此,程序子函數(shù)中的一些等待查詢指令可替略。在主函數(shù)main()中,如果讀取的DSP數(shù)據(jù)是靜態(tài)的,不需實(shí)時提供,則這樣的指令也可以省略。
4.2 DSP的握手程序
在實(shí)際情況中,需要傳遞的數(shù)據(jù)大都由DSP實(shí)時處理得到。一邊處理一邊傳輸可以大大提高系統(tǒng)的整體效率,而且由于HPI工作的特點(diǎn),傳輸幾乎可以不占用DSP的時間。唯一需要DSP干預(yù)的是數(shù)據(jù)準(zhǔn)備好后通知主機(jī)接收(通過HINT中斷)。這項(xiàng)任務(wù)可以放大DSP的DSPINT中斷服務(wù)程序中進(jìn)行其程序簡要如下:
.mmregs
.include "vectors.h"
dataarea .usect "COMMS",100h,1;所需傳遞的數(shù)據(jù)塊區(qū)間
HOSTACK.macro
hack ldm hpic,a ;累加器A載入HPIC值
and #08h,a ;屏蔽HINT的其他位
bc hack,aneq ;判斷HINT的狀態(tài),直到HINT
;位為0(即主機(jī)清HINT標(biāo)志)
.endm
.text
start:stm #00a0h,pmst;設(shè)置IPTR寄存器
stm #0000h,st0 ;設(shè)置ST0、ST1寄存器
stm #2800h,stl
stm #0010,tcr ;關(guān)閉計時器
stm #0ffffh,ifr ;清除所有的中斷標(biāo)志位
stm #0300h,imr ;使能DSPINT中斷
stm #280h,sp ;初始化堆棧指針SP為280h
HOSTACK ;檢查主機(jī)是否清HINT標(biāo)志
stm #0ah,hpic ;置HINT位,向主機(jī)發(fā)送
;HINT有效信號,告知第一個數(shù)已準(zhǔn)備就緒
rsbx intm ;開啟中斷
wait: b wait ;主程序(此處為死循環(huán))
hpi: stm #0ah,hpic ;當(dāng)主機(jī)取完數(shù)后置DSPINT
;位,進(jìn)入DSPINT中斷服務(wù)程序
rete ;DSP向主機(jī)發(fā)送NINT握手
;信號,通知下一個數(shù)已準(zhǔn)備好
.end





