8 ^% U% p. ~" ^/* OPT Field specific defines */ 5 E9 Q! k6 w1 T5 T( |) \% m! A#define OPT_SYNCDIM_SHIFT (0x00000002u) & b' w3 @ C' C( u#define OPT_TCC_MASK (0x0003F000u) - N( h9 d4 Y+ P4 ]2 m) C. c; \$ C" J#define OPT_TCC_SHIFT (0x0000000Cu) $ ^! Y% ^' I" O, S* u: M#define OPT_ITCINTEN_SHIFT (0x00000015u) # N- d8 A% t) C, v#define OPT_TCINTEN_SHIFT (0x00000014u)* q' u1 q7 g% {2 r5 D; |
7 v B; ^: }. }7 V
char ping_buffer[PING_PONG_BCNT]; , y3 L) x* i6 v' ^ [char pong_buffer[PING_PONG_BCNT];* a: a3 a7 E" z% w1 h, `
/ Q, S* P- w+ j8 x9 R
" l; w3 q5 G% O) X7 R$ {1 _+ k" o/ S
, p1 {5 L1 t. Y/ Z' Y
$ }- N' c- `8 `, F! `5 [# c! s
static void ys_edma3_init() 6 [# b; [! W8 A) U{ " ^- K1 e# s! X: S1 @& o EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; & ]' ]0 g) v& C5 `8 F2 X EDMA3_DRV_Result result = EDMA3_DRV_SOK; 4 ?4 U a/ V: F4 B( {, a& B% h# Y EDMA3_DRV_Handle hEdma; + ~* Q7 U* y: m: w. H% }5 [ uint32_t chId = 0; 9 w3 J6 c- H H' m G uint32_t tcc = 0;5 X7 B6 N4 Y& D( N: [+ N- Q
2 ?; \' |& O; y+ k( J print2arm("edma3 driver init...",0); . ~6 [( c1 \6 S( T1 x; r( b/ c 0 E/ M% l7 o/ B hEdma = edma3init(0,&result); ( q% ~, y5 N! x1 c if(hEdma) : E8 I' P3 I- v2 M( f8 o { , U0 {. s. m9 M print2arm("edma3init() Passed.",0); 2 r) F5 u4 a0 F8 Y }. h1 V) ?& s2 g+ L8 M! m2 w
else; C6 j: D& B; Y/ e) G5 T4 h
{ + p% b3 @" ?. x9 D& p3 s' b print2arm("edma3init() Failed.",0);0 J, u5 F7 r/ {! h) @
}, t: p3 s% a5 y4 {! ]: ?: l4 N6 n2 P
1 h1 D+ }5 l* U: @7 i: ]! f: f
if (result == EDMA3_DRV_SOK) 7 I7 d9 W4 x, @; i0 }5 z+ a2 Y/ d { " t& ~( {; T6 P/ P# C ]) ~ result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, g4 R) T) G3 L9 X) H
(EDMA3_RM_EventQueue)0, - i: | M# z! c g6 K &edma3_isr, NULL); 9 c* i6 R3 M! L& y } % ] {2 o6 g3 c5 e/ Q1 s 4 c Y6 A; E2 w* j+ B% p if(result == EDMA3_DRV_SOK)- I4 ~5 A$ [/ M' R
{- e* y/ G" W# C# E h* C# @
paramSet.srcBIdx = 0; * T+ O W( W# s' g: e' Z! K# l paramSet.destBIdx = 1;% ^+ [" f) O N1 c5 C0 W; L- W7 g: {
paramSet.srcCIdx = 0;+ s7 S2 {% {+ j) }
paramSet.destCIdx = 0; 7 u7 ?& R* S9 D paramSet.aCnt = PING_PONG_ACNT;; }# m6 `: `0 K5 P! @8 Z
paramSet.bCnt = PING_PONG_BCNT; 2 ]2 n) H6 c( I& V paramSet.cCnt = PING_PONG_CCNT; e% w# ^7 Q( x X6 b- B; O7 ]7 g
j, o$ k: {( e/ e5 f0 ^
/* For AB-synchronized transfers, BCNTRLD is not used. */ # w) \% c" P# S1 I paramSet.bCntReload = PING_PONG_BCNT; 5 O% {$ y0 I& v1 z5 J6 r" b& b6 E" V! m9 a) b' X
/* Src in constant mode Dest in INCR modes */ : ?+ S; ]. x' J5 o$ ]3 u4 V paramSet.opt &= 0xFFFFFFFDu; 0 E- `1 e4 E6 u. h5 v //paramSet.opt &= 0xFFFFFFFCu; , P4 ?+ W& X! y8 S $ G4 o R# `7 e, T2 c8 i1 |1 w% k+ ^- k /* Program the TCC */ ' j+ G& \) U' s6 {0 }5 C3 Z; b paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. g8 e ~+ ^2 Q' A. n6 t/ c7 w
, Q3 I" N) Q% `7 [. r /* Enable Intermediate & Final transfer completion interrupt */5 ?( z) Q) S1 t+ K, H4 A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ( h% W- Q2 K5 Q; d2 e paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); ' a4 M$ _! ~: @& o: H1 G 3 H( _: B4 e6 ~ /* AB Sync Transfer Mode */% s" ^+ e2 ]$ ^: K% u: n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);. l! V2 ^" a/ i, t6 |
" {% K$ X) l6 R# ]( { /* Program the source and dest addresses for master DMA channel */ 8 |' N5 x9 ?; c paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);& J- C2 W% Y2 @+ P) D: X
paramSet.destAddr = (uint32_t)(ping_buffer); : E+ V( _4 f6 W4 V & Y6 q6 Y/ K; K5 L8 T /* Write to the master DMA channel first. */ % T) v! j; W' H/ M. Z7 A* ]2 k result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" b0 x- ~ m# P- r6 q
} % C4 k6 f; |0 N* A" C! s9 ?( p: M$ _$ \/ c
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); - ]& e* A# |' v4 b" @ p8 Y" ~: {# x$ F3 w
if(result == EDMA3_DRV_SOK) 0 M. x! G$ R' d) q% V( [, M { 3 x0 p8 @# w O- x' V( P print2arm("edma3 driver init success.",0); 5 t* B- u- Z0 Q4 E+ E" S# F, X" } } . y8 ]4 s% s) o- ]. X& w}& Q5 M: t: p. J9 t; \9 r Z5 T Y* O. R
- S- Y5 I P5 I. J( l# I6 n' L0 w- m# Y: l' m5 W! @/ s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# Y! H1 ~% [2 J3 ~0 g c6 k0 z
7 L& R4 g4 a M5 \