天天看點

C64X DSP EDMA小結及執行個體詳解

 1)EDMA概要

         ①EDMA資料傳輸有兩種發起方式:

       ü  CPU發起的EMDA資料傳輸(非同步方式):需要傳輸時,CPU設定ESR寄存器的相應位為1,進而觸發一個EDMA事件的産生,事件對應的通道參數被送往位址硬體并且完成相應的處理,這種非同步方式的實時資料傳輸無需設定EER寄存器;

 ü        事件觸發方式EDMA資料傳輸(同步方式):ER寄存器儲存外設發送過來的事件,一旦CPU設定EER寄存器的相應位為1後,ER中的事件才會送出給事件編碼器(Event Encoder),并且進一步引起相關的傳輸參數的發送給位址産生硬體;如果EER中對應于某事件的位沒有置1,則ER寄存器中的事件将保留,一旦置1則觸發EDMA的傳輸,這種特性可以應用到EDMA Chain傳輸,需要EER和CCER結合使用;

(2)EDMA資料傳輸類型:

EDMA有兩種類型的資料傳輸:1D和2D的(OPT.2DS和OPT.DDS标示源位址和目的位址的資料傳輸類型,即有4種組合方式);資料的維數表明了資料的組成方式:

①1D資料

資料組成是“塊->幀->元素”;一個塊中的每幀資料是獨立處理(即可以了解亦為2D資料,但是第二維永遠是1),每次處理是一個元素,是以一幀中的資料元素可以是在同一個記憶體位址、連續的位址或者是與同一幀中的前面的資料元素位址具有一定偏移(Offset,由ELEIDX通道參數指定)的某位址;不同幀之間的記憶體位址偏移由FRMIDX通道參數指定(兩幀的第一個元素之間的偏移或者後一幀的第一個元素的位址與前一幀的最後一個元素位址的偏移,具體依賴于通道參數FS的設定);每幀的資料元素個數可以不同,由通道參數ELECNT指定,傳完一幀資料後由ELERLD重新載入塊中的下一幀的資料元素個數ELECNT;塊中的幀的個數由通道參數FRMCNT指定;

1D資料傳輸有兩種同步方式:OPT.FS=0,元素同步方式;OPT.FS=1,幀同步方式;

元素同步時,一次同步事件引起一幀中的一個元素的傳輸,每傳輸一次ELECNT遞減1;當同步事件觸發時,ELECNT=1表明是一幀的最後一個資料元素,此時EDMA控制器除了完成最後這個元素的傳輸外,還需要重新載入ELECNT(通過ELERLD)并且FRMCNT遞減1;ELEIDX表示元素之間的偏移,FRMIDX表示一幀的最後一個元素和下一幀的第一個元素之間的偏移;如果OPT.LINK=1時,傳輸完成中斷産生(FRMCNT=0)就重新從PRAM中載入目前通道的其他參數;

幀同步時,一次同步事件引起一幀資料的傳輸,FRMIDX表示兩幀的第一個元素之間的偏移;

② 2D資料

資料組成為“塊->數組->元素”,同一數組中的元素是連續存放的,是以ELEIDX無意義;數組中的元素素引表示2D的第一維,塊中的數組索引表示2D的第二維;FRMIDX的值依賴于OPT.FS的設定;

OPT.FS=0:表示一次同步事件傳輸一個數組,此時FRMIDX是數組首位址之間的偏移;每傳完一個數組,FRMCNT遞減1;當OPT.LINK=1并且FRMCNT遞減至0時,從PRAM的中重新載入目前通道的其他參數;       

OPT.FS=1:表示一次同步事件傳輸一個塊;FRMIDX表示前一個數組的最後一個元素的位址與後一個數組的第一個元素的位址之間的偏移;如果OPT.LINK等于1,則當整塊資料傳完時,重新從PRAM中為目前通道載入新的參數;

(3)EDMA傳輸過程的源/目的位址的修改

         在每次同步事件觸發EDMA資料傳輸,并且傳輸完成後,需要對源/目的位址進行更新;位址的更新方式由SUM/DUM進行設定,并且和2DS、2DD以及FS是密切相關的;

(4)資料元素大小和對齊方式

         源/目的位址是在元素大小的邊界對齊的,是以要注意指向源/目的位址的指針的類型需要和OPT.ESIZE比對;

(5)FRMCNT和ELEMCNT的更新       

QUESTION:每次進行計數更新時,ELERLD的值哪裡來的?

