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