關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > ‘54x系列DSP與計(jì)算機(jī)并口通信的設(shè)計(jì)方案

‘54x系列DSP與計(jì)算機(jī)并口通信的設(shè)計(jì)方案

作者: 時(shí)間:2016-12-22 來(lái)源:網(wǎng)絡(luò) 收藏

http://butianyuan.cn/article/201612/332848.htm

數(shù)字信號(hào)微處理器(DSP)是近十幾年來(lái)興起的一項(xiàng)新技術(shù)。DSP以其速率快、功能強(qiáng)的特點(diǎn),逐漸進(jìn)入傳統(tǒng)單片機(jī)所占據(jù)的工業(yè)和消費(fèi)領(lǐng)域。TMS320C54x(簡(jiǎn)稱為'54x)是德州儀器公司(TI Inc.)繼TMS320C1x、TMS320C2x、TMS320C5x之后推出的新一代高性能DSP芯片。該系列芯片具有低功耗、高性能、性能價(jià)格比高等優(yōu)點(diǎn),廣泛應(yīng)用于圖像處理、語(yǔ)音處理、儀器儀表、通信、多媒體及軍事等領(lǐng)域。

在眾多以PC機(jī)為終端的數(shù)據(jù)采集和控制系統(tǒng)中,由于通信協(xié)議的嚴(yán)格性導(dǎo)致外圍的微處理器除需完成數(shù)據(jù)采集、控制等工作外,還需要擔(dān)負(fù)起與PC主機(jī)通信、傳遞數(shù)據(jù)等任務(wù)。這種負(fù)擔(dān)在高速的數(shù)據(jù)采集中顯得就更為突出。解決的方法多數(shù)是增加專用于主機(jī)通信的器件。'54x由于集成了眾多強(qiáng)大的功能,不僅可以實(shí)現(xiàn)高速數(shù)據(jù)采集和控制,幾乎還可以完成不增加負(fù)擔(dān)地與主機(jī)進(jìn)行通信。

1 '54x的主要特點(diǎn)

以高速、低功耗為特征的'54x系列采用了先進(jìn)的改進(jìn)型哈佛結(jié)構(gòu),具有分離的數(shù)據(jù)總線和程序總線,片內(nèi)集成了ROM、RAM和多個(gè)外設(shè),如通用I/O口、定時(shí)器、時(shí)鐘發(fā)生器、軟件可編程等待狀態(tài)發(fā)生器、可編程塊切換邏輯、串行口、直接存儲(chǔ)器存取控制器(DMA)和與外部處理器通信用的主機(jī)接口(HPI,Host Port Interface)。

2 '54x的主機(jī)接口(HPI)

'54x中的主機(jī)接口(HPI)主要有三種:標(biāo)準(zhǔn)8位HPI-8接口、增強(qiáng)型8位HPI-8接口和16位HPI-16接口。其中'542~'549內(nèi)含標(biāo)準(zhǔn)型HPI-8,'5402、'5410內(nèi)含增強(qiáng)型HPI-8,'5410以上為HPI-16;而'5409、'5416的HPI可以由用戶設(shè)置為增強(qiáng)型HPI-8或HPI-16、增強(qiáng)型比標(biāo)準(zhǔn)型更優(yōu)越之處主要在于,增強(qiáng)型允許主機(jī)訪問(wèn)DSP內(nèi)部的所有片內(nèi)RAM,而標(biāo)準(zhǔn)型只能訪問(wèn)RAM區(qū)中指定的2K字。

以TMS320VC5410(簡(jiǎn)稱為'5410)包含的增強(qiáng)型HPI-8接口為例,它與外部主機(jī)或微處理器的連接如圖1所示,其具有單獨(dú)的8根數(shù)據(jù)線HD0~HD7和10根控制線??刂菩盘?hào)的時(shí)序邏輯如圖2所示。主機(jī)主動(dòng)通過(guò)HPI口訪問(wèn)DSP,除了對(duì)主機(jī)發(fā)中斷(通過(guò)置HPIC寄存器的HINT位,可以使HINT線有效)或清除主機(jī)發(fā)來(lái)的中斷(通過(guò)清HPIC寄存器的DSPINT標(biāo)志)需要DSP干涉外,'5410的CPU幾乎不用進(jìn)行其他操作,片內(nèi)的DMA通道會(huì)自動(dòng)輔助完成RAM區(qū)和HPI數(shù)據(jù)寄存器的數(shù)據(jù)傳輸。主機(jī)由HCNTL0/1線來(lái)確定選擇HPI的某個(gè)控制寄存器,如表1所列。通過(guò)對(duì)這4個(gè)寄存器的訪問(wèn),就可以在所設(shè)安全機(jī)制的允許范圍下讀/寫(xiě)DSP的所有或部分片內(nèi)RAM。

表1 HCNTL0/1的選擇功能描述

HCNTL1HCNTL0描 述
00主機(jī)讀/寫(xiě)HPI控制寄存器--HPIC
01主機(jī)以地址自動(dòng)增的模式讀/寫(xiě)HPI數(shù)據(jù)鎖存器--HPID。若為讀操作,則HPI地址寄存器HPIA每次自動(dòng)讀后增一單元;若為寫(xiě)操作,則HPIA自動(dòng)寫(xiě)增1
10主機(jī)讀/寫(xiě)HPI地址寄存器--HPIA,該地址指向'54x的片內(nèi)RAM地址
11主機(jī)讀/寫(xiě)HPI數(shù)據(jù)鎖顧器--HPID,HPIA不變

由于DSP最小的存儲(chǔ)單位是字(16位),因此對(duì)于HPI-8,每個(gè)的傳遞必須要有2個(gè)傳遞周期才能完成。HBLL信號(hào)用于區(qū)分傳遞的字節(jié)是當(dāng)前字的第一字節(jié)還是第二字節(jié)。通過(guò)設(shè)置HPIC寄存器的BOB位,可以決定第一字節(jié)是這個(gè)字的高字節(jié)還是低字節(jié)。

通過(guò)HPI實(shí)現(xiàn)程序下載屬于'5410程序加載的五種途徑之一。在需要與主機(jī)連接的應(yīng)用設(shè)計(jì)中,采用HPI程序加載方式可以使電路設(shè)計(jì)簡(jiǎn)化,省去外部并行或串行的ROM或FLASH程序存儲(chǔ)器。

3 增強(qiáng)型HPI-8與主機(jī)并口的連接

'5410具有C54x系列的大部分特點(diǎn),它包括3個(gè)多通道緩沖串口(McBSP)六通道DMA、8位增強(qiáng)型主機(jī)接口HPI-8、增強(qiáng)型外部并行接口(XIO2)、16K字的片內(nèi)ROM、56K字的片內(nèi)RAM等,可以說(shuō)是一個(gè)功能強(qiáng)大的微處理器。

在實(shí)現(xiàn)DSP與計(jì)算機(jī)主機(jī)的并口通信時(shí),將主機(jī)并口的工作模式設(shè)置在擴(kuò)展功能(ECP)模式下,在通信速率要求不高的場(chǎng)合,可以將其設(shè)置為PS/2模式。PS/2模式是在SPP基礎(chǔ)上擴(kuò)展的雙向傳輸模式,以字節(jié)為單位讀/寫(xiě)數(shù)據(jù)。

在一些DSP與主機(jī)并口通信的設(shè)計(jì)中,采用了CPLD來(lái)產(chǎn)生接口時(shí)序,這種方式除了加大電路成本外,還給設(shè)計(jì)增加了復(fù)雜度。事實(shí)上,利用幾個(gè)簡(jiǎn)單的邏輯門(mén)就可以實(shí)現(xiàn)DSP與主機(jī)的并口通信。

對(duì)于DB25的主機(jī)并口線,Data0~Data7作為雙作為HDS1控制信號(hào),AudoFd、SelechIn分別作為HCNTL0/1信號(hào)。Init作為HR/W控制信號(hào)。HBIL信號(hào)由Strobe信號(hào)觸發(fā)J-K觸發(fā)器翻轉(zhuǎn)??紤]到HPI的程序加載功能,利用J-K觸發(fā)器將SelectIn和AutoFd信號(hào)邏輯組合得到對(duì)DSP的RESET復(fù)位控制。另外,'5410的I/O口線為3.3V CMOS電壓,而并口則通常為5 V TTL電壓。因此,為達(dá)到電平匹配,在兩級(jí)之間增加了電壓轉(zhuǎn)換的緩沖器SN74LVC245。具體電路設(shè)計(jì)如圖5所示。

HCNTL0/1的狀態(tài)變化規(guī)則如圖4所示。可以看出,只有當(dāng)HCNTL1為1,HCNTL0由0變1時(shí),才會(huì)觸發(fā)復(fù)位狀態(tài)的翻轉(zhuǎn)。所以,當(dāng)需要從寄存器HPIA切換到非增HPID時(shí),為避免觸發(fā)復(fù)位狀態(tài)翻轉(zhuǎn),HCNTL1/HCNTL0應(yīng)以10-00-01-10的方式進(jìn)行轉(zhuǎn)換。

4 程序設(shè)計(jì)

4.1 主機(jī)程序

主機(jī)程序主要完成HPI寄存器的選擇、時(shí)序的構(gòu)建和數(shù)據(jù)讀/寫(xiě)等。限于篇幅,此處只列舉主機(jī)讀DSP片內(nèi)RAM存儲(chǔ)區(qū)的時(shí)序構(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é))。

