關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > ‘54x系列DSP與計算機并口通信的設計方案

        ‘54x系列DSP與計算機并口通信的設計方案

        作者: 時間:2016-12-22 來源:網絡 收藏

        http://www.104case.com/article/201612/332848.htm

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

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

        1 '54x的主要特點

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

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

        '54x中的主機接口(HPI)主要有三種:標準8位HPI-8接口、增強型8位HPI-8接口和16位HPI-16接口。其中'542~'549內含標準型HPI-8,'5402、'5410內含增強型HPI-8,'5410以上為HPI-16;而'5409、'5416的HPI可以由用戶設置為增強型HPI-8或HPI-16、增強型比標準型更優越之處主要在于,增強型允許主機訪問DSP內部的所有片內RAM,而標準型只能訪問RAM區中指定的2K字。

        以TMS320VC5410(簡稱為'5410)包含的增強型HPI-8接口為例,它與外部主機或微處理器的連接如圖1所示,其具有單獨的8根數據線HD0~HD7和10根控制線。控制信號的時序邏輯如圖2所示。主機主動通過HPI口訪問DSP,除了對主機發中斷(通過置HPIC寄存器的HINT位,可以使HINT線有效)或清除主機發來的中斷(通過清HPIC寄存器的DSPINT標志)需要DSP干涉外,'5410的CPU幾乎不用進行其他操作,片內的DMA通道會自動輔助完成RAM區和HPI數據寄存器的數據傳輸。主機由HCNTL0/1線來確定選擇HPI的某個控制寄存器,如表1所列。通過對這4個寄存器的訪問,就可以在所設安全機制的允許范圍下讀/寫DSP的所有或部分片內RAM。

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

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

        由于DSP最小的存儲單位是字(16位),因此對于HPI-8,每個的傳遞必須要有2個傳遞周期才能完成。HBLL信號用于區分傳遞的字節是當前字的第一字節還是第二字節。通過設置HPIC寄存器的BOB位,可以決定第一字節是這個字的高字節還是低字節。

        通過HPI實現程序下載屬于'5410程序加載的五種途徑之一。在需要與主機連接的應用設計中,采用HPI程序加載方式可以使電路設計簡化,省去外部并行或串行的ROM或FLASH程序存儲器

        3 增強型HPI-8與主機并口的連接

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

        在實現DSP與計算機主機的并口通信時,將主機并口的工作模式設置在擴展功能(ECP)模式下,在通信速率要求不高的場合,可以將其設置為PS/2模式。PS/2模式是在SPP基礎上擴展的雙向傳輸模式,以字節為單位讀/寫數據。

        在一些DSP與主機并口通信的設計中,采用了CPLD來產生接口時序,這種方式除了加大電路成本外,還給設計增加了復雜度。事實上,利用幾個簡單的邏輯門就可以實現DSP與主機的并口通信。

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

        HCNTL0/1的狀態變化規則如圖4所示。可以看出,只有當HCNTL1為1,HCNTL0由0變1時,才會觸發復位狀態的翻轉。所以,當需要從寄存器HPIA切換到非增HPID時,為避免觸發復位狀態翻轉,HCNTL1/HCNTL0應以10-00-01-10的方式進行轉換。

        4 程序設計

        4.1 主機程序

        主機程序主要完成HPI寄存器的選擇、時序的構建和數據讀/寫等。限于篇幅,此處只列舉主機讀DSP片內RAM存儲區的時序構建及其與DSP間的通信握手。其中,p_DATA、p_STATUS、p_CONTROL分別代表LPT1的數據寄存器、狀態寄存器和控制寄存器。ECP擴展控制寄存器ECR的bit7~5設置為'001'。HPI的HPIC寄存器BOB位設置為'0'(第一字節為高字節)。

        /*讀/寫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)//采用自增地址主機寫

        ChangeCONTROL(0x09|CRW);

        else if(strcmp(reg,"HPID_n"= =0) //主機寫

        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); //重載函數

        //ChangCONTROL(BYTE bit,BYTE bValue)

        _outp(p_CONTROL,CONTROL); //HDS1=0

        ChangeCONTROL(0,1);

        _outp(p_CONTROL,CONTROL); //HDS1=1

        }

        /*開始時序的準備*/

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

        //(lst byte)

        if(r_w)//讀

        {

        //在HPIR/W的上升沿對數據線采樣(第一字節)

        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,繼續

        ChangeCONTROL(0,1);

        outp(pCONTROL,CONTROL);//HDS1:0->1; //鎖存第1字節,然后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的上升沿對數據線采樣(第二字節)

        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繼續

        ChangeCONTROL(0,1);

        _outp(p_CONTROL,CONTROL);//HDS1:0->1; //鎖存第2字節,然后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給主機發中斷HINT(查詢方式)后,從DSP讀數*/

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

        /*讀取DSP片內RAM區數據*/

        for(i=0;i

        {

        HPIA=resultAddr++;//resultAdd:要讀取的RAM數//據區起始地址

        WriteHPIreg("HPIA",HPIA);

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

        //調用讀RAM區數據的函數,并寫入創建的文件data.dat

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

        WriteHPIreg("HPIC",0x0404); //主機發送DSINT有//效給DSP(握手信號)

        }

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

        }

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

        4.2 DSP的握手程序

        在實際情況中,需要傳遞的數據大都由DSP實時處理得到。一邊處理一邊傳輸可以大大提高系統的整體效率,而且由于HPI工作的特點,傳輸幾乎可以不占用DSP的時間。唯一需要DSP干預的是數據準備好后通知主機接收(通過HINT中斷)。這項任務可以放大DSP的DSPINT中斷服務程序中進行其程序簡要如下:

        .mmregs

        .include "vectors.h"

        dataarea .usect "COMMS",100h,1;所需傳遞的數據塊區間

        HOSTACK.macro

        hack ldm hpic,a ;累加器A載入HPIC值

        and #08h,a ;屏蔽HINT的其他位

        bc hack,aneq ;判斷HINT的狀態,直到HINT

        ;位為0(即主機清HINT標志)

        .endm

        .text

        start:stm #00a0h,pmst;設置IPTR寄存器

        stm #0000h,st0 ;設置ST0、ST1寄存器

        stm #2800h,stl

        stm #0010,tcr ;關閉計時器

        stm #0ffffh,ifr ;清除所有的中斷標志位

        stm #0300h,imr ;使能DSPINT中斷

        stm #280h,sp ;初始化堆棧指針SP為280h

        HOSTACK ;檢查主機是否清HINT標志

        stm #0ah,hpic ;置HINT位,向主機發送

        ;HINT有效信號,告知第一個數已準備就緒

        rsbx intm ;開啟中斷

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

        hpi: stm #0ah,hpic ;當主機取完數后置DSPINT

        ;位,進入DSPINT中斷服務程序

        rete ;DSP向主機發送NINT握手

        ;信號,通知下一個數已準備好

        .end



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜章县| 玉门市| 漳浦县| 永丰县| 龙海市| 上思县| 稷山县| 白银市| 璧山县| 乐山市| 文登市| 蕲春县| 江孜县| 东光县| 阳曲县| 海城市| 灌南县| 大兴区| 巨鹿县| 白银市| 荆门市| 姜堰市| 时尚| 英德市| 胶州市| 唐山市| 茌平县| 澄城县| 泰兴市| 海口市| 图片| 康保县| 政和县| 宜君县| 桃园市| 涿州市| 冀州市| 静乐县| 法库县| 清苑县| 马公市|