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