基于TMS320DM6437的McBSP與EDMA實現串口通信
TMS320DM6437是專為高性能、低成本視頻應用開發的,主頻600 MHz,32位定點,采用達芬奇(DaVinci(TM))技術。該器件采用TI第3代超長指令集結構(VelociTI.3)的TMS320C64x+DSP內核,主頻可達600 MHz,支持8個8位或4個16位并行MAC運算,峰值處理能力高達4 800MIPS。基于TMS320DM6437諸多特點,這里提出一種實現DSP與FPGA的雙向數據交換設計方案,采用TMS320DM6437的McBSP和EDMA實現異步串口通信。 McBSP接口是全雙工串行接口,提供收發數據雙緩沖以處理連續的數據流,并可獨立配置收發部分,接收和發送都可使用獨立的幀信號和時鐘源。TMS320DM6437有2個獨立的McBSP接口(McBSP0和McBSPl)。EDMA可處理該處理器上所有內存單元和外設的數據傳輸,且不占用DSP時鐘周期,EDMA還提供針對McBSP的同步事件,可方便控制數據傳輸。接收數據時,FPGA的數據通過McBSP傳到DSP的DRR寄存器中,觸發McBSP接收同步事件,EDMA將數據搬入DSP內存。發送數據時,當EDMA從DSP內存中將數據搬入DSP的DXR寄存器時,利用McBSP發送同步事件,將數據傳輸給FPGA。
1 硬件接口電路設計
McBsP接口的硬件連接如圖1所示。DSP的McBSP接口可由內部時鐘發生器或外部器件提供收/發時鐘信號(CLKR/CLKX)及收/發幀同步信號(FSR/FSX)。為了簡化FPGA內部時序,以上信號均由FPGA提供。圖1中的EN_IN、EN_OUT為DSP控制FPGA中McBSP接口的使能信號,它們均與DSP的GPIO相連。當EN_IN為高時,FPGA接收DSP的數據;當EN_OUT為高時,FPGA開始向DSP發送數據。
2 軟件程序設計
傳統的C6000型DSP對McBSP和EDMA進行操作時,多使用TI公司提供的CSL(Chip Support Library)進行編程操作,由于TMS320DM6437不支持CSL,而是改用PSP(Proeessor Support Package),所以對TMS320DM6437 McBSP接口采用PSP提供的McBSP Driver,主要用McBSP Driver提供的LLC層API進行編程。LLC層提供基于不同平臺的驅動核心抽象。在該層可進行寄存器操作,宏定義,并且底層API可直接與硬件通信。
對應的EDMA程序開發則采用EDMA LLD(EDMA low Level Driver)提供的各種庫進行編程。LLD實際上包含2個庫用于管理EDMA外設:一個是EDMA RM(EDMA Resource Manager),管理所有的EDMA硬件資源以及中斷;另一個是EDMA DRV(EDMA Driver),完成所有EDMA相關配置,并且通過RM滿足資源需求。當調用DRV層API進行操作時,實際上是通過DRV層API調用RM層API來對EDMA外設寄存器進行直接操作來配置EDMA硬件。
本例中實現DSP和FPGA通信時,McBSP所需的幀同步信號以及時鐘信號均由FPGA產生,McBSP發送過來32 bit的數據,DSP內部采用EDMA方式接收數據,McBSP接收同步事件觸發EDMA傳輸。將數據放入DSP片內二級存儲器的緩沖區,等待DSP處理。為了保證后寫入的數據不會覆蓋先寫入的還沒來得及被DSP處理的數據,片內二級存儲器緩沖區采用乒乓緩沖結構。同樣,DSP發送32bit數據給FPGA時,也是通過EDMA方式,由McBSP發送同步事件觸發EDMA傳輸。
2.1 McBSP配置
McBSP的開啟以及參數配置均采用LLC提供的API以及數據結構完成。但是因為TMS320DM6437的引腳多采用引腳復用,并且GPIO和McBSP引腳復用到一起,由于本例中McBSP幀同步信號是由外部源產生,為了保證能監測到第一個幀同步信號,需先在PINMUX寄存器里將復用的引腳配置成GPIO模式,等檢測到幀同步信號后,再將復用的引腳恢復成McBSP模式。
2.1.1 接收數據格式配置
McBSP接收數據格式在數據結構LLC_RcvDataSetup中設置,該數據結構在McBSP Driver提供的頭文件llc_mcbsp Type.h中定義,在編譯工程文件的時候需包含此頭文件。接收數據為單幀數據,一個數據幀長度為4個字節,采用幀同步信號檢測模式,不進行壓縮,數據傳輸延遲一個比特,采用McBSP同步事件產生中斷。McBSP發送數據格式在數據結構LLC_XmitDatasetup中設置,具體參數和接收數據格式保持一致。M-cBSP幀同步和時鐘參數在數據結構LLC_mcbspClkSetup中設置,該結構同樣在頭文件llc_mcbspType.h中定義。本例中,發送和接收的幀同步信號以及時鐘源都由外部產生,接收和發送幀同步都是高電平有效,接收時鐘上升沿有效,發送時鐘下降沿有效,幀同步脈沖寬度為1bit,脈沖周期為32 bit。
2.1.2 啟動McBSP
首先調用MeBSP LLC層API對McBSP接口進行設置,準備接收FPGA傳輸過來的信號。先調用函數LLC_mcbspOpen,該函數在llc_mcbsp.c中定義,函數原型為LLC_mcbspOpen(LLC_McbspObj*const pMcbspObj,Uint32InstanceId,Int32*pMcbspParam,CSL_Status*pStatus),所需參數分別為用戶定義的McBSP通道對象,McBSP通道ID,用戶定義的配置參數及狀態信息,返回參數為指向該通道的句柄hMcbsp。該句柄作為調用API的參數。
然后設置McBSP通道0,調用函數LLC_mcbspHwSetup(LLC_McbspHandle hMcbsp,const LLC_McbspHwSetup*setup)。第1個參數即為剛才返回的指向McBSP通道0的句柄,第2個參數為一個結構體,包含了前面定義的接收和發送數據結構以及幀同步和時鐘參數結構,這樣就按照實際應用的要求完成了對McBSP0通道的設置。配置完成后,相應的McBSP寄存器的值為:SPCR=0X0000400;RCR=0x00050040;XCR=0x00050040;SRGR=0x20000001;PCR=0x00000080。
最后利用函數LLC_mcbspHwControl使能McBSP接收和發送功能。函數原型為LLC_mcbspHwControl(LLC_McbspHandle hMcbsp,LLC_Mcbsp ControlCmd cmd,const void*arg)。第1個參數為指向McBSP通道0的句柄,第2個參數為硬件控制命令,第3個為對特定命令的補充說明。開啟McBSP接收發送功能時,硬件控制命令為LLC_MCBSP_CMD_RESET_CONTROL,使能發送功能時,命令補充說明為LLC_MCBSP_CTIRL_RX_ENABLE,使能接收功能時,命令補充說明為LLC_MCBSP_CTRL_TX_ENABLE。
2.2 EDMA配置
2.2.1 EDMA配置原理
EDMA中傳輸的數據種類有3種:ARRAY,BLOCK,FRAME,分別對應3種不同類型的傳輸。首先是一維傳輸,即每一個EDMA事件觸發的傳輸只傳輸一個ARRAY,該ARRAY所包含的字節數由參數RAM里的參數ACNT決定。然后是二維傳輸,每一個EDMA事件觸發傳輸一個FRAME,每個FRAME里包含的ARRAY數由參數BCNT決定。以此類推。三維傳輸即每次傳輸一個BLOCK,每個BLOCK里包含的FRAME數由參數CCNT決定。
TMS320DM6437的EDMA共有128個參數RAM,其中存放每個EDMA通道需要的各個傳輸控制參數,參數RAM的默認對應關系為:EDMA EVENTO對應參數RAMO,EDMAEVENT1對應參數RAM1,等。以此類推。但是也可以在DCHMAPO-63寄存器里修改相應位自行對應。參數RAM的具體結構如圖2所示。
評論