嵌入式开发者社区

标题: edma3中断只能进去一次 [打印本页]

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 x5 m: l  ^2 W7 b6 E#define  PING_PONG_ACNT          1
5 T& |0 E7 e" f* K0 w4 m#define  PING_PONG_BCNT          8*32*40 3 y* A5 N/ y9 M; F
//#define  PING_PONG_BCNT       1
& l( P( m: |% j6 `. P) W* P# w#define  PING_PONG_CCNT          1
: }, V6 e3 y: g8 f#define  MCASP_BASEADDR          0x01D00000; w4 ]- [/ T9 O
#define  Mcasp_RXEVENTQUE        (0u)* o; e: _" F6 m3 |9 ?
: I$ x0 i# G( F3 X1 D" A1 F
/* OPT Field specific defines */6 }. K: N' U9 a& F; B  L2 t7 F
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)7 N. l& r; h" ~
#define OPT_TCC_MASK                        (0x0003F000u)) r% I& w$ Y' o9 m" ~' p% b/ N, C
#define OPT_TCC_SHIFT                       (0x0000000Cu)2 ?- j! s! {  ~* u
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 r. ]) O6 ~3 u#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: x. q& U# g7 n5 K" w! R( t3 h' |* g3 d% ^4 p+ H
char ping_buffer[PING_PONG_BCNT];
. G4 E, z8 }: s: {7 I1 N: Uchar pong_buffer[PING_PONG_BCNT];
3 A, \& X4 e7 }; w$ o/ @: \0 {& H+ h$ Y5 d
' \1 N5 q% G) F- z5 q& p: M% ?
' Y9 T* M4 W& M5 |1 d& D6 S

0 y, r- R7 T, `1 D2 f- w0 ]6 k, dstatic void ys_edma3_init()
1 A  [( f: m! A{
8 }6 M/ W7 x* w, H4 d2 P        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 M( h; j& k# C$ b# a6 o0 k0 V
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ H: u) i' E& M* J* R$ r0 M3 U        EDMA3_DRV_Handle hEdma;9 x; N1 g' \' ?) U9 t: V
    uint32_t chId   = 0;
( {+ }* _3 y$ q1 Y( n    uint32_t tcc    = 0;
' a% Y/ M2 _. S1 A9 J  l) t0 U  O7 W3 p* `/ x5 `6 A
    print2arm("edma3 driver init...",0);% G, p* g9 h$ T2 E2 _

1 |3 ]9 f: ?1 {8 O+ N" P        hEdma = edma3init(0,&result);
; f: \) Z4 G( B: ]        if(hEdma)
& L% O# P5 P8 O3 `        {
- i% F/ [3 e5 e  b( k$ [) m0 A                print2arm("edma3init() Passed.",0);
) }& N9 N5 S) [  v        }
( T% ?) F4 Z1 e        else
: s- x. X& ^) K% e& Z7 @        {* e6 F6 c5 e; o: M, ?6 R  R
                print2arm("edma3init() Failed.",0);4 Y$ L- j, x, ~: c
        }
% _+ z; U. a4 F  e8 |        3 _0 l; Y2 e2 a) a  |
        if (result == EDMA3_DRV_SOK)& \1 X7 }' v  r: ^
    {
3 g- M- J% V  J% {4 [  i                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 S! C) Q9 h: D9 |3 G9 u
                                                       (EDMA3_RM_EventQueue)0,# z: W# k2 J& X
                                                            &edma3_isr, NULL);
4 _2 J& }) x" m8 c# p    }
+ z+ ^' L2 d: T- e! {. G       
: {5 w2 v' S! R3 B8 o        if(result == EDMA3_DRV_SOK)- n1 j8 a6 ~4 O  j$ F8 \' J
        {! b' e/ a8 q2 h( o& y1 \9 r9 h
                paramSet.srcBIdx    = 0;
" i+ {& B$ ?# Q1 V4 _                paramSet.destBIdx   = 1;
( Y8 D5 O* O+ x                paramSet.srcCIdx    = 0;8 E& W4 D9 O9 q, ]5 a! s
                paramSet.destCIdx   = 0;
/ e  [/ F; W, t% W) w' M  q7 r                paramSet.aCnt       = PING_PONG_ACNT;
3 W4 @1 N1 }9 ~) \/ D7 x: e                paramSet.bCnt       = PING_PONG_BCNT;7 K& F% r) n) f5 B. A. a  }) T1 ~9 h
                paramSet.cCnt       = PING_PONG_CCNT;
: a" f! k% e5 w# f$ U% w# k" R                : l2 J5 Y2 w1 T7 p# l" G) z& @: |
                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 j! A9 r* J  k% A- ]/ v                paramSet.bCntReload = PING_PONG_BCNT;+ q1 y& T# F4 W3 d3 [
, k, s6 ^, O& J
                /* Src in constant mode Dest in INCR modes */
. W* ]) Q8 d6 t$ }) Z( d4 P                paramSet.opt &= 0xFFFFFFFDu;
2 p# m) T) y( ~                //paramSet.opt &= 0xFFFFFFFCu;  g( F1 S) K/ f1 E+ U# a
               
( Z' u$ _5 {, o! }0 W8 u- S( ^* c                /* Program the TCC */* E, F0 {& e) x2 ]  V* v
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- f  F2 c* d3 Q; Z6 @6 r2 r, N1 u: H2 P  H" O9 N& B$ [
                /* Enable Intermediate & Final transfer completion interrupt */0 ?6 G7 k( O6 t! W9 T& n
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 j  x% |5 L3 Q1 o5 R5 L
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; H2 ]) z& r- w* T- _0 }' M  e. @
( h6 C# G5 S3 R6 @                /* AB Sync Transfer Mode */2 ~( @7 O3 g; u+ e* _6 o% a# n- ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ m) Y% Q* z. A9 |4 i0 b
               
/ r4 a8 d2 A, ~& i4 [( B! U                /* Program the source and dest addresses for master DMA channel */
! I6 w, Q6 m" m  o2 X5 F  N                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
! T5 G) Q; y' @' [2 w3 p+ _# }                paramSet.destAddr   = (uint32_t)(ping_buffer);
( E  U# ?* @; F$ J" \7 M, J
) w) a- D+ y$ x5 u5 F                /* Write to the master DMA channel first. */
$ S# T  ?, o% R6 u1 o                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);: m3 O  @/ v* |, K3 v
    }      
/ L# l1 \8 n( s0 r" n. d2 O6 @2 F+ U) G/ W+ L& b+ J2 M5 I. m
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 H  _" \' I- j4 ^        7 h. n/ O! z& B* S2 X- k/ V
    if(result == EDMA3_DRV_SOK)
( r, y6 w- w9 [6 y( r" U    {
0 F, V/ D% P$ H; d" P9 y+ a            print2arm("edma3 driver init success.",0);
9 H: W" n* q% A' W    } ! Y" G  F& Q! [. I+ p& l! ?9 W
}
5 v3 A- t) a- m7 {  N" Z
# ^8 t. [* `# B4 \7 L0 m, q7 H* a# w) O
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
  f% G. ~; m3 j2 B
( l, a8 N! v/ u' M. ^
+ o$ J0 }: e, ^8 d( h) O
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; L5 b' q+ b( _9 t每次DMA传输完成后都要再次使能传输

8 T3 B: i: j# _* \* p  N原来是这样,我明天去试试,谢谢了!




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4