嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:& j3 Q+ h8 C, E+ r. C
#define  PING_PONG_ACNT          1# ?/ Y3 ?  ~( S
#define  PING_PONG_BCNT          8*32*40 6 g: m) d% b8 ]5 l) j; `3 w, A% O
//#define  PING_PONG_BCNT       1 ; m9 j3 F& S8 P& T9 Q% L9 ?
#define  PING_PONG_CCNT          1% z& p0 c( a: f* c" O$ F
#define  MCASP_BASEADDR          0x01D00000
2 Y( C- p/ q, i( R, y8 X9 J#define  Mcasp_RXEVENTQUE        (0u)
9 d/ j! T- t& _- {/ T. ~" {2 _5 P4 u; F, s/ A" k
/* OPT Field specific defines */0 |& X% G7 R8 B( l, B# Q, X
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" K' F6 j# T; M' ?6 o#define OPT_TCC_MASK                        (0x0003F000u)
) C3 b$ B+ T# o# N#define OPT_TCC_SHIFT                       (0x0000000Cu)
1 B0 A) N. n2 Z9 I/ C' `1 c#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
1 S- W" U8 s* v! Z#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ N- ^. c. j0 ~1 w! l4 ~' }/ C, {/ Y4 `; w. p0 s4 g- M) F
char ping_buffer[PING_PONG_BCNT];6 e: r% u" {  p/ o8 _$ F" H3 D
char pong_buffer[PING_PONG_BCNT];' V8 {% C* b. G: `4 c. W* L1 n( W

4 I: B6 d! E# X3 s$ J1 V+ H7 L0 R3 ^' ~0 z; }4 Y  u
) H$ x$ M- v) c* {7 M5 E+ a  M( @
$ p/ t; Z7 D7 u& Y& J# Q$ O) P
static void ys_edma3_init()# o9 p$ g$ i% I" U9 U+ w/ s7 [
{8 U5 t4 ~2 g6 t3 |% K
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& ^; }5 }, J5 ]" T2 E' `
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;' c! n* E/ W! M4 [$ s/ k
        EDMA3_DRV_Handle hEdma;