(6)EDMA Linking Transfer

         當傳輸完成時(根據目前通道參數設定已經傳完所有資料了,具體條件如下表所示),并且OPT.LINK=1,EDMA控制器會根據通道參數LINK(非OPT.LINK,16bits)從PaRAM中的其他位置(以24個位元組對齊,因為通道參數為6WORD)重新載入目前傳輸通道的參數;可以連結到一個空的通道參數集(NULL Parameter)來停止EDMA傳輸,也可以自連結(用于循環緩沖處理或者重複的資料傳輸);Linking過程中不對相關寄存器作判定;

(7)EDMA中斷

         C64X DSP的EDMA控制器的所有64個通道隻産生一種中斷:EDMA_INT。如果需要讓第n個EDMA通道(或者QDMA請求)可以在傳輸完成時可以産生中斷通知CPU的話,應該如下設定:

 u      OPT.TCINT=1:表示啟用傳輸完成中斷

      u OPT.TCC=n:在傳輸完成時,CIPR[TCC]=1,用于标記對應通道的傳輸完成,即便對應的CIER位沒有啟動,傳輸完成事件還是會在CIPR記錄,即挂起的含義所在;

 u      OPT.CIER[n]=1:表示立即允許挂起的第n個通道傳輸完成事件觸發EDMA_INT中斷發送給CPU;

其中,TCC用于表示的通道的位數不夠時,可以擴充使用TCCM(即TCCM:TCC),CIPR和CIER均由兩個寄存器組成:CIPRL+CIPRH以及CIERL+CIERH。

中斷服務例程ISR讀取CIPR,确定哪一個通道完成了資料傳輸,進行相應的處理。ISR在進行處理之前需要清除CIPR中确定了通道的位(寫入1到相關位清除,寫入0不起作用),目的是記錄以後的傳輸完成事件的發生。在中斷服務例程對某通道的傳輸完成中斷進行服務後,因為期間有可能有其他通道傳輸完成了,也已經設定了CIPR中的相應位,或者也有可能本來有好幾個中斷挂起了并且現在觸發了,是以中斷服務例程必須檢查所有的CIPR并全部完成中斷服務才行。當CIPR[n]&CIER[n]=1時,則設定對應的IFR為1,防止在退出ISR時丢失中斷并且使得可以多次調用ISR。中斷服務例程的一個任務是清除CIPR和CIER中的與通道對應的位。

C64X DSP除了傳輸完成中斷外,還有交替性傳輸完成中斷,即在傳輸過程中完成一個傳輸子過程(如傳完一個資料元素、傳完一個幀/數組資料;2D幀同步傳輸沒有交替性傳輸完成中斷)給CPU發送一個中斷,相應的設定由OPT.ATINT、OPT.ATCC設定,處理過程和傳輸完成中斷雷同,差別隻是在傳輸還沒全部完成的過程中進行中斷處理而已。       

這是使用BIOS和CSL LIB 作EDMA簡單例子. 在CCS BIOS 中需要作 中斷--EDMA--edmaHwi 的設定. Spru234 和 spra636a 都是有用的參考

解釋見注釋.

void main()

{

    initEdma(); //Edma 初始化

    initHwi(); //中斷初始化

    EDMA_setChannel(hEdma); //開始EDMA傳送

    while (1) {}

}

void initEdma(void)

{

EDMA_Config gEdmaConfig; //EDMA設定表

hEdma = EDMA_open(EDMA_CHA_ANY, EDMA_OPEN_RESET); //

gXmtTCC = EDMA_intAlloc(-1); //配置設定一個可用的TCC

.... //根據實際需要填寫EDMA設定表

EDMA_config(hEdma, &gEdmaConfig); 設定EDMA通道

hEdmaReload = EDMA_allocTable(-1); //得到EDMA重載标實 EDMA_config(hEdmaReload, &gEdmaConfig); // 設定EDMA重載通道

EDMA_link(hEdma, hEdmaReload); //設定EDMA重載

EDMA_link(hEdmaReload, hEdmaReload); //設定EDMA重載

EDMA_intClear(gXmtTCC); // 清除可能的EDMA中斷

EDMA_intEnable(gXmtTCC); // 打開EDMA中斷

EDMA_intHook(gXmtTCC, edmaHwi); //通知系統edmaHwi是中斷服務者

}

void edmaHwi(int tcc)  //中斷服務

{

。。。。//準備資料

EDMA_setChannel(hEdma); //再次開始EDMA傳送

}