摘 ?要: 針對TI公司的DSP芯片TMS320C6713,利用片上同步多通道緩沖串行口(McBSP)和增強型直接存儲器存取(EDMA)實現(xiàn)了串口通信功能。該方案解決了芯片只有同步串口而不能進行異步傳輸?shù)膯栴},豐富了接口功能。
關(guān)鍵詞: TMS320C6713;多通道緩沖串行口;增強型直接存儲器存?。淮谕ㄐ?/FONT>
?
數(shù)字信號處理器因其高性能及強大的數(shù)據(jù)處理能力,而在通信和信號處理、自動控制等領(lǐng)域得到越來越廣泛的應(yīng)用。TMS320C6713(簡稱C6713)作為TI公司TMS320C6000系列的DSP,經(jīng)常被用于圖像、語音處理等方面。在大多數(shù)應(yīng)用系統(tǒng)中,往往需要實現(xiàn)DSP與PC機或者其他外設(shè)之間的異步串行通信。但C6713所提供的串口是同步串口,并不支持通用異步串行收發(fā)器標(biāo)準(zhǔn)[1-2]。本文設(shè)計了一種利用C6713已有的同步串口McBSP與EDMA實現(xiàn)異步串口通信的方法[3]。
1 硬件接口電路設(shè)計
C6713有兩個McBSP(McBSP0,McBSP1)口,每個端口有7 個引腳,除數(shù)據(jù)收發(fā)引腳(DX、DR) 之外,還包括發(fā)送時鐘(CL KX)、接收時鐘(CL KR)、發(fā)送幀同步(FSX)、接收幀同步(FSR)和外部輸入時鐘(CL KS)等引腳,分別用于傳送數(shù)據(jù)、時鐘和幀同步,實現(xiàn)同步串行通信。
當(dāng)McBSP工作在串行口方式時,McBSP與串口的連接圖如圖1所示。對于McBSP 而言,不論外部如何連接,始終認(rèn)為工作在同步方式下。當(dāng)串口發(fā)送的數(shù)據(jù)中有幀信息和數(shù)據(jù)信息時,串口的TxD與McBSP的DR、FSR相連,就可以將數(shù)據(jù)線上的電平跳變直接引入到FSR端;當(dāng)FSR檢測到數(shù)據(jù)線上一幀的第一個下跳沿時,McBSP認(rèn)為幀同步信號到來。
?
2 C6713上的程序設(shè)計
為了實現(xiàn) McBSP與UART通信,本文使用過采樣的方法將同步串口模擬成異步串口進行通信,即將 McBSP發(fā)送接收數(shù)據(jù)的時鐘頻率設(shè)置為UART發(fā)送接收波特率的16倍。當(dāng)McBSP發(fā)送數(shù)據(jù)時,軟件將每一位擴展為16 bit發(fā)送出去,即1被編碼為Oxffff,0被編碼為0x0000;當(dāng)McBSP接收數(shù)據(jù)時,軟件同樣也要將接收到的每個16 bit字解碼還原為1 bit。這樣做使同步串口以比特為單位發(fā)送數(shù)據(jù),可以很方便地模擬出異步串口的數(shù)據(jù)格式。同時,為了讓DSP不需要頻繁地對McBSP進行讀/寫操作,采用EDMA方式發(fā)送接收數(shù)據(jù),提高了DSP的工作效率。McBSP與數(shù)據(jù)緩存之間的數(shù)據(jù)傳送由EDMA的通道14和通道15完成。通道14完成數(shù)據(jù)發(fā)送,通道15完成數(shù)據(jù)接收。
2.1 初始化程序
初始化程序流程如圖2所示。在初始化程序中主要對McBSP及EDMA的一些參數(shù)進行設(shè)置。
假設(shè)傳輸以8IN1的格式,發(fā)送接收都設(shè)為雙相幀模式,第一相是開始位和8個數(shù)據(jù)位,第二相是停止位。停止位編碼為8 bit字,以便于調(diào)整為1.5 bit停止位。應(yīng)該對McBSP相關(guān)寄存器位的值初始化,以及EDMA進行相應(yīng)操作[4]。
2.1.1 McBSP的參數(shù)配置
(1)引腳控制寄存器(PCR)的配置
FSXM=1 FSXP=1:允許采樣率發(fā)生器產(chǎn)生低電平有效的起始位;
FSRM=0 FSRP=1:低電平有效的起始位用作McBSP 的接收幀同步輸入端;
CLKRM=1 CLKXM=1:用內(nèi)部采樣率發(fā)生器產(chǎn)生串行時鐘;
PCR的值為0xB0C。
(2)接收/發(fā)送控制寄存器(RCR/XCR)的配置
(R/X)PHASE=1:使能雙相位幀傳輸模式;
(R/X)FRLEN1=8:數(shù)據(jù)幀的前半部為9個字;
(R/X)FRLEN2=1:數(shù)據(jù)幀的后半部為2個字;
(R/X)WDLEN1=2:數(shù)據(jù)幀的前半部均為16 位的字;
(R/X)WDLEN2=0:數(shù)據(jù)幀的后半部均為8位的字;
(R/X)COMPAND=0:不進行壓縮;
(R/X)FIG=1:忽略幀同步的數(shù)據(jù)傳輸;
(R/X)DATDLY=0:數(shù)據(jù)傳輸不延遲;
RCR和XCR的值都為0x11040840。
(2)采樣率發(fā)生器寄存器(SRGR)的配置
FSGM=0:當(dāng)數(shù)據(jù)從DXR向XSR拷貝時產(chǎn)生接收幀同步信號;
CLKSM=1:采樣率發(fā)生器的時鐘來源于內(nèi)部CPU時鐘信號;
CLKGDV=(McBSP的時鐘頻率)/(16×波特率)-1,時鐘頻率必須進行適當(dāng)?shù)呐渲?,以便產(chǎn)生16 倍波特率的頻率。本文采用的C6713的CPU時鐘頻率為225 MHz,McBSP的時鐘頻率為112.5 MHz,波特率為57 600 b/s。此時計算得到CLKGDV=121;SRGR的值為0x20000079。
2.1.2 EDMA的設(shè)置
(1)打開通道:采用CSL中的EDMA_open函數(shù)打開相應(yīng)的通道,返回值賦給hEdma14、hEdma15。設(shè)置如下:
hEdma14=EDMA_open(EDMA_CHA_XEVT1,EDMA_OPEN_
RESET);
hEdma15=EDMA_open(EDMA_CHA_REVT1,EDMA_OPEN_
RESET);
(2)分配鏈接表地址
采用CSL中的EDMA_allocTable(-1)函數(shù),系統(tǒng)將自動隨機地在參數(shù)RAM中專門為鏈接提供的地址空間內(nèi)分配一個地址作為鏈接使用。函數(shù)的返回值就是分配到的地址,把它分別賦值給hEdmaLINK與hEdmaLINK2。設(shè)置如下:
hEdmaLINK=EDMA_allocTable(-1);
hEdmaLINK2=EDMA_allocTable(-1);
設(shè)置源和目的地址:CSL中方便地提供了一個獲得McBSP的DRR和DXR寄存器的地址函數(shù)。只需要定義一個句柄MCBSP_Handle hMcbsp1,在主程序中必須先對hMcbsp1進行賦值,利用MCBSP_open函數(shù)打開一個McBSP通道,如:
hMcbsp1=MCBSP_open(MCBSP_DEV1,MCBSP_OPEN_RESET);
定義完hMcBSP1后就可以把hMcBSP1作為參數(shù)帶入MCBSP_getXmtAddr函數(shù)。引用結(jié)構(gòu)體成員,就能對其賦值:
edmaXmitParam.dst=MCBSP_getXmtAddr(hMcbsp1);
edmaRcvParam.src=MCBSP_getRcvAddr(hMcbsp1);
(3)配置EDMA鏈接
根據(jù)CSL中提供的函數(shù),采用以下方法進行鏈接:
EDMA_config(hEdma14,&edmaXmitParam);
EDMA_config(hEdma15,&edmaRcvParam);
EDMA_link(hEdma14,hEdmaLINK);
EDMA_link(hEdmaLINK,hEdmaLINK);
EDMA_link(hEdma15,hEdmaLINK2);
EDMA_link(hEdmaLINK2,hEdmaLINK2);
(4)使能EDMA通道與關(guān)閉
采用CSL提供的庫函數(shù)進行使能EDMA通道:
EDMA_enableChannel(hEdma14);
EDMA_enableChannel(hEdma15);
同時,在EDMA使用完之后要用如下語句對其復(fù)位及關(guān)閉操作。
EDMA_RSET(CIER,0x0);
EDMA_close(hEdma14);
EDMA_close(hEdma15);?
2.2 發(fā)送子程序
發(fā)送時,用發(fā)送轉(zhuǎn)換子程序void ProcessTransmitData(void)把一塊數(shù)據(jù)轉(zhuǎn)變?yōu)閁ART發(fā)送的字,即擴展每個數(shù)據(jù)位為 16 bit的字。發(fā)送轉(zhuǎn)換子程序把這個發(fā)送字塊放人發(fā)送緩沖器,并且?guī)_始位(0x0000)和停止位(0xffff)也放在了特定的位置。發(fā)送子程序框圖如圖3所示。
2.3 接收子程序及容錯程序
接收時,EDMA從 DRR寄存器中讀取擴展的數(shù)據(jù),并把數(shù)據(jù)寫人接收緩沖區(qū)。當(dāng) EDMA將所有數(shù)據(jù)移人接收緩沖區(qū)后,會發(fā)出中斷給 CPU,然后軟件才調(diào)用接收轉(zhuǎn)換子程序void ProcessReceive-Data(void),把接收到的數(shù)據(jù)進行解碼。接收子程序框圖如圖4所示。
?
值得注意的是:由于McBSP在接收數(shù)據(jù)過程中使用的是內(nèi)部時鐘方式,接收的數(shù)據(jù)可能會有一定的偏移量,所以解碼過程應(yīng)對數(shù)據(jù)進行容錯處理。調(diào)用一個數(shù)據(jù)邏輯判斷子程序unsigned short vote logic(unsigned short value),用以確定每一個數(shù)據(jù)位的值,每解碼一個字時該函數(shù)先屏蔽掉高6位和低6位,只檢測中間的4 bit數(shù)據(jù);當(dāng)?shù)扔?011、1100、1101、1110、1111、0111時,對應(yīng)解碼為“1”,否則為“0”。
3 PC機程序設(shè)計
本方案利用PC機與C6713進行串行通信。下傳時通過對數(shù)據(jù)文件讀取,將數(shù)據(jù)傳入DSP;上傳時在主機端把數(shù)據(jù)寫入文件進行保存。PC機軟件采用VC++平臺開發(fā),其中包括以下幾部分功能[5]:
(1)串口初始化。采用CreateFile( )函數(shù)獲得串口設(shè)備的句柄,利用SetupComm( )函數(shù)設(shè)置緩沖區(qū),并使用SetCommState( )重新初始化串口;
(2)串口讀寫:調(diào)用ReadFile( )函數(shù)進行串口數(shù)據(jù)接收,調(diào)用WriteFile( )函數(shù)進行串口數(shù)據(jù)發(fā)送;
(3)關(guān)閉串口:利用PurgeComm( )停止收發(fā)數(shù)據(jù),清除緩沖區(qū),調(diào)用CloseHandle(hCom)關(guān)閉串口設(shè)備句柄。
在進行批量數(shù)據(jù)傳輸,例如靜態(tài)圖像傳輸時,還規(guī)定了主機與從機雙方必須共同遵守一些協(xié)議,包括控制命令、數(shù)據(jù)收送、超時重發(fā)等協(xié)議來完成通信,確保數(shù)據(jù)發(fā)送的完整性。
4 傳輸性能分析
??? 將系統(tǒng)應(yīng)用于靜態(tài)圖像壓縮應(yīng)用,以傳輸圖像為例,下載一幅256×256的BMP圖像,上傳壓縮后的JPEG圖像,一次傳輸?shù)木彺鎱^(qū)設(shè)置為2 048 B。先來討論下載過程中的實際用時,實際下載時間=數(shù)據(jù)傳輸時間+程序運行時間。圖像下載的理論用時可以用下式來表示:
估算結(jié)果表明,實際用時大約是理論用時的1.5倍。對于實際用時大于理論用時并不難理解,實際下載時間=數(shù)據(jù)傳輸時間+程序運行時間。其中,程序運行時間又包括串口緩沖區(qū)的讀寫時間以指令執(zhí)行時間。這里的緩沖區(qū)讀寫時間是雙方面的,包括上位機與DSP。在VC++中,由于使用的是MsCommon控件,在接收數(shù)據(jù)包時,這個控件通常用于傳輸控制命令,并不適用于做大量數(shù)據(jù)通信,需要手動進行延時350 ms才能完整地收到大小為2 048的數(shù)據(jù)包。這里的350 ms包括了等待每一幀2 048數(shù)據(jù)傳輸?shù)臅r間0.28 s加上VC++中讀緩沖區(qū)的延時時間。對于下載來說,圖像大小正好是2 048的整數(shù)倍,可分為96次來傳輸。對于上傳JPEG數(shù)據(jù)流來說,壓縮后實際大小是8 455 B,并且4.13,但程序中可分為5次來傳輸。因此實際傳輸時間是5×0.28=1.4 s,再加上延時間與代碼執(zhí)行時間就大概符合實際測試的2.2 s。
通過C6713的McBSP和EDMA實現(xiàn)異步串行通信。目前,已經(jīng)完成了軟硬件調(diào)試,并已將它應(yīng)用靜態(tài)圖像數(shù)據(jù)的傳輸。試驗結(jié)果表明,該方法硬件結(jié)構(gòu)簡單可靠,基本滿足實時性要求,取得了很好的效果,具有一定的應(yīng)用價值。
參考文獻
[1] TMS320C6000 McBSP:UART,TI Incorporated[J/OL],2004.http://www.TI.com.
[2] TMS320C6000 Peripherals Reference Guide,TI Incorporated[J/OL],2004.http://www.ti.com.
[3] TMS320C6000 DSP enhanced direct memory access(EDMA)controller reference guide.TI Incorporated[J/OL].http://www.ti.com.
[4] 任麗香,馬淑芬,李方慧.TMS320C6000系列DSPs的原理與應(yīng)用[M].北京:電子工業(yè)出版社,2000.
[5] 龔建偉,熊光明.VC++/Turbo C串口通信編程實踐[M].北京:電子工業(yè)出版社,2004.