1, 基礎知識
在給出例程之前,先了解一下相關的基礎知識。
Sport接口提供一種多通道的操作模式,運用這種模式可以以時分復用的方式進行通信。在多通道模式中,每個數(shù)據(jù)字都占用一個獨立的通道。每個sport最多可以進行128個通道的通信,sport口可以自動地選擇某個通道而忽略其他的通道。Sport在每個通道中都可以進行發(fā)送,接收,或者同時發(fā)送和接收,或者什么都不做。多通道也可以運行在DMA模式下。
Sport多通道發(fā)送選擇寄存器和多通道接收選擇寄存器的設置必須在sport發(fā)送或者接收使能事前進行。也就是sport,DMA使能是所有相關寄存器設置之后的最后一步。
下圖表示了一個多通道傳輸?shù)膶嵗哂幸韵绿攸c:
在一個串行總線上用時分復用的模式進行傳輸,它的數(shù)據(jù)的發(fā)送和接收占用不同通道。
獨立的選擇發(fā)送或者接收通道
RFS信號最為幀開始的標志
TFS信號作為數(shù)據(jù)有效的標志
通道0和2用于接收,通道1和2用于發(fā)送多通道幀延時設置為1
多通道操作的使能
SPORTx_MCM2中的MCMEN位置位使能SPORT多通道模式,sport的接收和發(fā)送時同時使能的,所有如果使能sport發(fā)送,那么接收也必須用多通道模式。
幀同步信號
在多通道模式中所有的接收和發(fā)送設備都必須有一個唯一的參考時序。RFS用來做為這個唯一的參考時序,RFS標志著一個數(shù)據(jù)塊的開始。
在sport多通道模式下,接受方和發(fā)送方都用RFS來做為幀同步信號。RFS標志著多通道傳輸?shù)拈_始。
RFS在被發(fā)送方接收的到時候,傳輸就開始了,在傳輸期間的其他的RFS信號時背忽略的。
多通道幀同步延時
在多通道模式中, SPORTx_MCMC2寄存器的MFD域定義了在幀同步的有效沿和第一個數(shù)據(jù)位的時鐘個數(shù)。這個位的設置為不同的設備接口提供了方便。MFD為0的時候,第一個數(shù)據(jù)位是和幀同步位同時發(fā)出的,也就是說沒有延時。MFD最大的可設定值是15。
窗口大小
窗口大小定義了被多通道選擇寄存器使能的通道的個數(shù)。被使能的序列被稱為被激活的窗口。WSIZE[3:0]的值可以取0—15,對應8---128個窗口大小,遞增值是8個通道。默認值是0,對應8個通道。WSIZE[3:0]的值與被激活的通道個數(shù)的關于如下:
Number of words in active window = 8 x (WSIZE + 1)
分布在窗口外面的多通道被使能將要被忽略。
窗口偏移
窗口偏移說明了,在1024個通道里面,被激活的窗口的起始位置。0表示沒有偏移。例如wsize=0 woff=93,表示被激活的通道是8個,起始位置是93,即93—100通道是被激活。在sport被使能之后,這兩個值是不能改變的。
通道選擇寄存器
這里的通道就是指的時分復用里的通道,每個通道一般是3—32位的一個數(shù)據(jù)字,具體字長可以自由設定。多通道選擇寄存器中的每個位對應一個通道,置1說明使能對應的通道,0表示不使能對應的通道。SPORTx_MRCSn 和 SPORTx_MTCSn被用來使能接收和發(fā)送的有效通道。發(fā)送和接收分別有四個32位寄存器,共可以設置128個通道。
2, 多通道設置例程
多通道應用背景:三個過程板與一個中心處理單元用sport總線相連,數(shù)據(jù)單向移動,從過程板向中心處理單元傳送,傳送方式:基于自動緩沖的DMA模式的sport多通道時分復用。
多通道時分復用的時候,sport口寄存器的設置:例如,兩個設備,設備1設備2都向設備3發(fā)送,采用時分復用的方式主要寄存器設置如下:
基本參數(shù):DSP : blackfin536
SCLK 100MHz
發(fā)送端沒什么可說的,重點解釋下面兩個寄存器的設置
設備一:(發(fā)送)
*pSPORT1_MCMC1 =0x1000;//設備1窗口大小是16,偏移量是0
*pSPORT1_MCMC2 =MFD_1 |MCMEN;
*pSPORT1_MTCS0 = 0x0000FFFF; 發(fā)送通道是16個通道
設備二:(發(fā)送)
*pSPORT1_MCMC1 =0x1010;//設備2窗口大小是16,偏移量是16
*pSPORT1_MCMC2 =MFD_1 |MCMEN;
*pSPORT1_MTCS0 = 0x0000FFFF; 發(fā)送通道是前16個通道
設備三:接收設備 系統(tǒng)時鐘100MHz
*pSPORT0_TCR1 = TCKFE | ITCLK;
*pSPORT0_TCR2 = SLEN_32 ;//| TSFSE; //這里設置字長是32位,可根據(jù)需要設定
*pSPORT0_RCR1 = RCKFE | IRFS | IRCLK; //多通道時發(fā)送端提供幀同步
*pSPORT0_RCR2 = SLEN_32 ; //這里設置字長是32位,可根據(jù)需要設定
*pSPORT0_RCLKDIV = 0x0001; //發(fā)送時鐘分頻,可根據(jù)需要設定
*pSPORT0_RFSDIV = 0x03C0; //幀同步分頻
*pSPORT0_MCMC1 = 0x3000; //窗口大小是32.就是說每個接收循環(huán)接收32個字,窗口偏移是0,就是從0通道開始接收
*pSPORT0_MCMC2 = MFD_1 | MCMEN;
*pSPORT0_MTCS0 = 0x00000000;
*pSPORT0_MTCS1 = 0x00000000;
*pSPORT0_MTCS2 = 0x00000000;
*pSPORT0_MTCS3 = 0x00000000;
*pSPORT0_MRCS0 = 0xFFFFFFFF; 接收通道,32個通道
*pSPORT0_MRCS1 = 0x00000000;
*pSPORT0_MRCS2 = 0x00000000;
*pSPORT0_MRCS3 = 0x00000000;
調(diào)試過程中遇到的問題:收到的數(shù)據(jù)出現(xiàn)丟包或者重復包的現(xiàn)象。
原來是發(fā)送端的寄存器設置的問題,在DMA3_CONFIG這個寄存器中有個SYNC項的設置,在運用多通道時分復用的時候錯誤的將SYNC位置1了,就出現(xiàn)了上述的現(xiàn)象。原來這個SYNC位的作用是這樣的:當DMA發(fā)送緩沖區(qū)的數(shù)據(jù)的最后一個數(shù)據(jù)移到sport FIFO中去的時候,就發(fā)生中斷,然后刷新緩沖區(qū),這是沒有置位SYNC的情況。在置位SYNC之后的情況就變了,是sport FIFO中的數(shù)據(jù)的最后一個數(shù)倍發(fā)送出去之后才會產(chǎn)生中斷,這樣的話就會出現(xiàn)上述的錯誤現(xiàn)象,為什么會出現(xiàn)這樣的現(xiàn)象呢?這是因為DMA緩沖區(qū)向sport FIFO中轉(zhuǎn)移數(shù)據(jù)與sport FIFO向tx寄存器中發(fā)送數(shù)據(jù)的過程是連續(xù)的,加上SYNC這個位之后,當DMA緩沖區(qū)內(nèi)的最后一個數(shù)據(jù)移動到SPORT FIFO中去的時候,并沒有產(chǎn)生中斷,這時發(fā)送過程還是正在執(zhí)行的,當下一次再從DMA 緩沖區(qū)向FIFO中移動數(shù)據(jù)的時候,因為之前沒有中斷發(fā)生,DMA的緩沖區(qū)也沒有刷新,它里面還是以前的數(shù)據(jù),所以它又從第一個數(shù)據(jù)開始移動,所以這時又把DMA緩沖區(qū)內(nèi)的第一個數(shù)據(jù)移出來了。當這個過程進行兩次的時候,sport把這個循環(huán)進行完了,產(chǎn)生中斷,這時DMA緩沖區(qū)的數(shù)據(jù)才開始刷新,所以,下一包數(shù)據(jù)實際上是前一包的數(shù)據(jù)的前兩個字,加上DMA緩沖區(qū)刷新的數(shù)據(jù)的第三個字往后的數(shù)據(jù),以此往復。
|