嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 Y. W. A2 t: t* ?7 t
#define  PING_PONG_ACNT          1
. ?3 U/ J+ s) s8 h0 m#define  PING_PONG_BCNT          8*32*40 6 Q7 G( h! i$ R
//#define  PING_PONG_BCNT       1
  u. P7 V2 B  H#define  PING_PONG_CCNT          1
8 H- [$ v. N2 @/ D  c3 a) l#define  MCASP_BASEADDR          0x01D00000; q& z6 f: I/ A
#define  Mcasp_RXEVENTQUE        (0u)" |8 f, ^3 _! T& R

8 b9 j6 ~; u6 ~; B+ h+ T/* OPT Field specific defines */' a; p6 c" F# u+ v
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* E: v, Z; X! y
#define OPT_TCC_MASK                        (0x0003F000u)4 R, p( c: `2 c2 K: t
#define OPT_TCC_SHIFT                       (0x0000000Cu)8 B6 C, z5 R4 L8 @& `* K+ F
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)! ^% ^" m# {1 |' S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)& M# K' n. K$ e6 I/ z: Z' i
* J1 B2 B8 |  F) z! A! N
char ping_buffer[PING_PONG_BCNT];9 l; }  |+ S5 \# {. a7 v% K
char pong_buffer[PING_PONG_BCNT];( m, C% h$ r+ |1 Q: i

$ k+ y% n( i$ Q+ c0 y! [6 m5 g9 I5 @& f9 d0 m! [
4 A0 d9 ?( g* v, o7 u

! A9 @0 f: Q2 S5 c6 ^3 cstatic void ys_edma3_init()
* a2 x$ {3 M+ E8 X  C! E1 k& P{
' \$ @# S9 ?( W; C( L6 l        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& Q, j: ^4 N' x* @) l; R) \7 m( n, W  n        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# ~$ u! z/ F( T4 u. W
        EDMA3_DRV_Handle hEdma;- o& ]/ u$ O. y
    uint32_t chId   = 0;3 @! V, K/ z/ x' i+ w1 O( Y
    uint32_t tcc    = 0;4 @' r5 E( \  t: k3 e

0 T4 [$ c$ W, U  @9 y6 P    print2arm("edma3 driver init...",0);+ W8 z. E5 c& h& N. F1 o3 B
6 F6 A- n  s* p7 z7 Y" X
        hEdma = edma3init(0,&result);: i$ B# v* m* S& O9 i5 \* [
        if(hEdma)
) F2 _7 _; D5 K% s- b* c        {! U- U  E) ~0 _6 D/ {, v% }" S9 ~1 K
                print2arm("edma3init() Passed.",0);
/ F0 |+ d/ _9 D0 d" U        }
1 a! I. K$ N# z) W8 j3 y, J/ u        else, D) {, j, K, A! e; F! ]4 c: ]
        {! Q5 I) L7 Z$ A( n1 ^3 c8 R* n
                print2arm("edma3init() Failed.",0);. X' y2 S* H$ I5 r6 [6 j
        }2 m1 Y6 |1 ^, Y+ _& Q2 y* x
       
' N/ q6 Z2 e; f" [6 d/ d' G; j        if (result == EDMA3_DRV_SOK)% Q! z4 T8 ]0 _
    {7 y" O; y" L+ ?% [# }
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ h) |. A7 }$ I8 g# H                                                       (EDMA3_RM_EventQueue)0,6 M. n6 r: W; ]( v. K- W
                                                            &edma3_isr, NULL);+ g/ P* O6 x- g! c0 z
    }& N: ?3 ~. S$ a1 f
       
/ n, Q7 U* l! @* A/ A4 _5 d2 C9 a        if(result == EDMA3_DRV_SOK)# y0 _8 R8 X7 Q# p+ a: @
        {- y/ x2 r5 u8 P8 c* J: m7 _8 o
                paramSet.srcBIdx    = 0;: x( j8 c6 l6 R% Q. m
                paramSet.destBIdx   = 1;
* x* E: `4 J5 L                paramSet.srcCIdx    = 0;8 S5 b! k& q6 w9 @3 D6 i. G
                paramSet.destCIdx   = 0;
% x' x; d; e/ S; I* I9 u7 X: g                paramSet.aCnt       = PING_PONG_ACNT;
1 K) a1 i: t! v0 K( o8 C                paramSet.bCnt       = PING_PONG_BCNT;
. l' J7 C, a' D  L( V$ _4 B7 }                paramSet.cCnt       = PING_PONG_CCNT;
0 l. s* d- k/ [               
, s/ L) X/ r, g( c                /* For AB-synchronized transfers, BCNTRLD is not used. */& _* _9 {& [; O
                paramSet.bCntReload = PING_PONG_BCNT;
- E8 R, W# g0 ~% v* o* X# Q' r& G$ Q$ }* k8 _/ p, U
                /* Src in constant mode Dest in INCR modes */+ O( _! y8 u! j  h5 o" b5 ~
                paramSet.opt &= 0xFFFFFFFDu;
5 F+ @/ \$ ~& h2 B, k' ]                //paramSet.opt &= 0xFFFFFFFCu;7 g$ k+ F# X2 T5 ~# W
                ) k0 C6 c& d( A. C  {  Q# a
                /* Program the TCC */& A# M  o1 c2 V  `
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, u1 y& F5 C7 |- F; B+ N1 p# }
- x$ ?1 c* t4 w; G                /* Enable Intermediate & Final transfer completion interrupt */0 E+ G% E$ n1 ?6 k, P
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& x+ A+ W1 U1 ?8 ?                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);2 P% x& E& \( s/ [9 _# ]$ T6 v
" F* ]7 g) ?5 g2 [% E
                /* AB Sync Transfer Mode */
. w% y1 B: Q3 S' p                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 ]- E4 F5 d; n+ T               
! J' B. `4 p; M& R: s5 Q                /* Program the source and dest addresses for master DMA channel */
, h- D0 i7 [( c( f& j                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 i6 E" g* m0 l8 f) W8 \) M  Y
                paramSet.destAddr   = (uint32_t)(ping_buffer);! O) m- W# u' g0 ^7 C
0 o) I6 Q' W1 H. e9 R+ @
                /* Write to the master DMA channel first. */
+ H: t% y6 U; W+ l, u% I* V) c, P                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, L8 W* Q: y7 N( J: F: [: l, a
    }       3 s: F2 r, P9 f, `) J

5 Z: O1 _% B5 l- c        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);* b5 X; g9 x+ }, g! Z
        ) t. P7 X6 k) b; g: o
    if(result == EDMA3_DRV_SOK) : k8 u0 ?: K) m+ h' U" j! W
    {5 W3 s' F* R# @. [: f- u; U0 C
            print2arm("edma3 driver init success.",0);
# N9 K5 A, O1 e0 D& H    }
$ e1 Q9 `/ P( m}% u# Y4 l# ^7 K. s% p
: W! _) M$ O" O) ~) T# l

4 \! Y' [0 e5 bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 }3 r9 `% k- B3 Y/ Q: H( E  ^! n0 s3 }+ f( t$ }
& G. k5 k3 E3 S$ {# {8 ?/ f9 ~

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' ^+ O* t  i. i. ~% v; x每次DMA传输完成后都要再次使能传输

6 I6 G8 L: Y0 n( {% M- ?1 N" l* I原来是这样,我明天去试试,谢谢了!




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