标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: 8 p7 e* @, M0 F! @. {* O#define PING_PONG_ACNT 1' e, i( C9 B/ w
#define PING_PONG_BCNT 8*32*40 0 [4 w b2 B; l/ D//#define PING_PONG_BCNT 1 6 I% D6 V. I- O, @9 {#define PING_PONG_CCNT 1 x7 y8 o3 k9 D% v. X
#define MCASP_BASEADDR 0x01D00000& h! O5 e3 a. f+ b' p
#define Mcasp_RXEVENTQUE (0u) ( g/ k3 d0 ~; C; k- `) B5 [9 Q8 U) W- Z1 D5 r
/* OPT Field specific defines */( M* S1 g: w' o, [% Y
#define OPT_SYNCDIM_SHIFT (0x00000002u); u' O! C5 Z9 ^9 K+ d
#define OPT_TCC_MASK (0x0003F000u)8 n. R8 I; T2 @, I+ d n) o6 t
#define OPT_TCC_SHIFT (0x0000000Cu)7 D" [+ b' b. o1 p, W
#define OPT_ITCINTEN_SHIFT (0x00000015u) 0 p& L1 G+ N* j7 Z7 L& E& z#define OPT_TCINTEN_SHIFT (0x00000014u) ) k" F0 V" g$ S0 Z. C' {& D) I2 W/ F& [5 N, W% ^' O) I" @" O& H4 G
char ping_buffer[PING_PONG_BCNT];5 F% h" b" K- g: Y n5 \2 ~
char pong_buffer[PING_PONG_BCNT]; ! [& ^. {9 F5 l% q+ k8 s 9 ]1 o. u1 B0 d' _* j# J6 B " w" F2 |8 Y# G# M) B; r/ G8 w ) ?2 j0 E) q" M: d6 z / N; @6 F8 y1 M% S: i0 @, E0 cstatic void ys_edma3_init() 4 D; M6 c4 K6 a) B# A' M) V* ?4 ~. p{ 7 h% I! X! _+ p" Q EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& K: s5 f: K3 X6 r ~( h
EDMA3_DRV_Result result = EDMA3_DRV_SOK; - p8 L* r$ e0 p9 M# Z. a EDMA3_DRV_Handle hEdma; " A8 Y! ^/ V' N) n, y8 y uint32_t chId = 0; - |0 D5 H8 \, r7 h5 b" U5 I a. r) g uint32_t tcc = 0;# u+ `* A1 m! P1 B3 |, P9 ?
8 _. |* s3 l" `' a# W
print2arm("edma3 driver init...",0);3 |7 N( J, D3 o3 @; B7 {
2 W* v, M6 w8 A: X
hEdma = edma3init(0,&result); . r2 M5 g! R+ t. U' S- q( F if(hEdma) ' o( O9 k; A" i* ^) o) X& A; d: M { 6 Q5 n) `4 D+ g4 {& F5 ~* U print2arm("edma3init() Passed.",0); : u6 z, v: v q. i: R1 ~9 P" e } 5 l0 p, t+ h" d i% N+ J) e. P else 0 z+ ^6 t# V, I8 U8 I0 { {- p: S% ?8 j# M$ t( H* l
print2arm("edma3init() Failed.",0); 2 P2 R; U* i( c8 e- o) q; ] } ) H* N) y/ g! \- O6 `7 ]0 @ $ j% H' f, }; B. N2 l l* I if (result == EDMA3_DRV_SOK)3 E9 O4 {1 |5 R: A
{+ ~9 h# Z O1 E1 t
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 c# d" ^0 B+ q8 Q3 M# ?4 J3 ~
(EDMA3_RM_EventQueue)0, {6 G( h$ z+ C! \4 z8 w2 q
&edma3_isr, NULL);7 y# f; w4 U0 g2 S6 M" P' W; C1 ]
} 7 M" k( _: m! f# a7 T 5 r5 [1 Q3 s* o. B' R+ I
if(result == EDMA3_DRV_SOK)4 i% w l) B8 S/ m7 k# e; N0 N
{2 R" z$ K2 A' L1 }4 u; @6 C
paramSet.srcBIdx = 0; 6 B9 K' C8 R5 Y1 s& ?& G paramSet.destBIdx = 1;& ]0 V: J0 l3 |( L- l# ? g! Q
paramSet.srcCIdx = 0;9 \9 |" Y' {3 ^* }& c. j1 q
paramSet.destCIdx = 0; $ a7 M2 N5 B' N- R$ O3 R$ H paramSet.aCnt = PING_PONG_ACNT; # A6 U2 q$ R, u5 e paramSet.bCnt = PING_PONG_BCNT; ! U$ P7 S# X! y5 ~/ ?2 y! P; V paramSet.cCnt = PING_PONG_CCNT;+ P0 F+ m" i' a' _) v
# ^( S; o/ C, D /* For AB-synchronized transfers, BCNTRLD is not used. */ 5 g" {; s+ s! M4 S paramSet.bCntReload = PING_PONG_BCNT;: q- b! a3 V* g: m0 X, \
" Y4 `4 O8 B( O- J' y/ E3 r4 n
/* Src in constant mode Dest in INCR modes */8 N% N% w+ t# _! e. w; S
paramSet.opt &= 0xFFFFFFFDu; 6 m6 _' @3 Y" |5 t) [( | //paramSet.opt &= 0xFFFFFFFCu;( @: K$ ], h9 q7 v% {
- V- w0 E8 u2 @* R( m9 _
/* Program the TCC */ 5 n# z+ ?# y. c& I7 a paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 l7 E7 R9 D/ ]$ ]
! t" J. z! Y5 J1 U6 E
/* Enable Intermediate & Final transfer completion interrupt */9 q. R( r* V v% q7 K
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ; c- Y# s% ~" c$ _: q paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- C# b& n. \! p* m' _! s
9 K0 P5 d$ f& ~8 M( H
/* AB Sync Transfer Mode */ " p1 i( o$ f1 _; W paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; X% C/ I& a. }" k" |: y0 ?. }6 J
3 |! [- l. u D" ~
/* Program the source and dest addresses for master DMA channel */& Y+ r* a& `% h4 o8 D
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);' j& W% R% s0 [" ~4 P
paramSet.destAddr = (uint32_t)(ping_buffer);/ e; S4 j& u6 ] w" `" b7 H
2 R: g' C) C& J$ R4 o /* Write to the master DMA channel first. */+ h5 s% m& [: _2 G8 P1 O0 }
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- k. P. y4 C/ ~
} . [! R; H( m. B
2 C' w3 |0 a& s( `, T5 `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ |) k4 d; V8 J; X2 R+ E f
: P* m" q/ k; q- D7 m- J7 u if(result == EDMA3_DRV_SOK) % X/ m; }) s4 }/ s, s! Y, w3 j { 2 K6 b. Z7 U9 M4 F. F& C print2arm("edma3 driver init success.",0); " X# e' }" {4 Z( o7 ~; K } ' E; v" Y$ ]# D& _
} 3 s9 p/ R( r# d* \, [& ], L& m' v/ B. J. N! @7 o2 p$ v
! b9 P% Q0 Z+ r, d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& ?6 i2 d' ]9 \9 d