( `% m0 M& U& c: U/ R/ i: c  x    uint32_t chId   = 0;
1 W: _- U0 f- W# Q1 A    uint32_t tcc    = 0;
' J( J/ s) S. `( B3 x' K2 g1 T1 z) C0 r" `" z! @
    print2arm("edma3 driver init...",0);$ i' i8 u9 e. f2 K3 F

% N3 ~+ Y+ c$ L$ @0 x/ _        hEdma = edma3init(0,&result);
: W& @5 W9 g6 ?0 h) f+ b0 P        if(hEdma)
' F: l; x2 \5 s( F. A        {
. F; D  K- a1 m                print2arm("edma3init() Passed.",0);/ t' g$ S% o/ }& N. I1 X7 {# x  C6 z
        }& Q5 m  U3 Y' n  o% w
        else; N# _: K1 f* X6 ]
        {
0 f  T( f$ k0 [% \                print2arm("edma3init() Failed.",0);
! A" n& W- ^1 @: {0 ^        }; h7 Y* x( z* l$ L' o
       
/ n8 y$ T3 {) q( k6 i: t. q        if (result == EDMA3_DRV_SOK)
6 Z2 |, {: l" f# Z' c5 b+ z    {5 v- B. m0 ~" {( Q, ?
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! I8 B5 h2 ^  L1 |" Y8 t8 P( ~4 l5 X
                                                       (EDMA3_RM_EventQueue)0,! V5 a; ~2 W- i& W1 i- l* X1 ^1 K
                                                            &edma3_isr, NULL);
: X4 t2 O& R$ n) X4 ]  J# [2 ?    }! z: h0 `" w4 U6 F! q# o
       
. l9 x/ m: w4 L8 E' Y        if(result == EDMA3_DRV_SOK)
1 X; |8 H8 V9 A' c$ c/ V  n        {* H5 P1 L4 W1 Z  u% _3 W
                paramSet.srcBIdx    = 0;8 l# b/ w3 b$ `6 j. o! N
                paramSet.destBIdx   = 1;
% M# Z, Y( z% o3 F/ U, l1 }1 u1 ]                paramSet.srcCIdx    = 0;' @" Y" c6 J3 ^+ v( p" O
                paramSet.destCIdx   = 0;
# d* i- e% u: A) j* i                paramSet.aCnt       = PING_PONG_ACNT;2 m  Y0 d% H3 u
                paramSet.bCnt       = PING_PONG_BCNT;
. X) D' t0 o: N( b* Z. i0 k                paramSet.cCnt       = PING_PONG_CCNT;
# r9 K+ u4 z8 F$ z                ' |$ y* W6 k1 I8 ^( \. y4 b" `; A
                /* For AB-synchronized transfers, BCNTRLD is not used. */
- v' L  L5 j8 C, c" i2 H                paramSet.bCntReload = PING_PONG_BCNT;
% j! b  E/ ]5 P$ K* o& F* q; ]7 ]8 V' K* ?# o) [9 f5 ?
                /* Src in constant mode Dest in INCR modes */9 Y( Z& P1 _! L% |" R' s- b3 G
                paramSet.opt &= 0xFFFFFFFDu;
) C5 L8 o& `9 r7 N( x                //paramSet.opt &= 0xFFFFFFFCu;
( z4 A( `. P) s  R( s                ; B6 D6 T) g- c
                /* Program the TCC */, i8 c; j5 {7 {* n
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 E; r% a9 h& Z. ]5 N8 T7 Y5 o& N
0 K5 S3 @( _+ v# _
                /* Enable Intermediate & Final transfer completion interrupt */
" J1 A" l# o- ^5 k+ y% v/ L8 \$ l                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  t2 `' c! R  }3 {* ]                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! G6 \* q2 }: ~( U2 r+ I: P
: q" B9 J3 L7 B2 ~( i+ z" P                /* AB Sync Transfer Mode */
: O1 S& v- Y8 W1 }                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 |2 a2 l9 S" M1 @                6 `) A5 W1 e1 [# r, W& q
                /* Program the source and dest addresses for master DMA channel */2 T3 O* a' u0 V4 o
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! K, u  D5 m# ^5 L7 D2 q
                paramSet.destAddr   = (uint32_t)(ping_buffer);
5 T# F7 T( F# P/ W7 s
" k: @. C6 Q2 S  [& ]                /* Write to the master DMA channel first. */2 |+ R4 k4 c" w5 Z1 E2 H6 i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);' u0 R  {% E& |( a: e. [' C* e
    }      
2 V6 y" E1 B# |, p7 E4 [; M: P9 f! l" C3 T' [3 D+ E: N
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- f; m1 H% ?: q4 B4 E1 a5 X
        - R& O$ }2 A4 O8 @
    if(result == EDMA3_DRV_SOK) 4 f1 J. t0 h5 C8 r
    {& ^0 R( N% ^8 }4 s! H
            print2arm("edma3 driver init success.",0);9 E, s0 Q, X( G  x+ }4 n+ \
    }
; ~7 ]3 w+ K9 S: I}8 m7 V; H2 k1 }; u$ J% a! I
# f; W' p$ E1 r) ^0 {" B3 U% Q1 R

& ]* \0 S. ]8 h3 b/ a8 v) tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 y, a$ I3 o3 D4 n, S: o- Y8 y! }( ~; }( X) ^% [' _

6 ]7 |* {+ p: w$ S
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% P/ D9 x- ^4 s0 L; Y0 I每次DMA传输完成后都要再次使能传输
$ O: ?; s  S) ^+ ]0 Z
原来是这样,我明天去试试,谢谢了!




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