标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:, L# o6 L B) ~* T7 C$ P1 N
#define PING_PONG_ACNT 12 g) J2 f8 ^; Q2 q
#define PING_PONG_BCNT 8*32*40 4 _: w1 B) I9 }& ] w
//#define PING_PONG_BCNT 1 ( I% K0 x- D- p4 I" |
#define PING_PONG_CCNT 1; W) p$ ]! i4 u
#define MCASP_BASEADDR 0x01D00000 9 z5 Z7 r" E: q4 p2 j#define Mcasp_RXEVENTQUE (0u) 8 w% o, ^6 u% ]& Z* J) G, z5 f6 i! P6 j& W5 }2 s) i* X$ ]- e. t) d
/* OPT Field specific defines */ " G2 G0 x0 r2 i& S#define OPT_SYNCDIM_SHIFT (0x00000002u)' O' R) t* y6 y, \2 F1 F! `* ]' _
#define OPT_TCC_MASK (0x0003F000u)) r9 x+ q+ |, k7 g6 D
#define OPT_TCC_SHIFT (0x0000000Cu)3 t2 {+ \+ g7 `! T3 p! c: M0 L
#define OPT_ITCINTEN_SHIFT (0x00000015u) , [) u5 B' `! ]1 y! y' h#define OPT_TCINTEN_SHIFT (0x00000014u) ! \$ v+ \; d% `* I: Q$ J; s8 Q( l }, j0 g3 U/ V) r5 ?/ y0 N$ n
char ping_buffer[PING_PONG_BCNT]; % \6 [0 I4 @4 J, gchar pong_buffer[PING_PONG_BCNT]; 0 X7 c# L( b& S d * B8 S2 s) ^) q* n% F5 U8 D5 E6 i1 C8 f5 a7 W9 N2 y% P3 {
- T9 A7 ]6 [0 t" T 5 J* b& D$ {3 m2 Vstatic void ys_edma3_init()1 i F$ u- u! N
{ % |5 c9 ^4 z/ W6 q# O u T: }; Q EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 B1 U4 R" E I/ @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;) W: x" G& e9 A$ d7 }4 x8 J( w! y
EDMA3_DRV_Handle hEdma;% U# ^! ~- s: F* ~
uint32_t chId = 0; ) s4 a: b& p, v3 A# j# k/ R0 l: r uint32_t tcc = 0;8 ]+ U. B: g( l: g$ s& g
& @" \# E" x( o3 W' M' \" ]9 }: q print2arm("edma3 driver init...",0); ' U' ^! ~% b0 x/ T" x" t9 Y! w ( k: P: {4 V. L U5 G0 X8 W hEdma = edma3init(0,&result); . e+ ?9 H2 t, _: X% e if(hEdma) 3 C; z0 @( U2 ?" w* n$ L P0 X {/ ?0 L, I6 o* W' Z- ~2 R
print2arm("edma3init() Passed.",0);" J1 F' E- L0 P l( X
} / _( X4 }1 M6 t7 m2 K else, j& t1 n4 s4 L, k+ j3 X2 r5 q
{ - V3 i) \! S ~' k* f7 A print2arm("edma3init() Failed.",0); 4 b+ A) c% m3 M }! }. q; G' B3 _& D/ J3 N6 ~ J
9 D3 u( H4 y7 }5 _+ H if (result == EDMA3_DRV_SOK). b- i; M' ^& d. ~
{ , E- I& u) q3 n. ^0 `/ p. I; I result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 F9 J, U4 G: w R: N8 ]9 |% C
(EDMA3_RM_EventQueue)0,0 @* N6 r- O& ~0 }" k3 \# N2 F
&edma3_isr, NULL); , m6 [# n! I, l! }8 U+ C2 e0 s }- |9 T. P0 r/ t+ R2 H* z
+ f2 G2 D5 g* ^" w6 x K) i5 e3 ~
if(result == EDMA3_DRV_SOK)5 W/ F9 Z0 W& \5 k8 @( ~. i
{ 2 V/ @7 x) S8 ]" x paramSet.srcBIdx = 0; 2 R- R" s i; U1 G% M5 t paramSet.destBIdx = 1; + ]5 S5 K7 ~" N! ^2 j7 S paramSet.srcCIdx = 0; . c# `# U1 \* i8 J, D* X$ z. \# s paramSet.destCIdx = 0;" H, |' d e" l1 o+ `
paramSet.aCnt = PING_PONG_ACNT; * n4 j' }! b# \8 T paramSet.bCnt = PING_PONG_BCNT; 0 r& C: b/ a, ^' L& g2 \5 F Y paramSet.cCnt = PING_PONG_CCNT;9 P/ j! r+ b' |8 _0 N( O
5 O6 R3 e4 t E: M2 [: o4 _* A /* For AB-synchronized transfers, BCNTRLD is not used. */6 U$ O! _6 N' z' T
paramSet.bCntReload = PING_PONG_BCNT;$ R9 K# n2 t8 @) Y
8 i& P/ j* @- N# V, G7 i, V4 Q /* Src in constant mode Dest in INCR modes */ % Y. h/ }) v3 u" o% H" U4 Z: M$ Z paramSet.opt &= 0xFFFFFFFDu;8 _0 s3 ^4 C5 Q6 x' j% ~
//paramSet.opt &= 0xFFFFFFFCu; & i9 {6 _8 S5 C" R* e+ n! s X; B! X* B) t, R8 n /* Program the TCC */# l( C$ J# ^* e$ T) K1 p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); }! _" o" a7 S. G, A
; @6 v3 m- \9 S7 F* z- y+ ~: C /* Enable Intermediate & Final transfer completion interrupt */ 6 j0 \* P6 T1 P" S2 R' W/ }! @ paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 r3 G9 B% j& k3 J- v) T
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); " ]* U! ~2 p8 }5 Q% Z7 _+ Y& t( z6 b6 K7 u: T0 ^2 Y
/* AB Sync Transfer Mode */% H5 M- l$ b- J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 p' U9 P7 a2 l
: r- ~2 ^2 w% j: {) @1 c, F
/* Program the source and dest addresses for master DMA channel */; V! y, G3 {/ C) U2 I3 B; D+ B+ p7 `: `
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);- E7 l% h/ }1 F- r& O0 i
paramSet.destAddr = (uint32_t)(ping_buffer); ( A# d% n( k9 Q) j: K' Y* G3 x" m8 y! J/ P3 x
/* Write to the master DMA channel first. */1 Y' m4 m5 D3 Z7 S) C1 n( j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);6 D1 |6 h5 T" J" k
} 3 h# O# o7 E+ K% \ @ / P& @/ Q/ a1 a; {4 ^ result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); ' D* U( u5 U$ E0 P( f4 _ . m& _6 p/ W& i6 w" Z- v' l0 T( d% N8 L4 ]
if(result == EDMA3_DRV_SOK) / }: {; }4 w$ j/ G) c { : n2 P2 `0 x1 X( x- o5 q* e9 x print2arm("edma3 driver init success.",0); 8 h: M" C9 E6 |. K$ @# V% t } $ r0 P! `8 {) }: g% Q3 L" _} ! R/ a6 A- ?" \ E/ ~" t( p1 E4 ^4 v/ ~: Y6 u
9 ?& c( I4 S D3 p3 M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 v# N# ^( s' A$ b: W3 v' L
\9 {' Q2 \* P) @
( w4 N, N) o( [+ m; s作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25