散列DMA設計的高速串口驅動技術
3.2 驅動程序設計
串口驅動程序的核心是實現數據高效穩定的收發。為了實現UART的高速數據傳輸,UART中斷設置為最高優先級;同時在操作系統中允許中斷嵌套,打開UART接收超時中斷RTI并使能UART的DMA傳輸。這樣,當UART的發送FIFO數據減少到設定的參考值(FIFOLevel)時,發送DMA傳輸就會被觸發。同樣,當接收FIFO的數據增長到設定值時,接收DMA傳輸就會被觸發。為了減少DMA傳輸被觸發的次數同時保證數據被及時傳輸,發送FIFO Level設定為2字節,而接收FIFOLevel設定為14字節,將發送和接收的FIFO Level分別設定為0和16字節是有很大風險的。MPI協議要求傳輸的一幀數據不能有間斷,所以在使用DMA傳輸UART數據時DMAC必須獨占系統總線。為了避免產生緩存一致性問題,使用2塊非緩存內存區域存放待發送的數據和已接收到的數據。
發送數據時,待發送的數據量總是已知的。先構造一個傳輸節點,數據源地址為數據包的首地址,目的地址為UART寄存器,數據位寬為8,下一節點指針(PTR_NEXT)為空。當前數據包發送結束前,如果PTR_NEXT被更新,則下一個數據包的傳輸自動開始。當前數據包是否發送完畢,可通過讀取DMAC寄存器DMACCnControl的TransferSize字段得知。整個發送數據的過程無需觸發任何中斷,流程圖如圖3所示。如果采用DMA塊傳輸方式,就需要在每次傳輸完畢后產生DMA中斷,重新裝載數據到內存中的發送數據區以發送下一個數據包。

接收數據時,對方發過來的數據量一般是未知的。構造含有100個節點的循環鏈表結構,每個節點對應的傳輸塊大小為接收FIFO Level。數據源地址為UART數據寄存器的地址,首節點的目的地址為接收數據內存區域的首地址,此后節點的目的地址每次向后偏移(FIFO Level×2)個字節,數據位寬為16(8個數據位,4個狀態位,4個保留位)。當接收到的數據達到接收內存區域的80%(RECV_TH)時,需要通知數據發送方停止數據傳輸,在第80個節點處設置DMA中斷,該節點為閾值節點。采用本文的設計方案接收1幀不超過RECV_TH大小的數據,最多產生一次RTI中斷。當接收到的數據量少于FIFOLevel時不會觸發DMA接收,在RTI中斷中把UART接收FIFO中的數據復制到內存中的數據接收區,同時使DMA接收節點的目的地址向后偏移相應的長度并更新閾值節點的位置。接收數據流程如圖4所示。如果采用DMA塊傳輸方式,就必須額外使用一個環形數據緩沖區(Ring Buffer),每次接收到指定大小的數據塊后產生DMA中斷,在中斷服務程序中將接收到的數據復制到環形數據緩沖區中。

3.3驅動測試
本文的設計方案直接應用于工業級的HMI產品,必須經過嚴格的測試。利用3臺西門子S7系列PLC和1臺產品樣機搭建令牌網,使用西門子MPI協議進行測試,并利用數據分析工具ProfiTrace監測通信過程。測試結果表明,2 400 bps~12 Mbps的各個波特率下都能進行穩定的數據通信。
4 結 語
本文詳細介紹了DMA數據傳輸的特點和散列DMA的工作方式。在此基礎上,提出了一套基于散列DMA的高速串口驅動設計方案,發送數據完全由DMAC完成,無需觸發任何中斷,接收1幀不超過接收區閾值的數據最多產生1次RTI中斷。和現有的各種利用DMA塊傳輸進行串口數據通信的方案相比,中斷次數大幅減少,大大提高了數據傳輸的效率。在應用了本方案的人機界面產品上,實現了波特率高達12 Mbps的穩定數據傳輸。對于在其他平臺上設計實現高速串口,本方案是一個很好的參考。本文引用地址:http://www.104case.com/article/151822.htm
評論