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