摘? 要: 介紹TMS320VC5402的多信道緩沖串口(McBSP)的基礎(chǔ)上,分析了其控制寄存器的配置和工作過(guò)程,并給出了在直接存儲(chǔ)器訪問(wèn)(DMA)方式下利用McBSP進(jìn)行通信的方法及程序代碼。
關(guān)鍵詞: McBSP 子地址寄存器 DMA
?
TMS320VC5402是TI公司C54x系列定點(diǎn)DSP芯片中的新產(chǎn)品。它集中了此系列早期產(chǎn)品的優(yōu)點(diǎn),并提供了許多新的功能,開(kāi)發(fā)和使用更加方便。C5402具有靈活的指令系統(tǒng)和操作性能,它可選擇助記符指令或算術(shù)指令作為編程指令,同時(shí)支持匯編語(yǔ)言和C語(yǔ)言的單獨(dú)或混合編程。C5402采用改進(jìn)的Harvard處理結(jié)構(gòu),指令流水線操作,計(jì)算和處理速度很高,系統(tǒng)單指令周期可達(dá)到10ns。在片內(nèi)提供16K的RAM用作程序和數(shù)據(jù)存儲(chǔ),其最大可擴(kuò)展尋址空間為1M字節(jié)。C5402提供的McBSP串口和DMA數(shù)據(jù)傳送方式極大地方便了它在通信領(lǐng)域的應(yīng)用和開(kāi)發(fā)。C5402由于其高性能價(jià)格比而成為當(dāng)前語(yǔ)音和靜態(tài)圖象處理的主流產(chǎn)品。本文主要介紹C5402的McBSP原理、配置以及DMA方式下如何實(shí)現(xiàn)利用McBSP的通信。
1 C5402 McBSP串口的特點(diǎn)
C5402提供了兩個(gè)多信道緩沖串口:McBSP0和McBSP1。McBSP基于54x系列DSP標(biāo)準(zhǔn)串口,它提供了以下功能:
·全雙工同步或異步通信功能;
·實(shí)現(xiàn)連續(xù)的發(fā)送和接收數(shù)據(jù)流的功能;
·與工業(yè)標(biāo)準(zhǔn)編解碼器、模擬接口芯片(AICs)以及其他串行連接A/D和D/A器件的直接接口;
·外部時(shí)鐘輸入或內(nèi)部可編程時(shí)鐘兩種時(shí)鐘控制方式;
·獨(dú)立可編程的發(fā)送和接收幀同步。
此外,C5402的McBSP還具有以下功能:
·多信道數(shù)據(jù)傳輸,最多可擴(kuò)展至128個(gè)信道;
·傳輸數(shù)據(jù)寬度可選為8、12、16、20、24或32位;
·μ律和A律壓縮擴(kuò)展,用于數(shù)據(jù)壓縮;
·幀同步和數(shù)據(jù)時(shí)鐘優(yōu)先級(jí)可編程,實(shí)現(xiàn)不同信道數(shù)據(jù)流幀同步和傳輸優(yōu)先級(jí)控制。
2 McBSP的工作過(guò)程
C5402的McBSP的接口信號(hào)包括:接收數(shù)據(jù)DR、發(fā)送數(shù)據(jù)DX、發(fā)送時(shí)鐘CLKX、接收時(shí)鐘CLKR、接收幀同步FSR、發(fā)送幀同步FSX和外部輸入時(shí)鐘CLKS。其內(nèi)部結(jié)構(gòu)如圖1所示。其中內(nèi)部數(shù)據(jù)發(fā)送和接收控制器負(fù)責(zé)數(shù)據(jù)的發(fā)送和接收移位及緩存;時(shí)鐘和幀同步生成與控制模塊實(shí)現(xiàn)McBSP數(shù)據(jù)傳輸波特率設(shè)置以及同步傳輸時(shí)同步信號(hào)的產(chǎn)生和判斷;C5402提供了多信道傳輸模式,通過(guò)多信道選擇模塊進(jìn)行配置;CPU和DMA中斷模塊用于觸發(fā)CPU或DMA控制器的中斷響應(yīng)。
?
McBSP通過(guò)DX和DR實(shí)現(xiàn)DSP與外部設(shè)備的通信和數(shù)據(jù)交換。其中DX完成數(shù)據(jù)的發(fā)送,DR用來(lái)接收數(shù)據(jù)。同時(shí)通過(guò)CLKX、CLKR、FSR和FSX實(shí)現(xiàn)時(shí)鐘和幀同步控制。DSP通過(guò)McBSP的16位控制寄存器接入內(nèi)部外設(shè)總線。
通過(guò)McBSP發(fā)送數(shù)據(jù)時(shí),CPU或DMA控制器將被發(fā)送數(shù)據(jù)寫入數(shù)據(jù)發(fā)送寄存器DXR[1,2]。若傳輸轉(zhuǎn)移寄存器XSR[1,2]中沒(méi)有數(shù)據(jù),則DXR[1,2]中的值移向XSR[1,2],再由XSR[1,2]將數(shù)據(jù)移到DX上發(fā)送;若XSR[1,2]不為空,則等待將XSR[1,2]中的數(shù)據(jù)全部移到DX腳發(fā)送之后才將DXR[1,2]中的值復(fù)制到XSR[1,2],然后移位到DX。
McBSP的接收緩沖寄存器包括三個(gè):接收移位寄存器RSR[1,2]、接收緩沖寄存器RBR[1,2]和接收數(shù)據(jù)寄存器DRR[1,2]。到達(dá)DR接收腳的數(shù)據(jù)移存到RSR[1,2],一旦接收到一個(gè)字(可以是8、12、16、24或32位),檢查RBR[1,2]是否為空,若為空則將RSR[1,2]中的數(shù)據(jù)復(fù)制到RBR[1,2],在CPU或DMA控制器沒(méi)有對(duì)DRR[1,2]進(jìn)行操作時(shí)可以將RBR[1,2]中的數(shù)據(jù)復(fù)制到DRR[1,2],CPU或DMA控制器通過(guò)讀取DRR[1,2]中的數(shù)據(jù)來(lái)實(shí)現(xiàn)串口數(shù)據(jù)接入。
3 子地址控制寄存器及其配置
McBSP通過(guò)一系列存儲(chǔ)器映射控制寄存器來(lái)進(jìn)行配置和操作。它采用子地址尋址方案。McBSP通過(guò)復(fù)接器將一組子地址寄存器復(fù)接到存儲(chǔ)器映射的一個(gè)位置上。復(fù)接器由子塊地址寄存器SPSAx控制。子塊數(shù)據(jù)寄存器SPSDx用于指定子地址寄存器中數(shù)據(jù)的讀寫。其內(nèi)部連接方式如圖2所示。這種方法的好處是可以將多個(gè)寄存器映射到一個(gè)較小的存儲(chǔ)空間。
為訪問(wèn)某個(gè)指定的子地址寄存器,首先要將相應(yīng)的子地址寫入SPSAx,SPSAx驅(qū)動(dòng)復(fù)接器,使其與SPSDx相聯(lián),接入相應(yīng)子地址寄存器所在的實(shí)際物理存儲(chǔ)位置。當(dāng)向SPSDx寫入數(shù)據(jù)時(shí),數(shù)據(jù)送入前面子塊地址寄存器中所指定的內(nèi)嵌數(shù)據(jù)寄存器;當(dāng)從SPSDx讀取數(shù)據(jù)時(shí),也接入前面子塊地址寄存器中所指定的內(nèi)嵌數(shù)據(jù)寄存器。
以配置McBSP0的控制寄存器(SPCR1_0和SPCR2_0)為例,代碼如下:
SPSA_0? ? .set????? 38h???;定義子塊地址寄存器映射位置
SPSD_0? ? .set????? 39h?? ;定義子塊數(shù)據(jù)寄存器映射位置
SPCR1_0 .set??????00h?? ;定義SPCR1_0的映射子地址
SPCR2_0 .set??????01h???;定義SPCR2_0的映射子地址
STM?????? SPGR1_0 ,SPSA_0 ? ??;將SPCR1_0的地址寫入SPSA_0
??? STM?????? #K_SPGR1_0_CONFIG,SPSD_0 ;將配置值寫入SPSD_0
??? STM?????? SPGR2_0 ,SPSA_0????????????? ;將SPCR2_0的地址寫入SPSA_0
??? STM? #K_SPGR2_0_CONFIG ,SPSD_0??? ;將配置值寫入SPSD_0
在將SPCR1_0和SPCR2_0的子地址寫入SPSA_0之后再將數(shù)據(jù)寫入SPSD_0,內(nèi)部復(fù)接器就自動(dòng)將配置數(shù)K_SPGR1_0_CONFIG和K_SPGR2_0_CONFIG分別寫入子地址寄存器SPGR1_0和SPGR2_0,完成寄存器配置。
4? 實(shí)現(xiàn)DMA方式的數(shù)據(jù)傳輸
C5402內(nèi)部提供了DMA控制器,可以方便地實(shí)現(xiàn)McBSP的DMA方式的數(shù)據(jù)傳輸(發(fā)送或接收)。C5402的DMA有6個(gè)可編程的DMA信道,可獨(dú)立實(shí)現(xiàn)讀寫等不同內(nèi)容的操作。其控制寄存器包括信道優(yōu)先級(jí)和使能控制寄存器(DMPREC)、子塊地址寄存器(DMSA)和子塊訪問(wèn)寄存器(DMSDN和DMSDI),每個(gè)信道的控制寄存器則采用子地址的形式,包括源地址寄存器(DMSRCx)、目的地址寄存器(DMDSTx)、記數(shù)寄存器(DMCTRx)、同步選擇和幀記數(shù)寄存器(DMSFCx)以及傳輸模式控制寄存器(DMMCRx)。利用DMA方式通過(guò)McBSP進(jìn)行數(shù)據(jù)傳輸時(shí),首先要由McBSP產(chǎn)生一個(gè)事件報(bào)告DMA控制器,從而觸發(fā)DMA模式進(jìn)行數(shù)據(jù)傳輸,DMA將設(shè)定的數(shù)據(jù)傳輸完畢后,觸發(fā)DMA中斷,CPU響應(yīng)DMA中斷而進(jìn)入中斷服務(wù)程序。
McBSP所能產(chǎn)生的事件包括DMA接收同步事件(REVT)和DMA發(fā)送同步事件(XEVT)。通過(guò)DMSFCx寄存器來(lái)選擇。以一個(gè)DMA方式下的McBSP發(fā)送數(shù)據(jù)為例,其代碼如下:
??;McBSP初始化
????????? stm? SPCR1_0,SPSA_0???????????? ;SPCR1_0初始化
???? ???? stm ?????? #K_SPCR1_0_RESET,SPSD_0??
????????? stm ?????? SPCR2_0,SPSA_0???????????? ;SPCR2_0初始化
???? ???? stm ?????? #K_SPCR2_0_RESET,SPSD_0??
???? ???? stm ?????? PCR_0,SPSA_0
???? ???? stm? #K_PCR_0_RESET,SPSD_0 ?。还苣_控制寄存器PCR_0初始化
???? ???? rsbx INTM?????????????????????????;中斷使能
???? ???? stm #K_IMR_RESET,IMR??????? ??;中斷屏蔽寄存器IMR初始化
???? ???? stm RCR1_0,SPSA_0???????? ;接收控制寄存器RCR1_0初始化
???? ???? stm #K_RCR1_0_RESET,SPSD_0?
???? ???? stm RCR2_0,SPSA_0???????? ?。唤邮湛刂萍拇嫫鱎CR2_0初始化
???? ???? stm #K_RCR2_0_RESET,SPSD_0
???? ???? stm XCR1_0,SPSA_0??????? ??;發(fā)送控制寄存器XCR1_0初始化
???? ???? stm #K_XCR1_0_RESET,SPSD_0
????????? stm XCR2_0,SPSA_0??????? ?。话l(fā)送控制寄存器XCR2_0初始化
????????? stm #K_XCR2_0_RESET,SPSD_0
????????? stm SRGR1_0,SPSA_0???????????? ;抽樣率生成器SRGR1_0初始化
????????? stm #K_SRGR1_0_RESET,SPSD_0
????????? stm SRGR2_0,SPSA_0???????????? ;抽樣率生成器SRGR2_0初始化
????????? stm #K_SRGR2_0_RESET,SPSD_0
????????? nop
????????? nop
?。籑cBSP0使能
????????? stm SPCR1_0,SPSA_0
????????? stm #K_SPCR1_0_ENABLE,SPSD_0?? ;接收使能
????????? stm SPCR2_0,SPSA_0
????????? stm #K_SPCR2_0_ENABLE,SPSD_0?? ;發(fā)送使能
????????? nop
????????? nop
?。?利用DMA信道0作為數(shù)據(jù)傳輸通道
???? ???? stm DMSRC0,DMSA???????? ?。辉O(shè)置數(shù)據(jù)源發(fā)送地址
???? ???? stm #K_SOURCE-ADDR,DMSDN
???? ???? stm DMDST0,DMSA???? ??;設(shè)置數(shù)據(jù)目的地址
???? ???? stm #K_DST_ADDR,DMSDN
???? ???? stm DMCTR0,DMSA???????? ??;設(shè)置發(fā)送數(shù)據(jù)塊的緩沖大小
???? ???? stm #K_BUFFER_SIZE,DMSDN
???? ???? stm DMSFC0,DMSA???????? ??;設(shè)置同步事件和幀緩沖寄存器
???? ???? stm #K_SFC_VALUE,DMSDN
???? ???? stm DMMCR0,DMSA??????? ;設(shè)置傳輸模式寄存器
????????? stm #K_MCR_VALUE,DMSDN
????????? stm DMIDX0,DMSA???????? ?。辉O(shè)置計(jì)數(shù)器累加值
????????? stm #K_IDX_VALUE,DMSDN
????????? stm #K_PREC_VALUE,DMPREC????;設(shè)置信道優(yōu)先級(jí)和信道使能
DMA以后臺(tái)形式進(jìn)行數(shù)據(jù)傳輸,不需要CPU進(jìn)行控制,可通過(guò)控制寄存器的設(shè)置使得在數(shù)據(jù)傳輸完成或發(fā)生錯(cuò)誤時(shí)產(chǎn)生DMA中斷,CPU響應(yīng)進(jìn)入中斷服務(wù)程序。
?
參考文獻(xiàn)
1 TMS320C54xDSP CPU And Peripherals. TI Reference Set Vol 1, April,1999:9-1~9-64
2 TMS320C54xDSP Applications Guide. TI Reference?Set Vol 4, October,1996:3-1~3-43
3 TMS320C54xDSP Mnemonic Instruction Set. TI Reference Set,Vol 2, June,1998:4~176
4 TMS320C54xDSP Enhanced Peripherals.TI Reference?Set Vol 5, June,1999:2-1~2-99