& V- e+ [, B' w1 C A/ hchar ping_buffer[PING_PONG_BCNT];$ F0 [+ [$ W1 g1 e: b6 H3 y. F
char pong_buffer[PING_PONG_BCNT]; 6 t) ?& A9 x2 X- J# k5 q. i* }. O* s, k% Z; S
) l: L: j$ k8 T& h) ?- \! A+ @& \% [0 T/ ]) G
9 E, C2 c5 k7 L2 J; Vstatic void ys_edma3_init() 0 R9 o1 L# N% n# I& O9 g. @) l2 A{ 4 y" p: p/ i5 y% L% p& p EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; # b0 F' W+ `! f6 T7 N) j EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 m$ D [5 O& S1 m
EDMA3_DRV_Handle hEdma;+ X+ ]/ H3 Y. M2 k% c
uint32_t chId = 0;2 u. L% J) g+ A0 G' A6 F" H) T
uint32_t tcc = 0; ) s4 x8 Z7 h4 e& v' c- h8 M, w3 l+ t0 c, M Y7 W
print2arm("edma3 driver init...",0);, o; f0 I" p+ d6 G# }/ O
* W9 @% n7 |# n! ]. D
hEdma = edma3init(0,&result); ) \" _2 _4 |- q+ P if(hEdma) . }. y; c) Q1 k* n' _ { 1 P4 {2 b$ q! ]/ k- j9 [7 M print2arm("edma3init() Passed.",0); $ w) C3 U$ F: Z0 t } % A6 q- y5 i. W else! e. b# f+ L' |7 q" [2 W
{; C$ m; E) N* z; L/ n7 m
print2arm("edma3init() Failed.",0);% ~3 A+ x2 p' ~& F. W
}; j* p2 L+ q/ c! L; z; W$ O* e; i
/ `1 o% z4 |# s J, q
if (result == EDMA3_DRV_SOK) 4 u- |7 p Y9 N! t6 j! _" v( H/ f( R {' U& ^* d* N& J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,4 X& l8 e" a1 I: G1 a
(EDMA3_RM_EventQueue)0,0 o2 X: h# {# y; J) b+ o
&edma3_isr, NULL);/ N8 b6 k# _+ F) H
} : u* q4 M$ q; u8 x4 P4 b& R7 t, U / ~" O) P/ [/ _1 G7 L if(result == EDMA3_DRV_SOK)1 `+ {6 M% N: p0 }
{4 q! S. e! C \" y+ _
paramSet.srcBIdx = 0;# w( U4 c% n8 V
paramSet.destBIdx = 1;/ y" {5 n. f/ z5 w! l5 g
paramSet.srcCIdx = 0; , J% R5 H' L3 |0 O8 ` paramSet.destCIdx = 0;1 N+ P6 I I% D
paramSet.aCnt = PING_PONG_ACNT; : S- k1 {! H( C1 C. y paramSet.bCnt = PING_PONG_BCNT; 6 F/ p h' c* B/ f paramSet.cCnt = PING_PONG_CCNT; 6 b, j/ Q P9 c' M. ?4 ?6 k ' B. g9 A! v( z' j5 C# c, q6 }$ d
/* For AB-synchronized transfers, BCNTRLD is not used. */ ' G2 ^) n, K) `; b, v( u" T( W paramSet.bCntReload = PING_PONG_BCNT;& k W# [$ C2 I! I4 w8 Q% S
+ g% V) k' H' q9 G" d /* Src in constant mode Dest in INCR modes */- ^) V. F, G! c/ i
paramSet.opt &= 0xFFFFFFFDu; / n; e) O6 U1 e //paramSet.opt &= 0xFFFFFFFCu;5 }: [. Z. R, Y! N9 d0 C
( l9 E8 {% h# n2 \9 [& d
/* Program the TCC */ 5 f: N1 h# t2 y% Y: [+ y paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" {6 x) T7 T, x( g0 k/ Y
" O, J2 R: U2 a1 d; G /* Enable Intermediate & Final transfer completion interrupt */+ k/ O: U! C3 _/ A! U R
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ O) d: u0 u% S o R4 y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. [% H) [/ t( {+ X% B: l
& p- I2 z$ F( D& X' {
/* AB Sync Transfer Mode */ % x* k# n. m* X {1 D4 J3 [ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); + v: f1 J/ z2 _& I 7 u, }7 s- _+ B3 h4 }& \* P; ]; e
/* Program the source and dest addresses for master DMA channel */ 3 w2 e2 T( {; D1 x paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);, W7 Z. u! Q, \) R$ B% K3 F
paramSet.destAddr = (uint32_t)(ping_buffer);7 c, ^7 Q8 n& A$ J; \
: n+ h4 T0 j- _5 m$ K }0 V /* Write to the master DMA channel first. */ 4 l' W7 K: R7 {) g1 M* G l result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); # H% m- u+ A, x9 \( A% B } 3 A, d# r7 i7 p" Y& [' y0 |8 w( H
! f: A; E5 o' g
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); , W' V5 N3 V; _. W" M5 w/ { , j- k' j( g e if(result == EDMA3_DRV_SOK) # }0 n- k1 n6 Q! d {8 z# b# p$ g- U" c" z
print2arm("edma3 driver init success.",0);, I' p& O3 s2 L8 _+ x0 ]6 D
} 9 C& h; C7 w+ \( W} \1 S; _& a3 X. R% I9 V5 T8 W$ w9 r6 H8 v+ i2 L
- }8 ]- O5 o+ S: Z- YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! z% {% j! Q2 e3 q( P( V% f
: P+ M/ Z) x" l8 t Q- }- r
# g u" M5 q1 ^2 r$ r3 S3 ^+ P 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25