9 p6 b( z) B5 Q3 x M' n6 Xchar ping_buffer[PING_PONG_BCNT];' a( L) \+ j) O$ K5 ~6 s F/ k! T
char pong_buffer[PING_PONG_BCNT];6 ?' m4 ]: i- I& o% c
8 Y4 W% u X9 D$ D/ E1 T% y. y( ~. ]* g( O3 M) S
' t- N" l2 e& P5 W7 P/ U 2 H- v& [- K+ Y0 f/ |7 M9 Astatic void ys_edma3_init()3 J+ i5 O* @! M. N6 R/ r
{ / n- N$ T( a/ K8 V, P. G- [ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; , r% v a: e% W2 R5 v, n: b EDMA3_DRV_Result result = EDMA3_DRV_SOK; 6 a3 Q' K4 N& W# B: R EDMA3_DRV_Handle hEdma; ( d' G# |$ `4 Y) r Z0 Z" W. W uint32_t chId = 0; $ ?. q4 Q8 g% W/ j uint32_t tcc = 0;6 O1 F: F m* D& o5 p" s
' }! e/ T/ K z& a! x8 U print2arm("edma3 driver init...",0);0 Y9 Z+ n7 J* C4 e
. R0 \$ e% M% w* A' P" L+ J/ g+ X
hEdma = edma3init(0,&result); * E( |# h7 k2 \. } g* g if(hEdma) * X! {$ t, L% W) `& B { / s s' _1 w# Y3 C2 @% |, D print2arm("edma3init() Passed.",0);5 I) j4 D% j6 }$ {3 `4 f
}& E2 N. A# [) k. s' F8 j! A. D
else " ? z5 ^8 ~/ o. | {# i5 h; \' y- L( w! ~! \4 G
print2arm("edma3init() Failed.",0);; d2 A) S9 P0 ]3 U
}* R+ c* P$ z8 X" s- R* Z
9 |* x! p' ~5 w1 J if (result == EDMA3_DRV_SOK) 2 x! p9 \# W) r; D5 F {$ \9 e7 a" \, V: j% S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 z! l- N4 H9 p2 k) }
(EDMA3_RM_EventQueue)0,7 R6 w3 K7 u9 e5 k3 P. s
&edma3_isr, NULL); a3 Q \% a& l
} ) ~5 c$ p X; M% z! J- Y% k3 U % o: I8 W6 Q( o x* w if(result == EDMA3_DRV_SOK)/ w. W. z' N! ^, K) p2 j* E( t
{ * \- x* A r* o5 V. [# Q9 R+ a paramSet.srcBIdx = 0;" A" ^) p% G- p$ x6 O
paramSet.destBIdx = 1;/ P$ O% {! ]* Z6 x
paramSet.srcCIdx = 0;9 Z1 U7 D6 n$ x# v
paramSet.destCIdx = 0;) O/ {* k8 z, K' s; y5 @) e; |& ~
paramSet.aCnt = PING_PONG_ACNT;' l' q2 q8 ?. z9 o E& s
paramSet.bCnt = PING_PONG_BCNT; 9 J6 T1 C" L4 P$ y J% \ paramSet.cCnt = PING_PONG_CCNT;$ u; o" [$ _9 C0 c
! u) m$ \8 N( L /* For AB-synchronized transfers, BCNTRLD is not used. */. J0 R, W! V% }8 v9 k
paramSet.bCntReload = PING_PONG_BCNT; 8 a6 `' y* h4 v! H0 M- N6 S0 f* O * F. e* X) V- S: V/ _/ A /* Src in constant mode Dest in INCR modes */& L" F e! v$ T' w' a# Q
paramSet.opt &= 0xFFFFFFFDu; * S! ]$ N% E$ Z3 ] //paramSet.opt &= 0xFFFFFFFCu;1 v9 {8 b/ _' w" N+ i% x5 ?
8 }/ `! V8 ?- X. e$ n /* Program the TCC */! N+ {* D; @$ E6 {. `4 |' W
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 t1 ~% Z0 U- u) K( t
: \: e0 L0 U. X& L! g /* Enable Intermediate & Final transfer completion interrupt */$ g4 S3 U% w" x% n) r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ; H* i# c0 W8 a K# M" M- n3 g7 i paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 o \" @7 K0 @; K, m" M( y2 [- H
_ {, f) v" ]
/* AB Sync Transfer Mode */7 ?; A- c' M3 P) `/ ?- Z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); " G+ N) l$ e u& W5 U1 |. F. G 7 m9 n9 U& d$ s7 G
/* Program the source and dest addresses for master DMA channel */. U* D# a7 ^9 b5 e9 M3 ]9 Z- ^6 s3 Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);; L4 ]3 w$ w3 J! @4 U; ^7 @) m& i
paramSet.destAddr = (uint32_t)(ping_buffer); 6 U5 L* P: U/ q% ?% C% f 9 |2 N) y& m& S4 w /* Write to the master DMA channel first. */ ; |6 d3 j, W7 V9 x2 t, R result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);, c Y1 Z3 G" @
} $ j4 a8 J/ G+ o& q! ?7 @ 9 [2 Q/ p! z: P- { result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 D& P7 C. [! F
& }& P' J6 u9 ?# }: t( Y/ F if(result == EDMA3_DRV_SOK) # D) z0 ]. N8 X3 X+ N { , N) a, ?2 W+ C' f0 Z print2arm("edma3 driver init success.",0);% q" }1 L& n S6 S
} ) P) {: f8 S/ p: R
}. H6 N9 [* G/ X8 v) [7 P
; m) V. j8 T9 w5 G
8 ]2 q1 v# y7 Z! R( F' REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 9 K) O- }0 J) F1 b R6 h r, Y0 v. d4 S V ( g; W' x1 F( n' V5 `- u$ H2 J作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25