基于散列DMA的高速串口驅(qū)動設(shè)計(jì)
DMA數(shù)據(jù)傳輸可分為塊傳輸和散列傳輸兩種方式。在DMA傳輸數(shù)據(jù)的過程中,要求源物理地址和目標(biāo)物理地址必須是連續(xù)的。但是在某些計(jì)算機(jī)體系中(如IA架構(gòu)),連續(xù)的存儲器地址在物理上不一定是連續(xù)的,所以DMA傳輸要分成多次完成。傳輸完一塊物理上連續(xù)的數(shù)據(jù)后引發(fā)一次中斷,然后進(jìn)行下一塊物理上連續(xù)的數(shù)據(jù)傳輸,這就是DMA塊傳輸方式(Block DMA)。散列傳輸是在塊傳輸方式上發(fā)展起來的,它與一個(gè)傳輸鏈表相關(guān),如圖2所示。該鏈表可以是單向結(jié)構(gòu)或環(huán)形結(jié)構(gòu)??刂谱种邪瑪?shù)據(jù)位寬、數(shù)據(jù)塊大小、當(dāng)前塊傳輸結(jié)束是否引發(fā)中斷等控制信息。DMA塊傳輸可看作是只含有一個(gè)節(jié)點(diǎn),且下一節(jié)點(diǎn)指針總是指向當(dāng)前節(jié)點(diǎn)的散列傳輸。采用散列DMA方式能更靈活、高效地傳輸數(shù)據(jù)。
3 在SPEAR300平臺上實(shí)現(xiàn)高速串口
3.1 硬件平臺
SPEAR300是ST公司在ARM926EJ-S核的基礎(chǔ)上開發(fā)的高性能嵌入式處理器。其最高工作頻率為333MHz,有8個(gè)獨(dú)立的DMA通道,支持散列DMA;UART支持DMA傳輸,發(fā)送和接收FIFO大小均為16字節(jié),在192 MHz的外設(shè)總線(APB)頻率下支持的最高波特率為12 Mbps,如果提高APB的頻率還可以獲得更高的波特率。本文的硬件平臺是以SPEAR300為核心的人機(jī)界面產(chǎn)品,主要外設(shè)包括觸摸屏、液晶顯示模組、網(wǎng)口和串口(串口要支持最高波特率為12 Mbps的西門子MPI通信協(xié)議)。
3.2 驅(qū)動程序設(shè)計(jì)
串口驅(qū)動程序的核心是實(shí)現(xiàn)數(shù)據(jù)高效穩(wěn)定的收發(fā)。為了實(shí)現(xiàn)UART的高速數(shù)據(jù)傳輸,UART中斷設(shè)置為最高優(yōu)先級;同時(shí)在操作系統(tǒng)中允許中斷嵌套,打開UART接收超時(shí)中斷RTI并使能UART的DMA傳輸。這樣,當(dāng)UART的發(fā)送FIFO數(shù)據(jù)減少到設(shè)定的參考值(FIFOLevel)時(shí),發(fā)送DMA傳輸就會被觸發(fā)。同樣,當(dāng)接收FIFO的數(shù)據(jù)增長到設(shè)定值時(shí),接收DMA傳輸就會被觸發(fā)。為了減少DMA傳輸被觸發(fā)的次數(shù)同時(shí)保證數(shù)據(jù)被及時(shí)傳輸,發(fā)送FIFO Level設(shè)定為2字節(jié),而接收FIFOLevel設(shè)定為14字節(jié),將發(fā)送和接收的FIFO Level分別設(shè)定為0和16字節(jié)是有很大風(fēng)險(xiǎn)的。MPI協(xié)議要求傳輸?shù)囊粠瑪?shù)據(jù)不能有間斷,所以在使用DMA傳輸U(kuò)ART數(shù)據(jù)時(shí)DMAC必須獨(dú)占系統(tǒng)總線。為了避免產(chǎn)生緩存一致性問題,使用2塊非緩存內(nèi)存區(qū)域存放待發(fā)送的數(shù)據(jù)和已接收到的數(shù)據(jù)。
發(fā)送數(shù)據(jù)時(shí),待發(fā)送的數(shù)據(jù)量總是已知的。先構(gòu)造一個(gè)傳輸節(jié)點(diǎn),數(shù)據(jù)源地址為數(shù)據(jù)包的首地址,目的地址為UART寄存器,數(shù)據(jù)位寬為8,下一節(jié)點(diǎn)指針(PTR_NEXT)為空。當(dāng)前數(shù)據(jù)包發(fā)送結(jié)束前,如果PTR_NEXT被更新,則下一個(gè)數(shù)據(jù)包的傳輸自動開始。當(dāng)前數(shù)據(jù)包是否發(fā)送完畢,可通過讀取DMAC寄存器DMACCnControl的TransferSize字段得知。整個(gè)發(fā)送數(shù)據(jù)的過程無需觸發(fā)任何中斷,流程圖如圖3所示。如果采用DMA塊傳輸方式,就需要在每次傳輸完畢后產(chǎn)生DMA中斷,重新裝載數(shù)據(jù)到內(nèi)存中的發(fā)送數(shù)據(jù)區(qū)以發(fā)送下一個(gè)數(shù)據(jù)包。
評論