标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: 8 w6 Y2 b; Y% q! i' ~; A" E, v#define PING_PONG_ACNT 1/ }1 t; i! E. H) f8 [+ ^
#define PING_PONG_BCNT 8*32*40 5 ~, s/ L+ Z g" T//#define PING_PONG_BCNT 1 0 u) ]! _4 ?: Y5 X) Y. t4 g5 ?#define PING_PONG_CCNT 1' R1 i# H9 i) Y+ t4 A
#define MCASP_BASEADDR 0x01D00000, J0 t7 m7 k6 L' B
#define Mcasp_RXEVENTQUE (0u) ' Z" V, z% S4 A9 k1 B # Z0 \, k; a. J3 i' a* `7 L3 F0 f/* OPT Field specific defines */2 K' V. M6 h/ P _$ U1 m* c
#define OPT_SYNCDIM_SHIFT (0x00000002u)5 Y6 G% |# X8 n' m# X) f# D+ b
#define OPT_TCC_MASK (0x0003F000u) . Y2 c0 h: s6 ?: V3 W#define OPT_TCC_SHIFT (0x0000000Cu) ' V* B; m1 C* G; a#define OPT_ITCINTEN_SHIFT (0x00000015u) 2 I0 g6 T! k3 T: g! C#define OPT_TCINTEN_SHIFT (0x00000014u) & P ~1 [7 x$ w0 b% k! }8 `- A" q/ g* j( q# h
char ping_buffer[PING_PONG_BCNT];" J' m. o" {6 K* b* y k7 A
char pong_buffer[PING_PONG_BCNT];! R, E% l1 T1 ^
Z$ D+ \& s2 K8 q* W
" Y* W; q; l1 E 4 T& ~, M f4 n2 _/ L2 F j 6 z1 {% X8 h& Q) A nstatic void ys_edma3_init() ; J' T3 `+ r! G7 f5 J+ y' \0 g{ ; R, Z3 m$ A: D$ H EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 m4 X) J @2 N/ S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 \+ e J6 g1 C0 C ?5 V" K9 e2 q
EDMA3_DRV_Handle hEdma;- e( m' G0 C! m" l5 g, W3 S; y
uint32_t chId = 0; ( X+ _; N, K' B c uint32_t tcc = 0; ; { G; T; T4 l) u# ?* y + y' F* q, C5 x4 Q2 E% h print2arm("edma3 driver init...",0); + R! |( O y* ?7 A- F + A- Q7 ?9 M4 f hEdma = edma3init(0,&result); , l0 l9 W* i5 S+ g: Y% ` if(hEdma)) p! _9 c$ i3 [5 `' u- z; f. J; n
{3 V- n+ R9 R. `% u8 L
print2arm("edma3init() Passed.",0);9 i" I; a2 f6 l9 [! P4 s/ z7 x. D
} 1 E" E! D4 h# B$ B+ N else " l* t) I l, z# X9 ~* b. v1 Z1 f {: t, |3 C O) [; M
print2arm("edma3init() Failed.",0); ^7 P' P8 ~" x% a$ t7 J
} , V# |/ }2 \; [ r* ?1 \) {( ? , c& r0 T" J+ K
if (result == EDMA3_DRV_SOK), ~. z9 x& d, k9 A9 B; f' {# w
{) y, b4 X! l0 a; A, l( ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ K; o" U- V' c
(EDMA3_RM_EventQueue)0,! W4 |) s5 t3 q7 L$ I) F5 o
&edma3_isr, NULL); ' u% ^2 q% c1 b9 C }' `5 v$ T. S% f
( G6 [. y3 G/ I) K& \
if(result == EDMA3_DRV_SOK)4 A9 c. Z4 C) N4 q3 t+ L/ @3 l
{( A# t% F, U9 }9 v! |+ j
paramSet.srcBIdx = 0;6 d$ N/ h! f. R8 _& C1 g
paramSet.destBIdx = 1;( I% p( w$ d0 \' B) |
paramSet.srcCIdx = 0; ! N1 B+ z# Q5 @( o5 k5 n: c paramSet.destCIdx = 0; $ V; F# j, n! A: l paramSet.aCnt = PING_PONG_ACNT; 7 W% h- Y# K% Z7 i% ^' x; h! B paramSet.bCnt = PING_PONG_BCNT; ' q K; \( M1 c& O) c paramSet.cCnt = PING_PONG_CCNT;' N X+ `$ `0 k
7 P* E* }# M- ?; w' U- r /* For AB-synchronized transfers, BCNTRLD is not used. */ * V5 g$ c; u! {( d( a% ^( ^ paramSet.bCntReload = PING_PONG_BCNT;) d+ R4 i5 B1 f6 g1 ~" B
4 ?: m; I O* e/ h" t /* Src in constant mode Dest in INCR modes */% c( J, J/ R$ w3 F: m& j
paramSet.opt &= 0xFFFFFFFDu; ! c( c! V g K6 u8 y7 E //paramSet.opt &= 0xFFFFFFFCu;! `$ L! @# }5 G! [. Y4 e( f( h
! E# X" d6 \: ?7 p5 X( c /* Program the TCC */6 [/ n3 J+ j, E& `8 W
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);8 x! Z3 @* Z$ l
5 Q' v" D" C" Q. h) o* o
/* Enable Intermediate & Final transfer completion interrupt */, T( [( T- I! N; i3 r9 W$ y4 u/ Z% u4 V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); j; P c) c+ j; r) ?
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) {( x$ v3 H2 `- X+ p
( N x* P0 M" m- o: r" M /* AB Sync Transfer Mode */ 8 p7 A. H3 ?+ V paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# ]* ^6 |7 z+ M3 ~# R# k: |! J
7 Y+ K. u5 g% m( U% Q( m
/* Program the source and dest addresses for master DMA channel */ % S! G9 b1 \4 p+ n1 N7 \ paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 7 F G9 M( v+ [0 @2 H; {7 x7 o/ M paramSet.destAddr = (uint32_t)(ping_buffer); I/ T E* b' y3 P
" E! L6 b- s! s! Y3 m /* Write to the master DMA channel first. */ - ~, m8 r) s- M+ c" L6 I+ x result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); ' a) e+ G6 K/ h# I } " L2 C1 N3 e, P0 F8 m& G [/ ?
7 R0 ~; C( T1 `, E: p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% J8 D" ?6 a) H0 w, Z
# g% q7 [% C! h if(result == EDMA3_DRV_SOK) 6 b+ t+ r$ n G% u+ \ {& R4 `) ?2 t8 p5 [# {
print2arm("edma3 driver init success.",0); . G0 Y" M, p: y! Q9 | } ( ^. x1 b, T6 I4 I8 H/ V
} . K$ S. ?' \; G& g7 M" a . r: g- D5 v& f1 r6 E3 E , ~" R& e; x8 I7 c9 n. PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 0 ^+ M( X8 L/ ], f- ~( q 5 g! f. a# }& v! Q# Z$ a+ c& F: ]6 a- B, j$ S! t0 j, A 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25