基于TMS320DM6437的McBSP與EDMA實(shí)現(xiàn)串口通信
一個(gè)參數(shù)RAM的長度為32個(gè)字節(jié)。首先是32 bit的可選參數(shù)OPT,對(duì)于可選參數(shù),通過對(duì)各個(gè)位置0或1設(shè)置事件優(yōu)先級(jí),數(shù)據(jù)單元大小,源地址/目的地址變更模式,傳輸結(jié)束代碼,是否使能傳輸參數(shù)鏈接(LINK)功能,同步傳輸方式等。SRC和DST為EDMA傳輸所需的源地址和目
的地址。SRCBIDX和DSTBIDX用于二維傳輸中,表示一個(gè)ARRAY的開始到下個(gè)ARRAY的開始所跨越的字節(jié)數(shù)。SRCCIDX和DSTCIDX用于三維傳輸中,一個(gè)FRAME的開始到下個(gè)FRAME的開始所跨越的字節(jié)數(shù)。BCNTRLD:三維傳輸里需要重新加載的BCNT。LINK:傳輸完成后重新加載的參數(shù)RAM地址,默認(rèn)是LINK到空參數(shù)RAM。
在此實(shí)例中采用的雙緩沖結(jié)構(gòu),即在DSP緩沖區(qū)內(nèi)開辟2塊緩沖用于并行處理FPGA通過McBSP傳過來的數(shù)據(jù)。當(dāng)EDMA往PingBuffer里傳輸數(shù)據(jù)時(shí),CPU即可處理PongBuffer里的數(shù)據(jù),當(dāng)工作完成后,彼此又交換緩沖區(qū),EDMA往PongBuffer里寫數(shù)據(jù),CPU處理PingBuffer里的數(shù)據(jù)。為了實(shí)現(xiàn)雙緩沖結(jié)構(gòu),采用了EDMA提供的LINK功能,即將不同的EDMA傳輸參數(shù)RAM鏈接起來,組成一個(gè)傳輸鏈,在傳輸鏈中,一個(gè)傳輸?shù)慕Y(jié)束會(huì)導(dǎo)致自動(dòng)從參數(shù)RAM中裝載下一個(gè)傳輸需要的事件參數(shù)。在具體程序中,只需將Ping通道的參數(shù)RAM LINK到Pong通道,同時(shí)將Pong通道的參數(shù)RAMLINK到Ping通道即可。
2.2.2 EDMA接收數(shù)據(jù)配置實(shí)現(xiàn)
開發(fā)環(huán)境采用CCS 3.3。通過調(diào)用LLD API實(shí)現(xiàn)對(duì)EDMA Driver的配置以及傳輸操作。
在使用EDMA3 Driver之前必須首先對(duì)其進(jìn)行初始化。EDMA3 LLD提供了2個(gè)API進(jìn)行相關(guān)工作。EDMA3_DRV_create和EDMA3_DBV_open。前者用于創(chuàng)建一個(gè)EDMA3 Driver對(duì)象,后者用于開啟對(duì)應(yīng)的EDMA3 Driver通道。
創(chuàng)建并開啟EDMA3 Driver通道后,即可為此通道分配資源以及初始化其配置。首先調(diào)用EDMA3_DRV_requestChannel請(qǐng)求分配一個(gè)DMA通道,隨后對(duì)該通道的參數(shù)RAM進(jìn)行配置,以滿足傳輸需要。EDMA3_DRV_setSrcParams用于設(shè)置該EDMA通道接收數(shù)據(jù)源地址為McBSPO的DRR寄存器,地址為0x01D00000,地址計(jì)數(shù)模式為遞增模式。EDMA3_DRV_setDestParams設(shè)置該EDMA通道接收數(shù)據(jù)目的地址為DSP片內(nèi)存儲(chǔ)區(qū)PingBuf-fer首地址,確保第一次傳輸數(shù)據(jù)是到PingBuffer,地址計(jì)數(shù)模式同樣為遞增模式。EDMA3_DRV_setSrcIndex用于配置源地址計(jì)數(shù)索引值,由于源地址為McBSPO的DRR寄存器,固定不變,所以srcBidx=0,srcCidx=0。接著調(diào)用EDMA3_DRV_setDestIndex配置目的地址計(jì)數(shù)索引值,由于接收數(shù)據(jù)為32 bits,所以sreBidx=srcCidx=4,這是因?yàn)镈SP內(nèi)的最小計(jì)數(shù)單元為一個(gè)字節(jié),8bit。EDMA3_DRV_setTransferPamms配置剩余的參數(shù)RAM傳輸參數(shù),包括設(shè)置ACNT=4,BCNT=2 048,CCNT=1,采用一維傳輸A-SYNC。
接下來是Ping/Pong傳輸?shù)某绦驅(qū)崿F(xiàn)。需再調(diào)用EDMA3_DRV_requestChannel兩次,替Ping/Pong各自分配一個(gè)通道,于是,一共有3個(gè)通道,對(duì)應(yīng)3個(gè)參數(shù)RAM。Ping通道的參數(shù)RAM與主通道的參數(shù)RAM完全一致,Pong通道的參數(shù)RAM與主通道相比,只需將Pong通道接收數(shù)據(jù)目的地址改為PongBuffer首地址。隨后調(diào)用EDMA3_DRV_linkChannel 3次,分別將主通道和Ping通道LINK,Ping通道和Pong通道相互LINK。
2.2.3 EDMA中斷實(shí)現(xiàn)
結(jié)合DSP/BIOS設(shè)置了EDMA中斷,以便在一個(gè)接收Buffer被填滿時(shí),產(chǎn)生的EDMA中斷可通知DSP處理該Buffer的數(shù)據(jù)。
TMS320DM6437中,EDMA的128個(gè)通道只產(chǎn)生一種中斷,當(dāng)一個(gè)通道傳輸完成后,IPR(Interrupt Pending Register)寄存器里的相應(yīng)位會(huì)被置1,EDMA中斷處理器通過查詢IPR寄存器確定是哪個(gè)通道完成了傳輸,并調(diào)用相應(yīng)的中斷服務(wù)程序。
EDMA LLD中中斷的設(shè)置通過調(diào)用EDMA3_DRV_requestChannel實(shí)現(xiàn)。該函數(shù)的參數(shù)中跟中斷有關(guān)的為eventQ(與通道優(yōu)先級(jí)相關(guān)),tceCb(回調(diào)函數(shù),即通道傳輸完成后所調(diào)用的中斷服務(wù)程序)。本例中,設(shè)置eventQ=0,保證最高優(yōu)先級(jí),tceCb=edma_isr,該函數(shù)的作用是在通道傳輸完成后發(fā)送一個(gè)旗語信號(hào)給信號(hào)處理程序,通知其對(duì)收到的數(shù)據(jù)進(jìn)行處理。此外,還需調(diào)用EDMA3_DRV_setOptField將參數(shù)RAMOPT參數(shù)中TCINTEN位置1,以使能EDMA中斷。隨后,利用DSP/BIOS將EDMA中斷源和DSP的可屏蔽中斷5連接起來,具體參數(shù)在DSP/BIOS配置文件中的HWI模塊設(shè)置,如圖3所示。本文引用地址:http://butianyuan.cn/article/150982.htm
最后,由于選用了TMS320DM6437的可屏蔽中斷5,還需使能IER寄存器里的對(duì)應(yīng)位,C64_enableIER(C64_EINT5)。
2.2.4 EDMA發(fā)送數(shù)據(jù)配置實(shí)現(xiàn)
EDMA發(fā)送數(shù)據(jù)程序流程和接收數(shù)據(jù)程序流程大略一致,但較為簡單。只需請(qǐng)求一個(gè)EDMA傳輸通道,配置其源地址為DSP內(nèi)部存放FPGA所需數(shù)據(jù)內(nèi)存首地址,目的地址為McBSP的DXR寄存器。其余參數(shù)和EDMA接收數(shù)據(jù)通道參數(shù)相同。
3 實(shí)現(xiàn)結(jié)果
配置好MeBSP和EDMA后,啟動(dòng)FPGA傳輸數(shù)據(jù),DSP做好接收和發(fā)送數(shù)據(jù)的準(zhǔn)備,實(shí)驗(yàn)中,F(xiàn)PGA連續(xù)不斷地發(fā)送自加地?cái)?shù)給DSP,而DSP只發(fā)送2048個(gè)32 bit的從0開始的自加數(shù)據(jù)給FPGA。實(shí)驗(yàn)結(jié)果表明,DSP內(nèi)部的PingBuffer區(qū)和PongBuffer區(qū)能連續(xù)不斷的收到FPGA傳輸過來的數(shù)
據(jù)。某一時(shí)刻的PingBuffer區(qū)和PongBuffer區(qū)內(nèi)部數(shù)據(jù)如圖4所示,能看出實(shí)驗(yàn)實(shí)現(xiàn)了上述功能。
評(píng)論