G. ]" |# Q! g/ x! Q( s/* OPT Field specific defines */ 1 ^2 N6 e" t* P; j! I#define OPT_SYNCDIM_SHIFT (0x00000002u) ( O( ?7 [! j' F+ A* k1 \#define OPT_TCC_MASK (0x0003F000u) . J$ S6 k7 V V' ~5 p#define OPT_TCC_SHIFT (0x0000000Cu)0 E- _& |. v6 g+ t4 N, X
#define OPT_ITCINTEN_SHIFT (0x00000015u) 2 g! M' f E8 p) R% J#define OPT_TCINTEN_SHIFT (0x00000014u) / D$ e) A+ U. ^3 D1 K- }/ ~# R/ c9 p8 \9 i
char ping_buffer[PING_PONG_BCNT]; . E8 O2 _6 Z1 x* n! ?; _0 Achar pong_buffer[PING_PONG_BCNT];9 @. [% ?" J2 Y h: ?+ I/ t
. s) m5 n, j. S" F$ C
: _3 X! R- L$ z) ~: \+ @, B; ^# y - q% A' ?- {" l' x- G3 I 6 n# v m# |- T. H Kstatic void ys_edma3_init(); F2 L7 a6 Q5 e* U; a
{2 } ]; Z( D8 O3 H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};9 e P, a3 T2 @5 E* t B" @5 w/ _# a
EDMA3_DRV_Result result = EDMA3_DRV_SOK; + _* W+ X% J' I. Y EDMA3_DRV_Handle hEdma; 4 U$ m, e, @/ r8 v( m uint32_t chId = 0;1 @8 Q- V$ c: E# N: ^2 {
uint32_t tcc = 0;6 L. Q' Q* s' y" X/ r
, y/ i0 u$ _+ b9 B' Q2 I print2arm("edma3 driver init...",0);- u& G- f* H9 ^- E( f H
) l9 J @; T7 c% w3 n
hEdma = edma3init(0,&result); D7 [- p: G1 w% S$ v if(hEdma). ~( J; U+ D4 Y" L: {( b
{1 d# s0 v; m R3 X( `
print2arm("edma3init() Passed.",0);8 t1 f" ^& Z- r( p0 w. o5 L
} : R: F) G" ~9 C: p% i else % f- M; G4 n H5 j* u+ W/ G5 T, x4 R {, d' `# P' {9 Y; ^9 \! ^+ l
print2arm("edma3init() Failed.",0); + a/ Q# a5 E# H/ U }, D& s V9 G& ^1 I
. c8 o$ T/ A1 r4 e7 a if (result == EDMA3_DRV_SOK)" Y: [5 v% Y9 Z2 e
{1 d2 b8 v5 I2 S$ Z3 |' u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, " ~, Z! U% u* Q (EDMA3_RM_EventQueue)0,( O" t* C$ L. y2 B
&edma3_isr, NULL); 9 t7 ^: E2 u* {: o } * k1 W: A/ b; t t5 l 4 p; U3 i" g p5 r
if(result == EDMA3_DRV_SOK) / \ Z, n2 S* O& B% A* H1 a { % G" H0 I" Q1 i G | b paramSet.srcBIdx = 0;! h4 N, I( v& v! e, K
paramSet.destBIdx = 1; 0 o$ z6 {: k8 L0 j6 u" X* I paramSet.srcCIdx = 0;. j7 X" q' g! C* i5 _
paramSet.destCIdx = 0;9 K, t! e% N+ T1 P
paramSet.aCnt = PING_PONG_ACNT; . G2 U$ `# s! T& h0 \ paramSet.bCnt = PING_PONG_BCNT; 0 ^9 D1 E! I2 }9 p& n& l( g% j paramSet.cCnt = PING_PONG_CCNT;" j; N5 Y% i. _; O, P2 a
5 R3 v9 b7 j2 z+ x' | /* For AB-synchronized transfers, BCNTRLD is not used. */. w9 H" k* j. B4 v. i' \
paramSet.bCntReload = PING_PONG_BCNT; , U: @# a7 b0 C6 h % v1 L# a" s6 M8 M) T /* Src in constant mode Dest in INCR modes */$ D% G: }; e% ~- X
paramSet.opt &= 0xFFFFFFFDu;% q* N( D5 d9 V
//paramSet.opt &= 0xFFFFFFFCu;8 Y: J" a) d! `* C. ?# O1 S
. O3 {0 i/ @7 z1 ^" P' p
/* Program the TCC */ * a' i! Y2 O' P paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); " ?8 `! p X& v: l" _& q) G" P6 R2 f- `
/* Enable Intermediate & Final transfer completion interrupt */1 n" B) K8 Z; K2 Z" m
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ u3 W; [: u1 M+ U1 p6 t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); , e* J, D R& R+ F1 g, k( S% P, w. _* x- S
/* AB Sync Transfer Mode */* E" M4 ?' h, V C6 G2 b
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ E0 ?$ G2 e' _4 k
8 B4 X0 C( B( C& H /* Program the source and dest addresses for master DMA channel */ 9 |; ^+ ~8 Z. w/ M g paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);* o3 _ i8 S* Q; r2 O3 C8 L
paramSet.destAddr = (uint32_t)(ping_buffer); ) @* h; y2 \' d- Y( @5 T! d, T5 m# t% ?0 J8 M' |& H
/* Write to the master DMA channel first. */ ' o3 K6 V3 {; o( G0 e, r6 W6 T result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);0 |! L' l6 n, ^$ J
} 4 h1 D4 \* `! M$ [4 v( J# b; R8 W! ]1 U" d+ }$ K
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); * b, B' }8 z7 W' } 9 C+ G" f8 c l# m& q- x& S# [ if(result == EDMA3_DRV_SOK) 4 E& k$ w& C- ]. B: j& ?0 d
{7 N' x% S( c; y3 d3 E! J
print2arm("edma3 driver init success.",0); 0 J. l# d5 t, v& k v, x } ' S) f+ k* l8 i3 N/ w
}& c2 y: C5 R! S! E
$ x; k) |. L7 A/ A
" g1 t6 g- p6 D: v5 O! m& g5 G( t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 * ]5 n9 V6 n# n3 f8 A% D/ e6 v' d% V
, B. H3 x- {4 f2 x0 G# l; B% B作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25