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