TMS320C6474學習總結(十一)----EDMA3使用說明
1. 什麼是EDMA3控制器?
EDMA3(Enhanced Direct Memory Access 3):增強型直接儲存器訪問的控制器。它是DSP中一個高效資料傳輸引擎,其結構適合資料的高速傳輸。直接儲存器訪問是一種重要的資料訪問方式,可以在沒有CPU參與的情況下,由控制器完成儲存空間的資料轉移,適用於軟體觸發的頁面傳輸(片外儲存空間與片記憶體儲空間間進行傳輸)、適用於事件觸發的外設(串列埠及介面UTOPIA)。利用EDMA3控制器對多變的資料結構進行子幀的提取及排列,減輕CPU在資料傳輸方面的負擔。
2. EDMA3的特徵
①提供三個維度完全正交的傳輸方式(三個維度之間不存在相互干擾);
EDMA3支援一維傳輸(A同步傳輸:一次觸發只搬移ACNT個位元組的資料)和二維傳輸(A-B同步傳輸:一次觸發只搬運ACNT*BCNT個位元組資料)這兩種方式,不支援三維傳輸(A-B-C同步傳輸),但可以通過配置EDMA3為週期性事件觸發模式,同時配置好CCNT的值,就可以實現A-B-C的三維傳輸。
②可變的獨立源地址和目的地址;
EDMA3在初始化時會設定源地址和目的地址,在EDMA3的傳輸過程中,其源地址和目的地址會不斷往後偏移,來實現資料從源地址+偏移位置往目的地址+偏移位置端轉移。
③支援事件同步傳輸、手動同步傳輸以及連結同步傳輸方式;
事件同步傳輸:外設、系統或者外部產生的事件觸發產生髮送請求
手動同步傳輸:CPU通過在對應的暫存器位(ESR/ESRH)上寫1來人為觸發產生髮送請求
連結同步傳輸:一個傳送的完成來觸發另一次的傳送(要終止傳送,可以將OPT中的LINK設為NULL)
④EDMA3具有64個DMA通道,8個QDMA通道,256個PaRAM引數集,每一個通道都可以與給定的事件佇列和PaRAM相關聯。
⑤EDMA3主要包括EDMA3CC(通道控制器)和EDMA3TC(傳輸控制器),EDMA3CC是使用者控制EDMA控制器的介面,是EDMA3中使用者程式設計的一部分。EDMA3CC包括PaRAM引數、通道控制暫存器以及中斷控制暫存器。傳輸控制器EDMA3TC負責資料的搬移並分別向源地址和目的地址發出讀寫命令,源地址和目的地址是在EDMA3CC中設定的。
3. EDMA3CC主要以下幾個模組
1. PaRAM:PaRAM引數設定了資料傳輸的一些資訊,例如源地址、目的地址、傳輸的資料大小,以及傳輸方式等資訊。
2. EDMA3事件和中斷處理暫存器:實現事件和引數設定的對映,事件使能/去使能,中斷使能/去使能/清除中斷等。
3. 事件佇列:事件佇列處於事件探測邏輯和傳送請求提交邏輯之間。
4. 記憶體保護暫存器:記憶體保護暫存器定義了DMA通道陰影區域和PaRAM區域的入口。
5. 區域暫存器:區域暫存器允許DMA源(DMA通道和中斷)被分配到獨特的區域。
6. 除錯暫存器:除錯暫存器允許訪問可視的暫存器來讀取佇列狀態、控制器狀態和事件狀態。
4. PaRAM引數集
EDMA3共有256個PaRAM引數集,DMA和QDMA的通道傳輸內容(源/目的地址、數量、索引值等)都是在PaRAM中設定的。使用者可以將256個PaRAM對映到任意DMA通道或QDMA通道上,來控制傳輸控制器進行一定資料量的搬運。
PaRAM各欄位含義
欄位 |
含義 |
OPT |
傳輸配置選項 |
SRC |
資料來源端的位元組地址 |
ACNT |
一個array中的連續位元組數 |
BCNT |
一幀中的array數 |
DST |
資料目的端的位元組地址 |
SRCBIDX |
源BCNT索引值,用於指示傳輸幀中, 資料來源的陣列array的間隔 |
DSTBIDX |
目的BCNT索引值,用於指示傳輸幀中, 資料目的端的陣列array的間隔 |
LINK |
當前PaRAM耗盡時,用於LINK的PaRAM的地址 |
BCNTRLD |
A同步傳輸時,BCNT耗盡時的過載值 |
SRCCIDX |
源CCNT索引值,用於指示傳輸幀中, 資料來源的幀間的間隔 |
DSTCIDX |
目的CCNT索引值,用於指示傳輸幀中, 資料目的端的幀間的間隔 |
CCNT |
一個傳輸塊中的幀數 |
5. DMA與QDMA的區別
DMA和QDMA通道的不同之處在於使用的觸發條件不同。DMA的觸發方式有三種:主動觸發、事件觸發以及連結觸發。而QDMA的觸發方式是自動觸發和連結觸發模式,自動觸發是指只要配置了PaRAM引數就會自動觸發,連結觸發與DMA比較類似。QDMA只能傳送一維Array的資料格式,而DMA可以傳送一維、二維和三維的資料格式。
4. 配置EDMA3傳送的主要步驟
1. DMA通道的初始化:
a. 通道選擇,包括通道型別選擇以及通道號選擇,特別是事件觸發時,不同的事件綁定了不同的通道號(在主動觸發方式下,可以任意選擇通道號,但如果是事件觸發模式,必須使用觸發事件對應的通道號)。
#define g_Edma3ChanNUM 20
#define g_PaRAMNum 30
/*EDMA3有64個DMA通道,8個QDMA通道,可任意選擇通道號,但主要不要衝突*/
/*PaRAM共有256個引數集,可任意對映至DMA通道和QDMA通道,注意不要衝突*/
b. 通道對映,配置DCHMAP暫存器,指定PaRAM引數地址對映到使用的通道號
*(Edma3_DCHMAP0 + 4 * g_Edma3ChanNUM) = g_PaRAMNum << 5;
/*將PaRAM 30 對映到DMA通道20 上*/
※ 此處暫存器中顯示可以配置0-511個PaRAM,但實際上只有256個PaRAM
c. EDMA通道分割槽設定,EDMA3通道控制器暫存器分為全域性暫存器、全域性區域暫存器和陰影區域暫存器,如果將某個通道設定為陰影區域,那麼後續操作必須使用陰影區域的暫存器(一般不用陰影區域,可以不用配置)。
d. 陰影區域通道使能,開啟相應的DMA通道中斷使能;
/*如果使用的通道為陰影區域,則需要置位對應陰影通道的使能暫存器*/
e. 將選擇的EDMA通道設定到需要的佇列上,每個佇列的優先順序是不同的。
*Edma3_DMAQNUM0 = 0x44444444;
/*將選擇的通道設定到佇列4上,EDMA3CC共有8個佇列,每個佇列深度是16個事件,也就是說一個佇列可以配置16個通道的佇列號*/
2. PaRAM引數配置
根據搬移的資料型別,參照PaRAM各欄位含義,將PaRAM的引數寫入與使用通道繫結的PaRAM中。
*t_PARAM_ADDR ++ = 0x0010000C; //寫入OPT
*t_PARAM_ADDR++ = (UINT)0x00801000; //寫入SRC
*t_PARAM_ADDR++ = (16<<16) + 16; //寫入BCNT ACNT
*t_PARAM_ADDR++ = (UINT)0x00802000; //寫入DST
*t_PARAM_ADDR++ = (16<<16) + 16; //寫入STBIDX SRCBIDX
*t_PARAM_ADDR++ = 0x0001FFFF; //寫入BCNTRLD LINK
*t_PARAM_ADDR++ = 0x0000000; //寫入DSTCIDX SRCCIDX
*t_PARAM_ADDR++ = 0x00000001; //寫入Rsvd CCNT
3. 中斷配置
PaRAM中的OPT欄位中應該使能相應的中斷,另外需要通過設定IESR/IESRH使能中斷相應。
4. 觸發傳輸
a. 事件觸發,通道如果觸發源是事件,即當外部事件發生時,EDMA3自動傳輸一次資料。
b. 手動傳輸,通過CPU手動配置ESR暫存器觸發
*Edma3_ESR = 0x1<<g_Edma3ChanNUM; //觸發傳輸
c. 連結觸發,當上一個通道的傳輸完成碼等於下一DMA通道時,上一通道傳輸完成將觸發下一通道傳輸資料。
5. 等待完成
a. 在中斷復位函式中等待,如果按照3中的設定,那麼當傳輸完成後,EDMA3會給CPU產生中斷,中斷函式中必須將IPR/IPRH清零,方便下次實用性相同的標誌位。
b. 輪詢暫存器,如果未使能中斷相應,那麼可以等待相應的IPR/IPRH位置1,表示傳輸完成,IPR/IPRH必須清零,方便下次使用相同的標誌位。
附表:EDMA3通道同步事件對照表
EDMA3 Channel Synchronization Events
Channel |
Event |
30 |
TCP2_A Receive Event |
0 |
HPI/PCI-to-DSP Event |
31 |
TCP2_A Transmit Event |
1 |
Timer 0 Lower Counter Event |
32 |
UTOPIA Receive Event |
2 |
Timer 0 Higher Counter Event |
33 |
TCP2_B Receive Event |
3-8 |
None |
34 |
TCP2_B Transmit Event |
9 |
Embedded Trace Buffer (ETB) is Half Full |
35-39 |
None |
10 |
Embedded Trace Buffer (ETB) is Full |
40 |
UTOPIA Transmit Event |
11 |
Embedded Trace Buffer (ETB) Acquisition is Complete |
41-43 |
None |
12 |
MCBSP0 Transmit Event |
44 |
I2C Receive Event |
13 |
MCBSP0 Receive Event |
45 |
I2C Transmit Event |
14 |
MCBSP1 Transmit Event |
46-47 |
None |
15 |
MCBSP1 Receive Event |
48 |
GPIO Event 0 |
16 |
Timer1 Lower Counter Event |
49 |
GPIO Event 1 |
17 |
Timer1 Higher Counter Event |
50 |
GPIO Event 2 |
18 |
None |
51 |
GPIO Event 3 |
19 |
RapidIO Interrupt 0 |
52 |
GPIO Event 4 |
20 |
RapidIO Interrupt 1 |
53 |
GPIO Event 5 |
21 |
RapidIO Interrupt 2 |
54 |
GPIO Event 6 |
22 |
RapidIO Interrupt 3 |
55 |
GPIO Event 7 |
23 |
RapidIO Interrupt 4 |
56 |
GPIO Event 8 |
24 |
RapidIO Interrupt 5 |
57 |
GPIO Event 9 |
25 |
RapidIO Interrupt 6 |
58 |
GPIO Event 10 |
26-27 |
None |
59 |
GPIO Event 11 |
28 |
VCP2 Receive Event |
60 |
GPIO Event 12 |
29 |
VCP2 Transmit Event |
61 |
GPIO Event 13 |
30 |
TCP2_A Receive Event |
62 |
GPIO Event 14 |
31 |
TCP2_A Transmit Event |
63 |
GPIO Event 15 |