标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: " O8 _" B! U D @; m }/ M#define PING_PONG_ACNT 1 ' D2 W) _- t( z/ h9 Y9 v8 n0 b#define PING_PONG_BCNT 8*32*40 ) Q- e B+ _( j+ z; r- w
//#define PING_PONG_BCNT 1 1 ~( f. D2 f$ d3 J P- Y" Z9 R#define PING_PONG_CCNT 1& e' k/ i# ^2 P( Y# |4 Z! a
#define MCASP_BASEADDR 0x01D00000 7 O2 X2 }/ c) O0 L2 U' c#define Mcasp_RXEVENTQUE (0u) . V/ H$ o7 G" s 8 j. k0 s0 S) e, c+ j/* OPT Field specific defines */' O8 u# D! T- F
#define OPT_SYNCDIM_SHIFT (0x00000002u)+ Q+ w; |9 X) c9 w+ V) s
#define OPT_TCC_MASK (0x0003F000u); \; I1 W# o! D {# X) ]" u! j
#define OPT_TCC_SHIFT (0x0000000Cu) * ?" Q$ J/ O5 c" M$ ]- Z6 l+ G#define OPT_ITCINTEN_SHIFT (0x00000015u)& h, Z8 z! S) p0 A
#define OPT_TCINTEN_SHIFT (0x00000014u) ! k3 e) U& n9 M5 k - j3 m, k9 T- i4 x& f, Lchar ping_buffer[PING_PONG_BCNT]; $ B$ U, R+ X2 F0 [' ?char pong_buffer[PING_PONG_BCNT];& @3 l0 L+ W: h
|" D/ x4 H; C! q. H3 U 6 F8 [ {9 P" k; N z- h) W6 T! l9 T( Y9 |% ^8 O
: o( n+ v5 W d3 ostatic void ys_edma3_init() " H; d4 E6 a, A, D{ p) y- O+ L# j9 r0 W4 k
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- ~! ? H' t: i3 E& o' R
EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ D. X' X; Z; |+ Z* s
EDMA3_DRV_Handle hEdma;$ \7 k/ P/ f) u4 \
uint32_t chId = 0; 6 i7 C! H. r* M& y uint32_t tcc = 0; 7 p: [7 B3 B* r6 ` , H) _- x7 R" W$ ] print2arm("edma3 driver init...",0); ' g$ H% c e# q/ H+ L7 P+ N* ?$ F " K1 V+ G$ B# x, w3 T hEdma = edma3init(0,&result);* Y, p4 D9 A( d& X1 r/ x
if(hEdma). c5 W7 n9 R' r4 ^, X' P2 N
{ : J, F! M8 Q2 w0 ?+ B' f8 P _( ` print2arm("edma3init() Passed.",0);/ j* p; `- Q9 {
} " P! O/ R) N; ^ Y1 ^7 a7 [$ {" i else ' V t p% L# `2 v5 d$ K {/ |& j( X: O5 @7 J) L) _
print2arm("edma3init() Failed.",0);5 h! I) Q7 I, \" _9 Z3 |/ B; G
}7 T! a4 S- W! \2 f# E! }; x: L3 N* q
( G" X, c( o7 s3 T if (result == EDMA3_DRV_SOK) : N0 t3 r# b8 Z2 ~% w, b2 q { 5 x I7 k1 K7 C7 i result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, ) s6 x& H2 A8 `2 d ^7 ~% |# ? (EDMA3_RM_EventQueue)0,0 G+ u# s) |/ F
&edma3_isr, NULL); * E* \3 g" h: G H, D8 q3 o3 [ }, F) Y0 J- \9 T) _' i$ o
4 V) R6 _, @9 S7 @# v9 U6 t7 N5 } if(result == EDMA3_DRV_SOK)/ p" p ~. N. S6 z' W4 {) w
{7 Y6 A/ @$ q3 g a* F4 D
paramSet.srcBIdx = 0;$ r5 ?0 Z% T/ S5 P
paramSet.destBIdx = 1;. q0 q$ m! J' N; c2 v7 _' d
paramSet.srcCIdx = 0; 8 _% j6 ^$ D; ^( O1 d) x paramSet.destCIdx = 0;5 S0 \9 q' {5 Q/ b% _' p) w0 h! ] e9 F
paramSet.aCnt = PING_PONG_ACNT;$ _" U) ?( E" W+ ]( d( O
paramSet.bCnt = PING_PONG_BCNT; & T& B( g1 D0 f# @9 N3 R) y7 G paramSet.cCnt = PING_PONG_CCNT;; w2 ~ @9 k' B
4 U H4 s4 Y2 z" l- F /* For AB-synchronized transfers, BCNTRLD is not used. */ m. \. t$ g/ F& O/ R+ T {
paramSet.bCntReload = PING_PONG_BCNT; 6 T; c2 ` |. t$ ~/ A* @1 h6 s % e [: y0 q+ l c% u( x1 n /* Src in constant mode Dest in INCR modes */( j: p0 l9 f, p5 \4 B6 c
paramSet.opt &= 0xFFFFFFFDu; 9 F+ x- H/ r% \+ Z: n5 l1 f r. m //paramSet.opt &= 0xFFFFFFFCu;! ^# M7 D v9 o; i4 O5 f
" o$ |$ T. p1 [" w$ e/ F2 h /* Program the TCC */3 o* z" H' F4 M9 ]5 K/ H0 g
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( O( u0 t9 F2 I% V
7 e% q$ n) x5 L2 m: ] | A; q
/* Enable Intermediate & Final transfer completion interrupt */ O g$ Q5 V2 R
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); & S$ _' `$ N7 X, ?1 O' @3 y { paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 K, o: L* h1 Y) J, m% L
% t+ E: s C7 Q- r& h# [
/* AB Sync Transfer Mode */ ! ^* L! s4 j! {4 W. V) o4 g( j" k paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); 2 ]9 Y2 k. o7 u; X) S& m( [ g6 m9 [" d9 i) K6 ^
/* Program the source and dest addresses for master DMA channel */ - c" k- K$ Q! h( N- z0 u( i1 h paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); : J) |8 Q5 J& ?- i paramSet.destAddr = (uint32_t)(ping_buffer);% W, _; S4 Z7 A
, d5 W1 I8 A. Y6 J" {1 |
/* Write to the master DMA channel first. */ $ W* m8 o8 ~4 m result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); / T6 B# g! f- z } / M. |- F% H& `* t3 z4 ` I& W( Z0 D/ t
# e2 o4 K7 y+ k9 v result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% e$ U( q, H, z3 A
) o) e3 w" n% i6 r; G if(result == EDMA3_DRV_SOK) ! v, B% ~3 C: l! S6 m
{ [% S3 J1 |$ L. H8 P" }' K print2arm("edma3 driver init success.",0); 6 K0 X* S, Y, U( L2 t } & T; H& Y; n- x& c" o' f) M}3 G1 {- Z: f3 H9 Y
|- L, `$ C0 B/ [' s