基于TMS320DM6437的McBSP與EDMA實(shí)現(xiàn)串口通信
TMS320DM6437是專(zhuān)為高性能、低成本視頻應(yīng)用開(kāi)發(fā)的,主頻600 MHz,32位定點(diǎn),采用達(dá)芬奇(DaVinci(TM))技術(shù)。該器件采用TI第3代超長(zhǎng)指令集結(jié)構(gòu)(VelociTI.3)的TMS320C64x+DSP內(nèi)核,主頻可達(dá)600 MHz,支持8個(gè)8位或4個(gè)16位并行MAC運(yùn)算,峰值處理能力高達(dá)4 800MIPS?;赥MS320DM6437諸多特點(diǎn),這里提出一種實(shí)現(xiàn)DSP與FPGA的雙向數(shù)據(jù)交換設(shè)計(jì)方案,采用TMS320DM6437的McBSP和EDMA實(shí)現(xiàn)異步串口通信。 McBSP接口是全雙工串行接口,提供收發(fā)數(shù)據(jù)雙緩沖以處理連續(xù)的數(shù)據(jù)流,并可獨(dú)立配置收發(fā)部分,接收和發(fā)送都可使用獨(dú)立的幀信號(hào)和時(shí)鐘源。TMS320DM6437有2個(gè)獨(dú)立的McBSP接口(McBSP0和McBSPl)。EDMA可處理該處理器上所有內(nèi)存單元和外設(shè)的數(shù)據(jù)傳輸,且不占用DSP時(shí)鐘周期,EDMA還提供針對(duì)McBSP的同步事件,可方便控制數(shù)據(jù)傳輸。接收數(shù)據(jù)時(shí),F(xiàn)PGA的數(shù)據(jù)通過(guò)McBSP傳到DSP的DRR寄存器中,觸發(fā)McBSP接收同步事件,EDMA將數(shù)據(jù)搬入DSP內(nèi)存。發(fā)送數(shù)據(jù)時(shí),當(dāng)EDMA從DSP內(nèi)存中將數(shù)據(jù)搬入DSP的DXR寄存器時(shí),利用McBSP發(fā)送同步事件,將數(shù)據(jù)傳輸給FPGA。
1 硬件接口電路設(shè)計(jì)
McBsP接口的硬件連接如圖1所示。DSP的McBSP接口可由內(nèi)部時(shí)鐘發(fā)生器或外部器件提供收/發(fā)時(shí)鐘信號(hào)(CLKR/CLKX)及收/發(fā)幀同步信號(hào)(FSR/FSX)。為了簡(jiǎn)化FPGA內(nèi)部時(shí)序,以上信號(hào)均由FPGA提供。圖1中的EN_IN、EN_OUT為DSP控制FPGA中McBSP接口的使能信號(hào),它們均與DSP的GPIO相連。當(dāng)EN_IN為高時(shí),F(xiàn)PGA接收DSP的數(shù)據(jù);當(dāng)EN_OUT為高時(shí),F(xiàn)PGA開(kāi)始向DSP發(fā)送數(shù)據(jù)。
2 軟件程序設(shè)計(jì)
傳統(tǒng)的C6000型DSP對(duì)McBSP和EDMA進(jìn)行操作時(shí),多使用TI公司提供的CSL(Chip Support Library)進(jìn)行編程操作,由于TMS320DM6437不支持CSL,而是改用PSP(Proeessor Support Package),所以對(duì)TMS320DM6437 McBSP接口采用PSP提供的McBSP Driver,主要用McBSP Driver提供的LLC層API進(jìn)行編程。LLC層提供基于不同平臺(tái)的驅(qū)動(dòng)核心抽象。在該層可進(jìn)行寄存器操作,宏定義,并且底層API可直接與硬件通信。
對(duì)應(yīng)的EDMA程序開(kāi)發(fā)則采用EDMA LLD(EDMA low Level Driver)提供的各種庫(kù)進(jìn)行編程。LLD實(shí)際上包含2個(gè)庫(kù)用于管理EDMA外設(shè):一個(gè)是EDMA RM(EDMA Resource Manager),管理所有的EDMA硬件資源以及中斷;另一個(gè)是EDMA DRV(EDMA Driver),完成所有EDMA相關(guān)配置,并且通過(guò)RM滿足資源需求。當(dāng)調(diào)用DRV層API進(jìn)行操作時(shí),實(shí)際上是通過(guò)DRV層API調(diào)用RM層API來(lái)對(duì)EDMA外設(shè)寄存器進(jìn)行直接操作來(lái)配置EDMA硬件。
本例中實(shí)現(xiàn)DSP和FPGA通信時(shí),McBSP所需的幀同步信號(hào)以及時(shí)鐘信號(hào)均由FPGA產(chǎn)生,McBSP發(fā)送過(guò)來(lái)32 bit的數(shù)據(jù),DSP內(nèi)部采用EDMA方式接收數(shù)據(jù),McBSP接收同步事件觸發(fā)EDMA傳輸。將數(shù)據(jù)放入DSP片內(nèi)二級(jí)存儲(chǔ)器的緩沖區(qū),等待DSP處理。為了保證后寫(xiě)入的數(shù)據(jù)不會(huì)覆蓋先寫(xiě)入的還沒(méi)來(lái)得及被DSP處理的數(shù)據(jù),片內(nèi)二級(jí)存儲(chǔ)器緩沖區(qū)采用乒乓緩沖結(jié)構(gòu)。同樣,DSP發(fā)送32bit數(shù)據(jù)給FPGA時(shí),也是通過(guò)EDMA方式,由McBSP發(fā)送同步事件觸發(fā)EDMA傳輸。
2.1 McBSP配置
McBSP的開(kāi)啟以及參數(shù)配置均采用LLC提供的API以及數(shù)據(jù)結(jié)構(gòu)完成。但是因?yàn)門(mén)MS320DM6437的引腳多采用引腳復(fù)用,并且GPIO和McBSP引腳復(fù)用到一起,由于本例中McBSP幀同步信號(hào)是由外部源產(chǎn)生,為了保證能監(jiān)測(cè)到第一個(gè)幀同步信號(hào),需先在PINMUX寄存器里將復(fù)用的引腳配置成GPIO模式,等檢測(cè)到幀同步信號(hào)后,再將復(fù)用的引腳恢復(fù)成McBSP模式。
2.1.1 接收數(shù)據(jù)格式配置
McBSP接收數(shù)據(jù)格式在數(shù)據(jù)結(jié)構(gòu)LLC_RcvDataSetup中設(shè)置,該數(shù)據(jù)結(jié)構(gòu)在McBSP Driver提供的頭文件llc_mcbsp Type.h中定義,在編譯工程文件的時(shí)候需包含此頭文件。接收數(shù)據(jù)為單幀數(shù)據(jù),一個(gè)數(shù)據(jù)幀長(zhǎng)度為4個(gè)字節(jié),采用幀同步信號(hào)檢測(cè)模式,不進(jìn)行壓縮,數(shù)據(jù)傳輸延遲一個(gè)比特,采用McBSP同步事件產(chǎn)生中斷。McBSP發(fā)送數(shù)據(jù)格式在數(shù)據(jù)結(jié)構(gòu)LLC_XmitDatasetup中設(shè)置,具體參數(shù)和接收數(shù)據(jù)格式保持一致。M-cBSP幀同步和時(shí)鐘參數(shù)在數(shù)據(jù)結(jié)構(gòu)LLC_mcbspClkSetup中設(shè)置,該結(jié)構(gòu)同樣在頭文件llc_mcbspType.h中定義。本例中,發(fā)送和接收的幀同步信號(hào)以及時(shí)鐘源都由外部產(chǎn)生,接收和發(fā)送幀同步都是高電平有效,接收時(shí)鐘上升沿有效,發(fā)送時(shí)鐘下降沿有效,幀同步脈沖寬度為1bit,脈沖周期為32 bit。
2.1.2 啟動(dòng)McBSP
首先調(diào)用MeBSP LLC層API對(duì)McBSP接口進(jìn)行設(shè)置,準(zhǔn)備接收FPGA傳輸過(guò)來(lái)的信號(hào)。先調(diào)用函數(shù)LLC_mcbspOpen,該函數(shù)在llc_mcbsp.c中定義,函數(shù)原型為L(zhǎng)LC_mcbspOpen(LLC_McbspObj*const pMcbspObj,Uint32InstanceId,Int32*pMcbspParam,CSL_Status*pStatus),所需參數(shù)分別為用戶定義的McBSP通道對(duì)象,McBSP通道ID,用戶定義的配置參數(shù)及狀態(tài)信息,返回參數(shù)為指向該通道的句柄hMcbsp。該句柄作為調(diào)用API的參數(shù)。
然后設(shè)置McBSP通道0,調(diào)用函數(shù)LLC_mcbspHwSetup(LLC_McbspHandle hMcbsp,const LLC_McbspHwSetup*setup)。第1個(gè)參數(shù)即為剛才返回的指向McBSP通道0的句柄,第2個(gè)參數(shù)為一個(gè)結(jié)構(gòu)體,包含了前面定義的接收和發(fā)送數(shù)據(jù)結(jié)構(gòu)以及幀同步和時(shí)鐘參數(shù)結(jié)構(gòu),這樣就按照實(shí)際應(yīng)用的要求完成了對(duì)McBSP0通道的設(shè)置。配置完成后,相應(yīng)的McBSP寄存器的值為:SPCR=0X0000400;RCR=0x00050040;XCR=0x00050040;SRGR=0x20000001;PCR=0x00000080。
最后利用函數(shù)LLC_mcbspHwControl使能McBSP接收和發(fā)送功能。函數(shù)原型為L(zhǎng)LC_mcbspHwControl(LLC_McbspHandle hMcbsp,LLC_Mcbsp ControlCmd cmd,const void*arg)。第1個(gè)參數(shù)為指向McBSP通道0的句柄,第2個(gè)參數(shù)為硬件控制命令,第3個(gè)為對(duì)特定命令的補(bǔ)充說(shuō)明。開(kāi)啟McBSP接收發(fā)送功能時(shí),硬件控制命令為L(zhǎng)LC_MCBSP_CMD_RESET_CONTROL,使能發(fā)送功能時(shí),命令補(bǔ)充說(shuō)明為L(zhǎng)LC_MCBSP_CTIRL_RX_ENABLE,使能接收功能時(shí),命令補(bǔ)充說(shuō)明為L(zhǎng)LC_MCBSP_CTRL_TX_ENABLE。
2.2 EDMA配置
2.2.1 EDMA配置原理
EDMA中傳輸?shù)臄?shù)據(jù)種類(lèi)有3種:ARRAY,BLOCK,F(xiàn)RAME,分別對(duì)應(yīng)3種不同類(lèi)型的傳輸。首先是一維傳輸,即每一個(gè)EDMA事件觸發(fā)的傳輸只傳輸一個(gè)ARRAY,該ARRAY所包含的字節(jié)數(shù)由參數(shù)RAM里的參數(shù)ACNT決定。然后是二維傳輸,每一個(gè)EDMA事件觸發(fā)傳輸一個(gè)FRAME,每個(gè)FRAME里包含的ARRAY數(shù)由參數(shù)BCNT決定。以此類(lèi)推。三維傳輸即每次傳輸一個(gè)BLOCK,每個(gè)BLOCK里包含的FRAME數(shù)由參數(shù)CCNT決定。
TMS320DM6437的EDMA共有128個(gè)參數(shù)RAM,其中存放每個(gè)EDMA通道需要的各個(gè)傳輸控制參數(shù),參數(shù)RAM的默認(rèn)對(duì)應(yīng)關(guān)系為:EDMA EVENTO對(duì)應(yīng)參數(shù)RAMO,EDMAEVENT1對(duì)應(yīng)參數(shù)RAM1,等。以此類(lèi)推。但是也可以在DCHMAPO-63寄存器里修改相應(yīng)位自行對(duì)應(yīng)。參數(shù)RAM的具體結(jié)構(gòu)如圖2所示。
[!--empirenews.page--]
一個(gè)參數(shù)RAM的長(zhǎng)度為32個(gè)字節(jié)。首先是32 bit的可選參數(shù)OPT,對(duì)于可選參數(shù),通過(guò)對(duì)各個(gè)位置0或1設(shè)置事件優(yōu)先級(jí),數(shù)據(jù)單元大小,源地址/目的地址變更模式,傳輸結(jié)束代碼,是否使能傳輸參數(shù)鏈接(LINK)功能,同步傳輸方式等。SRC和DST為EDMA傳輸所需的源地址和目
的地址。SRCBIDX和DSTBIDX用于二維傳輸中,表示一個(gè)ARRAY的開(kāi)始到下個(gè)ARRAY的開(kāi)始所跨越的字節(jié)數(shù)。SRCCIDX和DSTCIDX用于三維傳輸中,一個(gè)FRAME的開(kāi)始到下個(gè)FRAME的開(kāi)始所跨越的字節(jié)數(shù)。BCNTRLD:三維傳輸里需要重新加載的BCNT。LINK:傳輸完成后重新加載的參數(shù)RAM地址,默認(rèn)是LINK到空參數(shù)RAM。
在此實(shí)例中采用的雙緩沖結(jié)構(gòu),即在DSP緩沖區(qū)內(nèi)開(kāi)辟2塊緩沖用于并行處理FPGA通過(guò)McBSP傳過(guò)來(lái)的數(shù)據(jù)。當(dāng)EDMA往PingBuffer里傳輸數(shù)據(jù)時(shí),CPU即可處理PongBuffer里的數(shù)據(jù),當(dāng)工作完成后,彼此又交換緩沖區(qū),EDMA往PongBuffer里寫(xiě)數(shù)據(jù),CPU處理PingBuffer里的數(shù)據(jù)。為了實(shí)現(xiàn)雙緩沖結(jié)構(gòu),采用了EDMA提供的LINK功能,即將不同的EDMA傳輸參數(shù)RAM鏈接起來(lái),組成一個(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)
開(kāi)發(fā)環(huán)境采用CCS 3.3。通過(guò)調(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ì)象,后者用于開(kāi)啟對(duì)應(yīng)的EDMA3 Driver通道。
創(chuàng)建并開(kāi)啟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。
接下來(lái)是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中斷處理器通過(guò)查詢IPR寄存器確定是哪個(gè)通道完成了傳輸,并調(diào)用相應(yīng)的中斷服務(wù)程序。
EDMA LLD中中斷的設(shè)置通過(guò)調(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è)旗語(yǔ)信號(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連接起來(lái),具體參數(shù)在DSP/BIOS配置文件中的HWI模塊設(shè)置,如圖3所示。
最后,由于選用了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ù)程序流程大略一致,但較為簡(jiǎn)單。只需請(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開(kāi)始的自加數(shù)據(jù)給FPGA。實(shí)驗(yàn)結(jié)果表明,DSP內(nèi)部的PingBuffer區(qū)和PongBuffer區(qū)能連續(xù)不斷的收到FPGA傳輸過(guò)來(lái)的數(shù)
據(jù)。某一時(shí)刻的PingBuffer區(qū)和PongBuffer區(qū)內(nèi)部數(shù)據(jù)如圖4所示,能看出實(shí)驗(yàn)實(shí)現(xiàn)了上述功能。
[!--empirenews.page--]
在FPGA端監(jiān)測(cè)到DSP發(fā)送過(guò)去的數(shù)據(jù)如圖5所示,可以看出是從0開(kāi)始的連續(xù)自加數(shù)據(jù)。
本例中設(shè)置傳完2 048個(gè)數(shù)據(jù)后EDMA發(fā)送事件觸發(fā)一次中斷,調(diào)用的中斷服務(wù)程序主要作用是發(fā)送一個(gè)旗語(yǔ)信號(hào)給信號(hào)處理程序,并打印出“GOT INTO RCV ISR”,進(jìn)入中斷服務(wù)程序,隨后已被阻塞的信號(hào)處理程序線程收到旗語(yǔ)信號(hào)后,開(kāi)始運(yùn)行,并打印信息“receive rcv int”,中斷測(cè)試結(jié)果如圖6所示,可以看出中斷在連續(xù)不斷的被觸發(fā)。
4 結(jié)論
通過(guò)TMS320DM6437的McBSP和EDMA實(shí)現(xiàn)了異步串口通信,并已經(jīng)通過(guò)軟硬件調(diào)試,該部分已被實(shí)際運(yùn)用于實(shí)時(shí)數(shù)據(jù)處理中。該方法硬件部分較容易實(shí)現(xiàn),并且簡(jiǎn)單可靠,且采用EDMA方式,大大節(jié)約了CPU資源,取得了較好的效果,具有一定的應(yīng)用價(jià)值。