嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 r! y& C2 R4 Q! p3 B. z$ H" m3 T#define  PING_PONG_ACNT          1
, n, Z" e5 ^. ^. v, U#define  PING_PONG_BCNT          8*32*40
. L# n2 x* e0 h& H5 _( \- L  r//#define  PING_PONG_BCNT       1 ) s$ E7 Z# [. M/ o, ^# f
#define  PING_PONG_CCNT          1
! F+ q$ D/ L: F) ]* K* \#define  MCASP_BASEADDR          0x01D00000: U& Z7 H  @$ W
#define  Mcasp_RXEVENTQUE        (0u)9 J- |0 U3 X6 H6 @1 w

7 ?1 z. y4 B  ?: T& m/ J/ p/* OPT Field specific defines */
: M0 w4 F5 Q% @, y#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ n$ h" V5 }3 {6 W#define OPT_TCC_MASK                        (0x0003F000u). F% W  o0 U2 v& W
#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 Q) D0 I. J( N7 g) K6 D/ q#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
- W8 z/ {1 [: U3 N#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 v$ s6 ?$ O$ y% B1 g( @0 }2 j3 Q
+ U- s3 a) q, e) \
char ping_buffer[PING_PONG_BCNT];# B; q" L2 [, P& T: P
char pong_buffer[PING_PONG_BCNT];+ L! i2 q# O: F: ~+ y% l" Z

; D0 l. V# P: u8 _& h
1 V: d/ K; k, l# r- r: u# c( Q5 V) t  ^  I; L

% B6 E. p7 d" ]6 f; Zstatic void ys_edma3_init()
. m7 }8 {5 l- f1 Y2 _! W{
7 X/ B. X8 {( K        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 ?  B8 o+ `4 R        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# k0 s  t( }- a5 L. X
        EDMA3_DRV_Handle hEdma;
* \$ U  {2 O: `4 y    uint32_t chId   = 0;% W- g! i  Y$ p1 y6 v6 w! M
    uint32_t tcc    = 0;
; X. R; ~( q7 h0 p  r8 H7 {
1 s$ ^' }* g& P1 @( V  |) c    print2arm("edma3 driver init...",0);8 k. ?3 _6 M2 d/ g( K7 b. U

/ {- z( C, I, d( r& |' W        hEdma = edma3init(0,&result);
' G( \7 x: C. Q5 r0 h5 B' P; _' M# |        if(hEdma)4 r9 t% e& D9 v* h$ i
        {2 G  k7 g, I" _
                print2arm("edma3init() Passed.",0);! i$ \- n& s4 ~! M9 t) J8 V; P
        }
# s' c* B: z( c4 W6 r7 u        else7 s: q/ M" |) L5 ]# l/ n- i
        {
! |: A. P7 u/ f                print2arm("edma3init() Failed.",0);0 [. ]$ j8 t$ w
        }
: x# Z: P' k2 [! A' `( r. ~       
- ]' _; @, @& R: e/ H0 m        if (result == EDMA3_DRV_SOK). s8 O8 t2 Z' [3 \, v
    {
$ z4 q$ ^# x6 |" s+ y$ s& U                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* W* [/ H; B: ~: I/ a6 j. r1 e                                                       (EDMA3_RM_EventQueue)0,
5 Y5 X2 q6 c3 y+ X& d) m                                                            &edma3_isr, NULL);
) m3 ^- ~: y* W  P5 d. p    }
7 @+ ^+ `& ^- F0 G8 k1 N        - ]4 m4 ^1 q2 B) q
        if(result == EDMA3_DRV_SOK)
# Z# H1 P% D4 Q. U. g. D        {! }! R1 }; I- d7 o7 n( F7 z
                paramSet.srcBIdx    = 0;9 R% {2 u, Y( @2 l
                paramSet.destBIdx   = 1;
) O# G. ]3 f1 G# E  r- e9 L% G                paramSet.srcCIdx    = 0;
5 i0 y- x5 A: k7 c2 b7 F" K1 z                paramSet.destCIdx   = 0;- {  X$ t3 K5 t
                paramSet.aCnt       = PING_PONG_ACNT;8 P) k6 c: z" q2 V* L
                paramSet.bCnt       = PING_PONG_BCNT;( |& L; Z- |2 Y  ~
                paramSet.cCnt       = PING_PONG_CCNT;
: z2 m* z5 U6 u. {2 b               
9 H! I  v( s4 p5 S                /* For AB-synchronized transfers, BCNTRLD is not used. */
  ~' E# _) u9 c# `( a# D                paramSet.bCntReload = PING_PONG_BCNT;9 G8 ?! m- G7 [, |: ?  K5 [3 d/ o
! m  p* @' t0 r4 e; I% m
                /* Src in constant mode Dest in INCR modes */, Q+ i$ ~$ P- H  a- }
                paramSet.opt &= 0xFFFFFFFDu;
& ]/ J# ~0 j  G5 c3 Q0 s  O                //paramSet.opt &= 0xFFFFFFFCu;* p8 X* x9 ~! K; [2 l" ~( W( c& d
               
8 _" ~+ B# |) Q- p) q7 S                /* Program the TCC */, H! e' i' H/ F  v$ @
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( d& R: m* r- a3 i  \
/ y+ L) a$ A2 H& i. B3 k; z
                /* Enable Intermediate & Final transfer completion interrupt */
6 o  D9 F: x! ~! y4 A' Q5 P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ H3 D2 f! _2 q6 ?" P: d
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 ^/ J! [, O# M3 U& l
& E$ b; i+ _6 T: W1 h/ _& z
                /* AB Sync Transfer Mode */
. ?+ H3 l7 T1 ~( ?. i+ @9 g+ J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);, Y& C4 t3 P$ X, \( i
                  x  c* Q5 o- B8 W9 Y, R6 x
                /* Program the source and dest addresses for master DMA channel */2 j9 f- n6 O- P. p; B( c
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! p7 s% v7 p# H  i2 O
                paramSet.destAddr   = (uint32_t)(ping_buffer);
9 i8 w$ g% V' n- A- Q+ N9 {) R- X- \2 l
                /* Write to the master DMA channel first. */. P8 O. Y5 Z1 g  k8 o2 k
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% M! f' F' G2 J( p
    }       : p* ?6 w1 V; m8 ?3 q/ K4 o

' ^" z5 U3 ?7 l8 e6 K2 X6 ^        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& n" l+ G! Z  x# A
       
8 c- K9 i3 G2 h    if(result == EDMA3_DRV_SOK)
4 Y" P- u1 B7 e" F* ?3 @    {& h3 r. ]; `. J" {  \
            print2arm("edma3 driver init success.",0);* r, N$ I$ n3 |1 L  ?/ J
    } 7 t: W& E& A; _% n
}
6 R" X5 Z2 u3 u' ], `. B8 W0 P9 r" R: e9 _/ G1 ?

. |) _7 A" X) C3 Y. e  d- REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 M) L) L% g8 c' i6 ^. B' S

2 b0 _# c1 g- Z6 q( L7 T; H5 z% R$ j2 k( S3 O

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 `% _! P8 p: B. o( J( E; c
每次DMA传输完成后都要再次使能传输
# m5 n7 U- ?- g( [5 o( {0 q( o
原来是这样,我明天去试试,谢谢了!




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