8 d; U6 b- r8 M) E- a( `static void ys_edma3_init()& J4 O) ~" ~2 Z7 C% l* v3 W
{0 m% g/ z/ o, E1 m {: x
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! F6 P0 e, N( B
EDMA3_DRV_Result result = EDMA3_DRV_SOK; 2 ~1 w8 Z; J3 B; N3 Z$ Y EDMA3_DRV_Handle hEdma; / e8 s: A3 w) x* C4 e uint32_t chId = 0;9 n5 N/ u. M1 Z; y
uint32_t tcc = 0;! B7 b% ~& S; y. ?# j; E+ h- A
4 N' T; K1 r' F, E( a2 a print2arm("edma3 driver init...",0);# I! z) S1 m6 I7 H& E' K
& M7 Q P& W* _/ f4 Q, P1 P6 p
hEdma = edma3init(0,&result); ' Q8 N* @6 g* Q& a, l9 U4 t) J if(hEdma)# A' H, I" O3 `$ d8 e
{ - C. |7 S* P' T' b print2arm("edma3init() Passed.",0); ' \8 j( ~7 w. F9 b% S5 F1 V }+ G$ I* O' T3 h
else % n/ I: z: K# O" r* c! d! S7 [4 N {- E7 b5 G1 V+ A
print2arm("edma3init() Failed.",0); . `& z- O$ q) B; M1 ^2 L5 p } 1 |& T- O0 D {( O/ w# y* D s4 I: A2 L $ a2 I H& u- l* S% Y
if (result == EDMA3_DRV_SOK) ; @ l6 j' H8 d, y/ p- @ { * N. m0 z4 @, X* e/ w- L% r result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 B2 [% Y* j" _) z3 N
(EDMA3_RM_EventQueue)0,6 C9 \( p6 Z$ [$ p& y0 L
&edma3_isr, NULL); , J1 [7 |) F0 o$ ~: l3 L" q% D }0 H: A D4 Z; i ]) B
) E% ]/ S Y% b9 ~
if(result == EDMA3_DRV_SOK) ! |) `/ y; \% N, x% V. p5 n6 x. z { % k" B' v' j- K: C/ G paramSet.srcBIdx = 0; ) L* l2 z+ C$ X. ` A paramSet.destBIdx = 1; 7 a; z5 _$ ~9 s ~, H paramSet.srcCIdx = 0; 0 j+ e% U( j3 ^ paramSet.destCIdx = 0;/ s& p8 m J5 b4 J
paramSet.aCnt = PING_PONG_ACNT; 7 J6 M( u- }0 O* \; x paramSet.bCnt = PING_PONG_BCNT; 0 @, C% {9 d6 w- h) b$ F- M$ ^; {7 t paramSet.cCnt = PING_PONG_CCNT;1 C4 R w/ I. @
5 g9 g3 M, j1 c T /* For AB-synchronized transfers, BCNTRLD is not used. */; D8 m% j( r9 s) \
paramSet.bCntReload = PING_PONG_BCNT; 0 `1 S4 X2 L% q4 U+ q# ]4 l! j8 ?, {( H
/* Src in constant mode Dest in INCR modes */* Z- z0 t: p+ G) r$ b4 m" H: N
paramSet.opt &= 0xFFFFFFFDu;5 R. a4 Y. i! ~* W5 S# q3 m" @+ V4 g
//paramSet.opt &= 0xFFFFFFFCu; " b9 H; X9 ?% S+ P" X " A8 m6 [: G S* c3 p /* Program the TCC */( ?7 A& x2 \8 A: T4 E
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 n' _" K+ t( X* b6 ?% v# e
$ D' a4 N) _6 l% P. l. q8 D# `1 a
/* Enable Intermediate & Final transfer completion interrupt */! m0 L' o; }2 e6 @: F
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- a4 T' w0 a- H* n
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; @; S' U4 Q/ B7 y( D
2 C2 B( q1 b* j" |+ X
/* AB Sync Transfer Mode */ $ M& ~: N8 L. L$ j3 N- O0 l paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% Y, j( X$ F h I5 I
. Q m7 W% M$ O3 @2 ~1 | /* Program the source and dest addresses for master DMA channel */ 4 z* k9 o, `2 ?+ s' Y" F# e" n1 v paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);; G2 u! z& g+ v# D4 D. X
paramSet.destAddr = (uint32_t)(ping_buffer); 6 N$ D& v! P1 A$ @ _1 J! V# G6 H: H. b) Y- Y8 u; G- s2 R0 ~; U
/* Write to the master DMA channel first. */, u d) M1 G& {! F
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);$ h! v( W: }* E- i* R% W& p* P# K
} / S" v% K3 z) h$ b- R
* p1 g7 b8 c; [; {
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); p1 P% g n* {; M8 w) l " f! s( Q& o, N5 A" P, B if(result == EDMA3_DRV_SOK) 7 O) r- @# F' X+ | k7 A
{* J7 F7 Y! X. H
print2arm("edma3 driver init success.",0); : _* z, ]) [: m2 X, w& S7 ? } $ {% b" x, @7 `2 h2 _} 2 N9 u- K1 o# I' p9 ?5 _/ k1 i) C7 v+ Y& L- z- v3 n( h
* A+ o8 b$ `3 m; s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 \$ N& o$ N9 C
! W+ T P2 c% Y* R+ d4 S ! g# f, N& x5 w$ T: f4 [: e作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25