/*讀/寫(xiě)HPI寄存器,讀/寫(xiě)的'字'存放在*data和*(data+),

r_w為0時(shí)代表寫(xiě),為1時(shí)代表讀。*/

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ī)寫(xiě)

ChangeCONTROL(0x09|CRW);

else if(strcmp(reg,"HPID_n"= =0) //主機(jī)寫(xiě)

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

}

/*開(kāi)始時(shí)序的準(zhǔn)備*/

while((_inp(p_STATUS)&0x08)!=0); //等待HBIL=0

//(lst byte)

if(r_w)//讀

{

//在HPIR/W的上升沿對(duì)數(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的上升沿對(duì)數(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//寫(xiě){(略)}

}

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

{

HPIA=resultAddr++;//resultAdd:要讀取的RAM數(shù)//據(jù)區(qū)起始地址

WriteHPIreg("HPIA",HPIA);

while((_inp(p_STATUS)&0x40)!=0);//等待DSP發(fā)//送HINT有效信號(hào)(握手信號(hào))

//調(diào)用讀RAM區(qū)數(shù)據(jù)的函數(shù),并寫(xiě)入創(chuàng)建的文件data.dat

WriteHPIreg("HPIC",0x0808); //清HINT中斷

WriteHPIreg("HPIC",0x0404); //主機(jī)發(fā)送DSINT有//效給DSP(握手信號(hào))

}

