DMA控制器
DMA(Direct Memory Access)控制器是一種在系統內部轉移數據的獨特外設,可以將其視為一種能夠通過一組專用總線將內部和外部存儲器與每個具有DMA能力的外設連接起來的控制器。它之所以屬于外設,是因為它是在處理器的編程控制下來 執行傳輸的。
1.DMA控制器結構
一般而言,DMA控制器將包括一條地址總線、一條數據總線和控制寄存器。高效率的DMA控制器將具有訪問其所需要的任意資源的能力,而無須處理器本身的介入,它必須能產生中斷。最后,它必須能在控制器內部計算出地址。
一個處理器可以包含多個DMA控制器。每個控制器有多個DMA通道,以及多條直接與存儲器站(memory bank)和外設連接的總線,如圖1所示。在很多高性能處理器中集成了兩種類型的DMA控制器。第一類通常稱為“系統DMA控制器”,可以實現對任何資源(外設和存儲器)的訪問,對于這種類型的控制器來說,信號周期數是以系統時鐘(SCLK)來計數的,以ADI的Blackfin處理器為 例,頻率最高可達133MHz。第二類稱為內部存儲器DMA控制器(IMDMA),專門用于內部存儲器所處位置之間的相互存取操作。因為存取都發生在內部 (L1-L1、L1-L2,或者L2-L2),周期數的計數則以內核時鐘(CCLK)為基準來進行,該時鐘的速度可以超過600MHz。
每個DMA控制器有一組FIFO,起到DMA子系統和外設或存儲器之間的緩沖器的作用。對于MemDMA(Memory DMA)來說,傳輸的源端和目標端都有一組FIFO存在。當資源緊張而不能完成數據傳輸的話,則FIFO可以提供數據的暫存區,從而提高性能。
因為你通常會在代碼初始化過程中對DMA控制器進行配置,內核就只需要在數據傳輸完成后對中斷做出響應即可。你可以對DMA控制進行編程,讓其與內核并行地移動數據,而同時讓內核執行其基本的處理任務—那些應該讓它專注完成的工作。
2.DMA控制器基本功能
DMA控制器是內存儲器同外設之間進行高速數據傳送時的硬件控制電路,是一種實現直接數據傳送的專用處理器,它必須能取代在程序控制傳送中由CPU和軟件所完成的各項功能;它的主要功能是:
(1)DMAC同外設之間有一對聯絡信號線——外設的DMA請求信號DREQ以及 DMAC向外設發出的DMA響應信號DACK;
(2)DMAC在接收到DREQ后,同CPU之間也有一對聯絡信號線——DMAC向CPU 發出總線請求信號(HOLD或BUSRQ),CPU在當前總線周期結束后向DMAC發出總線響應信號(HLDA或BUSAK),DMAC接管對總線的控制權,進入DMA操作方式;
(3)能發出地址信息,對存儲器尋址,并修改地址指針,DMAC內部必須有能自動加1或減1的地址寄存器;
(4)能決定傳送的字節數,并能判斷DMA傳送是否結束。DMA內部必須有能自動減1的字計數寄存器,計數結束產生終止計數信號;
(5)能發出DMA結束信號,釋放總線,使CPU恢復總線控制權;
(6)能發出讀、寫控制信號,包括存儲器訪問信號和I/O訪問信號。DMAC內部必須有時序和讀寫控制邏輯。 有些DMAC芯片和模塊在這些基本功能的基礎上還增加了一些新的功能。如:在DMA傳送結束時產生中斷請求信號;在傳送完一個字節數后輸出一個脈沖信號,用于記錄已傳送的字節數、為外部提供周期性的脈沖序列;在一個數據塊傳送完后能自動裝入新的起始地址和字節數,以便重復傳送一個數據塊或將幾個數據塊鏈接起來傳送;產生兩個存儲器地址,從而實現存儲器與存儲器之間的傳送以及能夠對I/O設備尋址,實現I/O設備與I/O設備之間的傳送以及能夠在傳送過程中檢索某一特定字節或者進行數據檢驗等等。
CC2530芯片DMA控制器配置
以美國Ti公司CC2430/CC2530芯片為代表的ZigbeeSOC解決方案在國內高校企業掀起了一股Zigbee技術應用的熱潮。ZigBee是基于IEEE802.15.4無線標準研制開發的有關組網、安全和應用軟件方面的技術標準。其特點是近距離、低復雜度、自組織、低功耗、低數據速率、低成本。ZigBee的技術特性決定它將是無線傳感器網絡的最好選擇,廣泛用于物聯網,自動控制和監視等諸多領域。
(1)但有些無線通信的開發并不需要依賴Zigbee協議,開發者完全可以在此上開發自己的協議。一般情況下,用CC2530的RF模塊發送數據,通過向寄存器RFD[0:7]重復的賦值可以將能將內存中的數據寫入到RF模塊的Buffer里面,再通過選通命令啟動RF發送數據。而在實時性要求較高的應用中,使用向寄存器賦值的方法遠大于通過DMA將內存中的數據“搬運”到Buffer里所耗時間。CC2530里的DMA控制器可以極大的釋放8051CPU內核對數據的操作,可以使CPU在最小的干預下,實現內存到ADC或RF模塊之間的數據傳送。使用DMA“搬運”數據的功能,要對按照CC2530的datasheet
(2)對DMA控制器的進行一系列的配置。本文主要研究兩個方面,一是在應用背景下基于實踐對DMA控制器進行配置,另一個測試DMA控制器中主要故障的解決方案。
1、DMA控制器
CC2530的DMA控制器的特點:5個獨立通道,3個優先級,32個觸發事件,獨立的源地址和目的地址控制,3個傳送模式,支持設置變化的發送長度,單字和雙字發送模式。對DMA控制器的設置基本上是基于以上7個特點。具體的配置項有:Sourceaddress、DestinationAddress、TransferCount、VLENSetting、TriggerEvent、SourceandDestinationIncrement、DMATransferMode、DMAPriority、ByteorWordTransfers、InterruptMask、Mode8Setting。
DMA的配置基于應用,以RF模塊傳送數據為例(RF模塊需要發送和接收數據,在其buffer和內存之間的數據傳輸通過DMA來完成)DMA控制器的使用包括對DMA中斷配置,DMA控制器的參數設置,DMA控制器啟動。
2、DMA控制器中斷的配置
IEN1|=0x01;//開DMA中斷
DMAIRQ=0;//清除標志位
(中斷標志位的清除不僅僅在中斷使用前要進行配置,在中斷觸發后的中斷服務程序里面也清除)。
3、DMA控制器的參數設置
DMA控制的參數設置是通過“填寫”一張數據結構表(ConfigurationDataStructure)。數據結構表里的參數有:SRCADDR[15:8]、SRCADDR[7:0]、DESTADDR[15:8]、DESTADDR[7:0]、VLEN[2:0]、LEN[12:8]、LEN[7:0]、WORDSIZE、TMODE[1:0]、TRIG[4:0]、SRCINC[1:0]、DESTINC[1:0]、IRQMASK、M8、PRIORITY[1:0]與上述配置項是相對應的。CC2530DMA控制器配置的實現是通過先將數據表封裝成結構體,配置好該結構體后將其的地址傳給DMA0CFGH寄存器,這樣才能被arm啟動。CC2530共有兩個這樣的寄存器,另外一個是DMA1CFGH。前者對應通道0的配置信息,后者對應余下通道(1~4通道)。由于RF模塊收發數據均要依靠DMA,因此使用DMA控制器兩個通道。0通道負責將數據從內存搬運到Buffer,1通道負責將數據從Buffer搬運到內存。在DMA配置表的填寫中,(以通道0的配置為例,1通道方法相同)源地址填待發數據的首地址,目的地址填Buffer的地址。RF的Buffer分為TXbuffer和RXbuffer,通道0是發送數據用,所以應該填寫TXbuffer的地址,該地址在CC2530的ioCC2530.h已經宏定義成了宏(#defineX_RFDXREG(0x70D9)),取其地址賦值給DESTADDR。
DMA傳送的第一個字節應是長度字節lengthbyte,DMA搬運數據前會檢查該值,從而確定執行一次搬運所搬運的字節。而這個字節在設定后,可由VLEN改變,VLEN決定最后搬運的值,有4個選項,分別是lengthbyte+1,lengthbyte,lengthbyte+2,lengthbyte+3。這部分在設計程序時尤其注意,特別是在RF應用中。
LEN決定了DMA搬運的最大長度。即使VLEN長度大于LEN,搬運的長度仍然是LEN。
WORDSIZE的選擇單字節。
TMODE在四個選擇single、block、singlerepeated、blockrepeated中,通道0可以任選,通道1則只能選擇single或者repeatedsingle。這個選擇決定了每次DMA被觸發后,DMA采取的搬運機制,觸發一次是搬運一個字節還是搬運整塊數據。由于將數據從RF模塊的RXbuffer搬運到內存,DMA搬運數據的時間小于RF模塊接收數據的時間,所以在RADIO觸發方式下,選擇single或者repeatedsingle可以保證RF模塊收到一個字節立即通過DMA將器搬運至內存,這樣才能保證接收到的數據被完整無錯的存到內存中。
TRIG選擇NONE,采用手動觸發。通道1的配置要選擇RADIO,即在RXbuffer收到一個字節,DMA立刻搬運一個字節到內存。DMA控制器一共提供了31個觸發選項,包括定時器、I/0控制器、UART、Flash控制器、ADC、AES、Debuginterface的觸發源,應用面非常廣。
SRCINC和DESTINC決定源地址和目的地址在每次DMA完成一次搬運后地址變化的方式,在不變、增一、增二、減一四個選項中選增一的方式,SRCINC選擇增一的方式,DESTINC選擇不變。這是由于目的地址對應RFD寄存器,需將數據依次“搬運”到該寄存器,便能將相應的字節依次寫入到TXbuffer中。
IRQMASK屏蔽通道中斷的配置,所以IRQMASK|=0x03開通道0和1的中斷,同時屏蔽其他的通道的中斷。
M8選擇搬運每個字節的位數。選擇8位還是7位,其中7位是LSB小端。
PRIORITY優先級的選擇。該優先級是與CPU相比,此應用中應該將DMA的優先級設置的比CPU高。
4、DMA控制器啟動
在填好DMA控制器的參數表后,將該表的地址(&DMAConfig[0])賦值給DMA0CFG,在使用前先arm上DMA,再手動觸發,觸發完后在DMA的中斷服務程序啟動RF發送。
DMAARM|=0x01;//對通道0arm
如果觸發模式選擇手動觸發則
DMAREQ |=0x01;//手動觸發DMA控制器
后才能觸發DMA;若是RADIO觸發則是收到一個數據會自動觸發DMA。
5、DMA控制器測試中主要故障的解決方案
按照CC2530的datasheet對DMA控制器進行按需配置,測試過程中發現一個問題:如果在使用了DMA后,修改DMA參數中源地址SRCADDR的值,在沒有將該結構體參數表的地址&DMAConfig[0]重新賦值給DMA0CFG情況下arm后觸發DMA,DMA控制器的執行會出現故障,可以進入中斷,但是搬運的數據并非我們期望的數據。而修改其他參數則斐然。解決方案是在修改了SRCADDR的值后,重新將&DMAConfig[0]賦值給DMA0CFG。
6、總結
DMA的配置需要細致的閱讀CC2530的說明文檔,按照開發的需要不斷的測試。本文以RF模塊的應用為背景,以采用DMA的方式將數據從內存搬運到TXbuffer近而實現無線實時數據傳輸為例,在實踐和反復測試后中,給出了DMA在此應用的配置方案和測試中主要故障的解決方案。
評論
查看更多