$ Z7 y' G3 Y1 D8 D4 t 6 g5 A' y# _/ `' B- hstatic void ys_edma3_init() 0 p4 ~2 E" L( m' n{ 9 T3 M# [) p0 p$ V# s! c EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; - I* U/ v. v& x; B$ F) M1 y EDMA3_DRV_Result result = EDMA3_DRV_SOK; 7 k. _$ ?; ^3 Y# v2 K7 A EDMA3_DRV_Handle hEdma; 2 N# r' N4 u& U5 @0 U/ ^( l# W# X- ? uint32_t chId = 0; / H) K6 d' O- F uint32_t tcc = 0; . Q, i$ i/ Y" K. N1 M3 W9 O: i # Z* d: M1 @+ ] l" d print2arm("edma3 driver init...",0); 4 i/ W9 L; A ^+ N5 } , O% ?+ C3 E6 a4 j) {# J hEdma = edma3init(0,&result);! I+ n# W( C& w5 M, y$ O
if(hEdma) 3 D# E$ Q$ r/ M @ { 9 i) H0 j3 `& j4 `5 C print2arm("edma3init() Passed.",0); " T+ p* l) G& N3 U9 V }! g; F4 @5 i$ H% e, d N9 s
else + M+ R7 A2 }. q8 ]. U$ X$ n. x { ( F& h2 a' K. v0 H print2arm("edma3init() Failed.",0); / K3 J1 x1 R) _: j6 i& E0 R }# L/ X) v( ?( A+ m; `; z2 ?
0 G5 {! v) \3 k) i. W0 m. C
if (result == EDMA3_DRV_SOK)& j+ N" B5 J* E
{ : U! m4 P9 y$ K" u9 T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, " B; H6 c; B6 ^$ Z- X (EDMA3_RM_EventQueue)0, 2 M" K* g* U; _0 W8 \$ @ &edma3_isr, NULL); 6 ~% s% G/ D0 f, L6 h } # Y* y: o# g: \# s f+ v: ` ' ^3 }( H3 p; |: x" v4 O7 C
if(result == EDMA3_DRV_SOK) . e1 U, _$ Q U K1 C# ~" L {6 o% ? Y' [% {) i" N7 q& G. X
paramSet.srcBIdx = 0; / T$ C* q6 j% e% j( b paramSet.destBIdx = 1;$ ]* L) a* o+ _% _
paramSet.srcCIdx = 0; % w6 _6 C1 M, ]5 P: P paramSet.destCIdx = 0; ; u. O3 n* Z0 x: U paramSet.aCnt = PING_PONG_ACNT; + G! A. [( [( q: C" @ paramSet.bCnt = PING_PONG_BCNT;! ]6 H. L: a ]; w, e
paramSet.cCnt = PING_PONG_CCNT;. x+ w% _% \0 ^/ @% P4 k7 t2 V8 T
4 }4 a2 F. g% s c/ k1 B- E /* For AB-synchronized transfers, BCNTRLD is not used. */& c2 S% s! \; r( N' O
paramSet.bCntReload = PING_PONG_BCNT;8 }; @8 Y: S# d- Q6 k0 H
9 D. F9 \0 z7 @: L/ d /* Src in constant mode Dest in INCR modes */. ? [: M5 a J2 Q
paramSet.opt &= 0xFFFFFFFDu;4 a+ A* T- n( j
//paramSet.opt &= 0xFFFFFFFCu;8 O# {' \4 a6 B. F$ t
% q2 D. V1 F" [/ |
/* Program the TCC */ $ A* g' |$ a. ]+ m- j- S- G" K paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); " v6 o% p% s; v6 f/ `3 s. l, ^; R# w: t8 E% G4 C9 b4 w+ `
/* Enable Intermediate & Final transfer completion interrupt */. d0 a; c9 @8 Q1 \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 m$ z; k% t: f
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& y# a: }( r5 T; p" T7 v
# B: v& c6 s; S) f4 n, P8 | ~, e* c
/* AB Sync Transfer Mode */* [- m1 I7 q; c/ q& {9 f
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); $ k) g4 D6 J# U 0 V: {0 H, W& Q5 X4 Z" f
/* Program the source and dest addresses for master DMA channel */2 q$ m$ @9 N1 r+ Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 4 g. y$ ^! _: F- Q2 @/ L) x T paramSet.destAddr = (uint32_t)(ping_buffer);* }1 g$ v% `, ?$ K
9 R+ }7 f6 c! @5 s9 _$ e$ P /* Write to the master DMA channel first. */ " x: V) F& f8 Y" C/ u4 A result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);/ `6 V g: C$ K1 Z
} ?, W& K( f0 }+ u, _
/ ]8 y$ e4 x+ y: o% Q4 a& k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); 6 O; o- A4 ^' f ' }2 J0 e& s+ V- A if(result == EDMA3_DRV_SOK) 5 _# v; T9 k! T, j8 C {7 u# _ E2 S1 r1 p$ k+ G$ G% r# z
print2arm("edma3 driver init success.",0);) ]9 R0 @+ G/ u- X% ?
} ! _* X$ d( j+ r( ]7 e}' `) t1 {# r, w) I6 z+ Y" }
, A- x8 v& U1 ^ S # C) T4 E' G) LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) n9 O' L$ {8 u$ W$ t1 c
7 b, f/ R; `/ s# ^0 C9 E8 [: n, W0 N7 C# |; g6 M 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25