" q6 \: B( @# ~& u print2arm("edma3 driver init...",0); 2 r3 c/ _- A' F. u% m6 D7 j6 Q3 G% p8 U0 g/ x: \
hEdma = edma3init(0,&result); 9 j! b U/ u. W: b if(hEdma) - A# I3 y0 M' @; Q) Z4 ` { ; R+ h/ s+ a6 {0 ~% v print2arm("edma3init() Passed.",0); 1 f! F( u U, q& p. B) z# P8 y3 v }$ R9 x& A4 ? c9 h9 I9 u
else - a. [. G" Q L {) H9 o- p$ l" v+ x0 K& W
print2arm("edma3init() Failed.",0);; g+ ^! I# W' M( {/ k; R# E
} ; `/ s+ d% t; l6 s1 t4 s 6 j4 u% x% D' j8 P
if (result == EDMA3_DRV_SOK) % W! C8 O5 Y3 B k* g: t- @ {) n( h$ M/ I I- \( z B6 M0 y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, 6 {; |+ @4 u f% J. R( v (EDMA3_RM_EventQueue)0, / F( p( F3 z; D1 M+ p: L &edma3_isr, NULL); 3 r. R6 _ F7 E0 W. O5 k# m }( H& s: V. {) e8 O
' w: @! d, c7 E2 x( M- z' F if(result == EDMA3_DRV_SOK)" Z) ?* e9 W. K! p [1 \3 \% B
{* X8 B8 o# }: `& O/ P1 h( _3 d
paramSet.srcBIdx = 0; + y( z1 Q4 S/ |8 A" u paramSet.destBIdx = 1;2 W7 B% `. K# N0 v# _" j
paramSet.srcCIdx = 0;! c% Y1 W2 {: d8 ]2 H# }
paramSet.destCIdx = 0;3 O G6 W* x3 E
paramSet.aCnt = PING_PONG_ACNT;$ L I8 J- U- V, q7 L
paramSet.bCnt = PING_PONG_BCNT; / [% J( [, Z' v1 D% Y5 x# B paramSet.cCnt = PING_PONG_CCNT;& N- S( B% d- F9 `
% i$ A% h8 h- ^. C* U
/* For AB-synchronized transfers, BCNTRLD is not used. */5 u) {! z: } G, N; T
paramSet.bCntReload = PING_PONG_BCNT; 2 H9 A: c- i. {+ O- ? ' p: I- n, u5 W5 ? /* Src in constant mode Dest in INCR modes */7 }6 ?3 W e1 P& d; ^: K# e* e d
paramSet.opt &= 0xFFFFFFFDu;# |; U$ j m1 P- D, m
//paramSet.opt &= 0xFFFFFFFCu;$ S3 Y- B/ U9 i7 ~: |
C& `3 y5 i7 B4 f+ E/ ?$ | /* Program the TCC */ : o7 N5 R' L) w. ~8 P3 a: H3 j paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! p0 ?$ `5 y, B. a; e: @
6 G$ T+ n0 r/ m; q4 g0 {! m
/* Enable Intermediate & Final transfer completion interrupt */7 |2 ^- }' o, M1 T, G, u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 e o# \' z x4 F1 v4 H
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); . n, _: I- j; j 5 V9 m: w' a+ z, {1 U /* AB Sync Transfer Mode */) {$ l' m: l. K+ F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 C/ ~3 _9 y8 x A1 `) b; E
% i7 [ n/ ]/ e: j' u
/* Program the source and dest addresses for master DMA channel */" E! W; M! I" K5 c1 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 1 u9 v8 H9 l8 Y s: @8 a paramSet.destAddr = (uint32_t)(ping_buffer); . z, j% r$ z! { + v2 e( w8 V- i1 U. T c /* Write to the master DMA channel first. */ 2 O, Z4 g- X" x3 a) [1 w5 c1 w: R result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); 8 z b' r/ z; N: G% ]+ l- f } / c# d( b' I) _# K5 c& k, B K
8 u0 P0 \6 E, r" q result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); 5 s3 ?4 e6 K3 \$ B( X5 ] U % k& N4 W% X8 ~0 c. N. p& c
if(result == EDMA3_DRV_SOK) , E- d4 x" u: Z0 n
{ ' N1 b5 c" e: s& ~* D( c print2arm("edma3 driver init success.",0);* L- Z% l* Q3 t
} , ]! _1 Z+ y+ l2 L; I1 }) U5 w, ^}+ n3 \; w) f3 J% M
8 F5 [- b, F# `9 ?
" u- M3 U( Z6 CEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 % j4 H0 Z4 l: F+ s5 U- J0 a, J# {( ~ " h `$ m4 G3 C$ w0 u Q" {! K! S, D* w4 ]% }5 T 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25