WriteHPIreg("HPIC",0x0808); //清NINT中斷

}

試驗(yàn)證明,主機(jī)并口的讀取速度遠(yuǎn)低于DSP的執(zhí)行速度,因此,程序子函數(shù)中的一些等待查詢指令可替略。在主函數(shù)main()中,如果讀取的DSP數(shù)據(jù)是靜態(tài)的,不需實(shí)時(shí)提供,則這樣的指令也可以省略。

4.2 DSP的握手程序

在實(shí)際情況中,需要傳遞的數(shù)據(jù)大都由DSP實(shí)時(shí)處理得到。一邊處理一邊傳輸可以大大提高系統(tǒng)的整體效率,而且由于HPI工作的特點(diǎn),傳輸幾乎可以不占用DSP的時(shí)間。唯一需要DSP干預(yù)的是數(shù)據(jù)準(zhǔn)備好后通知主機(jī)接收(通過(guò)HINT中斷)。這項(xiàng)任務(wù)可以放大DSP的DSPINT中斷服務(wù)程序中進(jìn)行其程序簡(jiǎ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)閉計(jì)時(shí)器

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有效信號(hào),告知第一個(gè)數(shù)已準(zhǔn)備就緒

rsbx intm ;開(kāi)啟中斷

wait: b wait ;主程序(此處為死循環(huán))

hpi: stm #0ah,hpic ;當(dāng)主機(jī)取完數(shù)后置DSPINT

;位,進(jìn)入DSPINT中斷服務(wù)程序

rete ;DSP向主機(jī)發(fā)送NINT握手

;信號(hào),通知下一個(gè)數(shù)已準(zhǔn)備好

.end



評(píng)論


技術(shù)專區(qū)

關(guān)閉