嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# A- k9 k5 v* z+ {) }4 \; p
#define  PING_PONG_ACNT          1, W! o1 v! D6 r) R- S
#define  PING_PONG_BCNT          8*32*40 & A" [5 n: J( Y
//#define  PING_PONG_BCNT       1 ! x' ]1 `& ~9 o# J" e2 C: G
#define  PING_PONG_CCNT          1* V3 O; Y2 C& O. y7 M, Z3 {
#define  MCASP_BASEADDR          0x01D000003 k( U* r) A: l# Z7 [/ S. E
#define  Mcasp_RXEVENTQUE        (0u)/ q( |7 n& P" ?$ |8 d5 a$ a
. j6 p+ Y, h# P2 ], Y* T" R
/* OPT Field specific defines */2 v- a/ W* ]& o8 q
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! j7 X$ P, \  w% m#define OPT_TCC_MASK                        (0x0003F000u)& I0 Z" t: D8 r4 H
#define OPT_TCC_SHIFT                       (0x0000000Cu)
' c. t& r/ `. y" ^#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 Z7 A# F. A3 H; K4 x) x#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 `: {; P) Y: D% r' l0 B3 \, I4 B9 n% J& a* l; V
char ping_buffer[PING_PONG_BCNT];
( S/ M4 C, z( e( I. lchar pong_buffer[PING_PONG_BCNT];. k: _: k3 Z" Q) C. j" K3 ^3 e
/ g9 X2 F3 N: g: z' I1 _7 v9 S

8 s. i$ D: c* g8 R6 Y( x) e/ x, D6 Y: o' L; D8 \: w

7 ^6 I4 X5 O7 v7 i1 R% |4 t& istatic void ys_edma3_init()
1 R, V9 b2 y) U, L# q{5 K3 G0 V$ {2 d2 @/ N. J3 t
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 `" B" \  L# Q! P# Q. i$ [, J        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, T; V/ T' j% W6 m$ l
        EDMA3_DRV_Handle hEdma;
' o. f% x9 ^  {" n1 _) ~( d    uint32_t chId   = 0;
  N  y' k, b; c2 |4 z" E9 w% l8 @" [5 H    uint32_t tcc    = 0;% i1 Q3 [; w( O7 T9 U

7 G( z8 q3 F% ]3 }# G: `7 \    print2arm("edma3 driver init...",0);, W+ w) E* Q$ Q$ t: w# \/ J$ \8 X: S
2 ?' Q. b4 R) k  v. t
        hEdma = edma3init(0,&result);
9 p# y* ^4 k+ n: @7 k" Y        if(hEdma)
& Z/ v3 P3 Q6 Q        {" ~9 `" Q1 d" M3 q
                print2arm("edma3init() Passed.",0);5 l* A' e3 k: e2 [4 R6 p
        }
6 E9 @5 f7 R4 _& p( ^        else
0 `8 P$ H- f8 l        {
3 v- }9 T2 g& w5 e                print2arm("edma3init() Failed.",0);
  Y7 c( M/ g; r. O( Z% H% B        }% x- |8 D, f6 e
        : M- c/ A( Z" d7 r  q" t1 b
        if (result == EDMA3_DRV_SOK)
7 D, D+ c' \! `4 I) Y* c% m    {9 x; S  ~; a! `+ f
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 d2 _2 J/ G! J1 N, Z9 u                                                       (EDMA3_RM_EventQueue)0,
+ }* V) u. F. j' Q9 [% r: n# r0 |; z* v) Y                                                            &edma3_isr, NULL);: c* X' k, E- y  ^1 E5 Q  D  @% F
    }4 b( _0 s2 N$ a/ O9 b% ?% d2 r3 u
       
1 V- Q. u0 r7 F( P1 {        if(result == EDMA3_DRV_SOK)+ M8 L3 S$ F- i/ B9 `4 U) F
        {
4 a" ?0 C- k$ {7 m2 v* B  o                paramSet.srcBIdx    = 0;6 C! r# }# ^, j
                paramSet.destBIdx   = 1;1 t. H! [+ h( V$ |" r
                paramSet.srcCIdx    = 0;
8 d5 ?  s+ a8 G" D! |                paramSet.destCIdx   = 0;# M% ?" J$ |2 d
                paramSet.aCnt       = PING_PONG_ACNT;1 h( v9 z/ r- K7 C8 ]& S! {
                paramSet.bCnt       = PING_PONG_BCNT;; _2 G' F& E. r
                paramSet.cCnt       = PING_PONG_CCNT;
& P/ X' `( @, L                ' d+ @( k; y) ^. K: R6 [( N$ }' @
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 Z% M0 I% y* t$ G& p: y                paramSet.bCntReload = PING_PONG_BCNT;1 x7 [2 H. t7 ~
3 m+ C6 C, T! c( T2 R
                /* Src in constant mode Dest in INCR modes */3 I8 l6 ]( ?% ^* o. B
                paramSet.opt &= 0xFFFFFFFDu;
  D/ C; s1 j" |$ `  d# i5 Z                //paramSet.opt &= 0xFFFFFFFCu;+ T( E# C+ j" L
               
2 |- a3 K# w) V& e                /* Program the TCC */$ e% t% u7 J; A9 _
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ h7 l0 x7 j. _6 g( _7 {) ]
/ Q( S1 R5 B# g6 r4 j# o                /* Enable Intermediate & Final transfer completion interrupt */6 r  [9 S7 |2 p% [4 h; M
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: h+ n  m. c! n
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 a5 m& M! S$ m& N2 U( k  ~, k) i
% ]( W7 z1 Y# }3 w% U# `                /* AB Sync Transfer Mode */
: d9 s* @: E* d; |: i: _1 q                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; u0 J9 g; P7 W2 H: K$ w9 ^0 ^
                ; x; p9 j8 }9 H% |( @4 f/ u
                /* Program the source and dest addresses for master DMA channel */
/ n8 R( o* ^. }; X- L: {8 c  Q+ P                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 q% J+ ?: Q* w                paramSet.destAddr   = (uint32_t)(ping_buffer);
3 X+ f& k$ h, ]1 M
8 B! t3 s2 U8 N                /* Write to the master DMA channel first. *// H' _$ j2 }' S4 [# M" S6 j; i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
7 @. G6 N/ \; @- p    }      
" f0 U5 A6 f6 Q  B, o# `
/ Z) S3 T  P) }2 Q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 N/ H) k, U9 }! k. }- H! P       
4 Q; H+ @. ]$ b8 R" l; v+ F    if(result == EDMA3_DRV_SOK) ! J6 \, c) h! Q, i$ s" r
    {  `- E. U$ M& h2 e
            print2arm("edma3 driver init success.",0);7 N) u% \! m  f( P
    }
9 G9 g( m. m, `' R7 u& l}: }2 @/ Y6 a$ i& p# t+ B
) _1 n1 a$ M6 i; U+ H
: _: P' h7 S7 \: U$ R1 P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
  \+ f! l5 {+ I
; q1 ?7 L* ?# G2 ~0 v' I$ R4 V. s6 D% `1 D  n

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47; ~' d% F; C' |4 z3 `$ s5 M6 @. z% f  P
每次DMA传输完成后都要再次使能传输
' M* Q+ f4 d/ e
原来是这样,我明天去试试,谢谢了!




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