. n- ]3 X* E7 X F7 @0 \' \# m: ^0 N" s+ H8 h& |& C9 i
static void ys_edma3_init()' e1 n5 a. {% G1 k6 C
{- v9 E( H# B/ l3 y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; 6 ~* S! _2 t7 w. E EDMA3_DRV_Result result = EDMA3_DRV_SOK; & l. H1 S% x& L' H1 ~ EDMA3_DRV_Handle hEdma;; r) }. j) e* d, P9 X
uint32_t chId = 0;. _& N- \. h- j4 t' w
uint32_t tcc = 0; : I5 U' ~: [; j1 v6 E0 T+ z8 m* u! h- R, b. ^
print2arm("edma3 driver init...",0);0 v4 u8 M: F! A9 G9 z+ [4 T& `3 v
' N9 i# | T) Q5 k hEdma = edma3init(0,&result);0 J3 m! d* y4 @) O4 l
if(hEdma)( Q# n( Y/ d1 r% w3 Q* S! N
{* u; s& N0 ~5 f3 K; B3 _
print2arm("edma3init() Passed.",0);/ @; v% r- e. ~1 B
} $ i0 M. P) U* Y0 Q4 N else; [: D$ U9 x4 I
{ 6 r$ h$ r j5 ~0 z print2arm("edma3init() Failed.",0); ' ? g# w* \* A% } l+ i* D } 6 ~+ V- z7 ^- @' n- g! i 0 s# ]5 v) F; T" v0 n2 }0 k if (result == EDMA3_DRV_SOK) % r3 p$ `' z7 h! a. w0 {) {7 l {7 T9 B, Z& P# U4 K! Y8 R6 L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 U8 M! o7 B6 a, a: H
(EDMA3_RM_EventQueue)0, X. q2 e* O9 h# T9 q& p8 ]
&edma3_isr, NULL);" u6 k+ w8 s- R
} 7 f r' ?- m7 F- t . h X q) q5 `" _ if(result == EDMA3_DRV_SOK) # H5 ^; O5 h9 y4 Q: E { , {7 d# h* _, V) ^- h1 J! G paramSet.srcBIdx = 0;1 u3 u7 q4 ~3 U4 z, v; x
paramSet.destBIdx = 1;+ U( H4 {- o" n6 a
paramSet.srcCIdx = 0; , J8 y# l/ |1 q+ ]6 _6 l9 I r1 L paramSet.destCIdx = 0;# T- r& S, b) ?4 t: o/ ?# p
paramSet.aCnt = PING_PONG_ACNT;0 n3 h: h, u h
paramSet.bCnt = PING_PONG_BCNT; % K# t* I. |! \5 Z8 e paramSet.cCnt = PING_PONG_CCNT;5 \6 L5 m3 ]! v) t0 p4 ?& B; l/ C
! d0 u! H- T" ~0 E
/* For AB-synchronized transfers, BCNTRLD is not used. */ 2 y, |' ^5 t: i7 b% B paramSet.bCntReload = PING_PONG_BCNT; # r" J R- }9 Q# x' K2 N6 z) |* }4 E' E3 `# G5 W- a# `7 a- s
/* Src in constant mode Dest in INCR modes */& M# n) Y& ~8 W! G3 x& L% G
paramSet.opt &= 0xFFFFFFFDu; # M* j( P/ a) W/ T! M% U; X //paramSet.opt &= 0xFFFFFFFCu; + X* W4 q1 o, ^( f 1 C- P" j8 p7 ]+ Y0 Y, L /* Program the TCC */! G. \( F/ G. N0 m2 n9 U' s
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); 2 u5 A" O Z, V' {3 ~4 r8 L2 q$ k , T2 \9 |$ \! `7 p- r /* Enable Intermediate & Final transfer completion interrupt */ ! u& p: k$ ^% T" n4 J; c/ O paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); : [& k4 c' `* K. x q& ~ paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); 7 ?' k' {$ _7 O; I : R. P; _4 _4 y /* AB Sync Transfer Mode */ _5 c8 e. C2 X' _% I paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! b1 w' x& T$ ^/ }0 s, Z
4 W& |2 u& i0 x( a) ~4 P$ J /* Program the source and dest addresses for master DMA channel */& u. C! Z! [( s8 D- w: u5 c) t. o3 d
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ! W- s X* i$ B" O# _1 `8 D" j1 | paramSet.destAddr = (uint32_t)(ping_buffer); 4 j. t% ]# }, X( q8 k" s ' Q& f: y6 e' b( f& H' N /* Write to the master DMA channel first. */- q( |/ F3 R; I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); 2 C R5 ?) ~8 C } - ]- R2 o- I9 C: x' A; C& [8 e
' g3 V* j l7 y. ~ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# r8 T) T* e+ N& f+ W& m
8 Z% k# T8 ]4 V; C7 x: F/ n5 @- W
if(result == EDMA3_DRV_SOK) : K6 ~1 v# q: D+ P) n
{) x9 B/ g" e% _8 d
print2arm("edma3 driver init success.",0); _ r; ^2 s0 K. |) K4 n
} : O" I2 K; Q) d2 ~6 i0 ?; g1 w- D' T
}1 |0 ? ~0 g( Y& z. w* A( T
$ J/ ?. a' g+ |. e7 V4 n; }
+ X) \% A9 \ e6 v5 |! j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' c4 P! ^5 J$ M
3 _# b" J/ ~% G0 P' p+ E+ |6 n' a9 E2 N 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25