( x0 Q3 F2 @" ]static void ys_edma3_init()- O; a/ y5 E0 u; y
{1 U5 ]2 v! ^) \4 M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; * i( @8 J1 h/ O) E9 L EDMA3_DRV_Result result = EDMA3_DRV_SOK; & j# p1 y! H1 W9 `' i" q EDMA3_DRV_Handle hEdma; 0 _+ I+ M$ a4 E) F7 y; I! l uint32_t chId = 0; % l/ L! d j8 {9 O+ P, K) } uint32_t tcc = 0; w& M# v/ D" Z& |# r" w. b
" t. n5 L, I' j
print2arm("edma3 driver init...",0); 5 q+ P" v$ S2 Z6 S& J 4 D1 F% A$ m& X' V" Y9 `1 ~( g hEdma = edma3init(0,&result);( v8 E; g) X. N
if(hEdma) # a$ S8 M3 X4 w/ h8 {0 o" ? { 3 w: H6 _. q. U0 r; \+ e4 ` print2arm("edma3init() Passed.",0);& _, V! R9 |7 n+ e8 d" x- {$ h, ]
}8 p; i: D, e# T& R
else # F" @' T/ b; B7 m {( d5 F0 |& R+ _) S7 G# {
print2arm("edma3init() Failed.",0); , E0 f+ Q' u0 y- }5 r }/ I0 k0 ^) x8 J& t& |
- A& l( J& n( q! |
if (result == EDMA3_DRV_SOK) " O- p+ v9 f0 V( ?* M { $ H- Y( K- N3 o7 p7 y6 K q result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 [& G0 O3 k2 q0 S% H1 c
(EDMA3_RM_EventQueue)0,# X1 J7 W* B& U1 n3 A% i
&edma3_isr, NULL);! P/ y' E- a5 Z
}0 K) f8 e1 h6 S4 V* x
$ _0 o2 _2 U" K
if(result == EDMA3_DRV_SOK) & M+ ~/ U8 U; R { 6 C. g$ j8 U7 q paramSet.srcBIdx = 0; ' H2 t& R8 s5 B" j$ ^' Y ]* p3 v paramSet.destBIdx = 1;' h' r4 p t" \: ~& G
paramSet.srcCIdx = 0;* x6 {- A" X+ N
paramSet.destCIdx = 0; 9 k; A1 _5 ]2 ~9 s" a1 K* J paramSet.aCnt = PING_PONG_ACNT;: e0 ~' D( {: m0 B/ ], d. @& |3 A
paramSet.bCnt = PING_PONG_BCNT; , L+ [5 i+ k) H# A9 a2 V paramSet.cCnt = PING_PONG_CCNT; 2 c. I( n( \8 X2 v: d: ^ 5 d! j, r- _' a* j6 n8 ]' \
/* For AB-synchronized transfers, BCNTRLD is not used. */ [. A+ A/ p- C) G% @# o% `
paramSet.bCntReload = PING_PONG_BCNT;( z- }# i2 @/ {) v+ y. J
$ q) E" w% K2 Z" G) L
/* Src in constant mode Dest in INCR modes */ + a) P) r* v& ^: \1 h paramSet.opt &= 0xFFFFFFFDu; 2 O' C* G1 W, m# ^7 H4 t e: v# f //paramSet.opt &= 0xFFFFFFFCu; & z: B3 s+ D w0 h) r- Y W 4 }; @0 C2 R9 Z3 e
/* Program the TCC */6 g9 R& J! ^% a, }, ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); * t* r6 l1 `7 [% ^ 7 M5 [% ^% j, o /* Enable Intermediate & Final transfer completion interrupt */ " g: Q! y6 i6 j3 `( ?2 V2 l9 l paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% _+ }! r* g- r% _' B
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);: r$ S, ]% N# l$ j' L: e# k
. l" Y h- U2 l1 K /* AB Sync Transfer Mode */8 m0 T" |4 V' ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); ( ^1 ?; k5 q& X# I. ? $ B0 t3 O. N3 T3 B5 D6 C /* Program the source and dest addresses for master DMA channel */ 7 i1 Q, [1 m' @4 G l( x paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); $ f% \2 G" G; m- f$ d paramSet.destAddr = (uint32_t)(ping_buffer);- ~# e3 `0 R) V& q2 {- h& d
" r0 ~ `. z/ h. G9 O3 h6 S
/* Write to the master DMA channel first. */ ; T. `4 L/ N' F$ |: {0 { result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);% }7 R: C) a; y# x0 _7 i# E5 ?
} ' M1 U2 f- s; L8 \0 Q$ }& V0 z . e$ D/ `5 g& A' s result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; U: Q% p9 W2 f! F# e" d% L
7 Q, G5 {' w4 k if(result == EDMA3_DRV_SOK) 1 L+ u5 z$ V% u T2 `; g { 6 y' b/ A. a! q, `7 L# B9 X2 h L, T3 x print2arm("edma3 driver init success.",0); ( Z" L. M3 ?8 n* ?& q& R, [1 ?4 D5 H) G } 7 Z0 ~: q4 R% R- z} ( d. F/ H, g1 r) I6 | : \5 K+ b8 X3 ]: B% c' y8 c) i' c+ w$ I9 ~# f9 S
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 * i7 @2 U4 Z6 g4 F + u5 V4 k7 w# T# V; H# U 4 E5 w4 w9 P) c* H9 B作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25