嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' R+ x2 _8 L- s% s" |8 B#define  PING_PONG_ACNT          1
( T/ q/ {& ~% r#define  PING_PONG_BCNT          8*32*40 4 l( E% B! \/ V1 [0 j
//#define  PING_PONG_BCNT       1 + L9 _2 _& {' ?0 u0 _' z
#define  PING_PONG_CCNT          1
8 Z0 h! d: t* u& x$ @3 V/ A, T#define  MCASP_BASEADDR          0x01D00000
2 u  E+ U9 |. L( }6 R#define  Mcasp_RXEVENTQUE        (0u)9 j. N! H4 M& J! f) p  E6 Q+ q

' I! W- d8 A9 g7 [( [2 l, r/* OPT Field specific defines */
+ v* s' P: X/ [0 F2 K7 k- c#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 q. ^! |4 s! o& R' ?#define OPT_TCC_MASK                        (0x0003F000u)
* F% y! o9 r+ f+ X#define OPT_TCC_SHIFT                       (0x0000000Cu)
: @9 {) W6 L1 B. W. e$ e' Z#define OPT_ITCINTEN_SHIFT                  (0x00000015u)$ Y8 X; ], l! ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
. D. G) v; n% D+ l6 b6 d8 S' e8 }5 d. g1 _9 Z! o+ C. ]
char ping_buffer[PING_PONG_BCNT];! w- X, U8 @7 Z1 h8 D
char pong_buffer[PING_PONG_BCNT];
' @! U% h% P- ^8 b0 J* N3 m1 a; x
: M! s- V7 j9 F' s/ i
: a9 ~( M1 A5 X( N6 E6 J" B+ A! h' D/ L3 N+ _6 m+ O

  |( ~8 K8 ]# M- D- Sstatic void ys_edma3_init()# N* t. J3 P/ _- G
{7 c3 g% i8 B) j# \8 U' B) w
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 e# w2 Y, N: u/ b5 A- y. K        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 g1 y; u! w  v$ Q3 F        EDMA3_DRV_Handle hEdma;
6 Y- H6 W9 T4 K* f    uint32_t chId   = 0;! e, {7 E; Z! }: K& y# M
    uint32_t tcc    = 0;
7 ]7 g8 r: d' ~% q0 }8 ~& }
8 F1 m/ S/ o5 r" R0 [9 j/ `+ q6 |& T    print2arm("edma3 driver init...",0);7 H! }2 I" E, q4 Z7 c
3 S* W2 o( U, Y" |. `
        hEdma = edma3init(0,&result);0 H, Z& l# K# ~7 Z
        if(hEdma)/ r* a7 O4 e, k* A. a4 @
        {
$ o) w, `0 J! z- y3 V                print2arm("edma3init() Passed.",0);8 Z, K% U% I, E, X1 q, }* t1 U' e0 ^
        }
8 l0 x8 t" _- K        else
# b) }" f' f# w# x5 ^        {3 q9 Y; {# D# F  o/ f' G
                print2arm("edma3init() Failed.",0);
# u4 b, q; Z: V5 M        }" U  p  M$ W! `$ l7 A% }8 g
       
9 k! C$ \( X# ~7 Y        if (result == EDMA3_DRV_SOK)* I' W1 E" n3 ~) l
    {$ t# h4 g0 ~& {
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 ~8 N8 ^8 u/ e+ Y$ x8 r+ e                                                       (EDMA3_RM_EventQueue)0,
; x* `) W* H1 {3 `& s, r9 V                                                            &edma3_isr, NULL);; a  t' z) s0 H8 b% ]! K
    }$ P! R& e+ @" b. N4 B# A+ f% }
        3 |0 p) M. l0 L$ U0 ?0 L
        if(result == EDMA3_DRV_SOK)9 E; \* i! r% m. p8 j2 I- h
        {
8 d" l4 ?" `- E. z                paramSet.srcBIdx    = 0;
0 I8 r! k3 P# @1 O* O  \                paramSet.destBIdx   = 1;: W. a) o! H; j/ u
                paramSet.srcCIdx    = 0;, @8 ^4 N. }: t# o0 ]; L
                paramSet.destCIdx   = 0;
# I: L: @4 H) v( t7 F5 f8 E; `6 T# k+ M9 U                paramSet.aCnt       = PING_PONG_ACNT;
! Z- i- s" H. l1 v; e' o" ?                paramSet.bCnt       = PING_PONG_BCNT;" j/ @1 F& `) r4 Z
                paramSet.cCnt       = PING_PONG_CCNT;
. v- Y9 I  y$ \) {- @& x0 `8 X               
+ M* r: I7 I$ x6 \6 D, c  ~$ g                /* For AB-synchronized transfers, BCNTRLD is not used. */
. W: T  L7 T. @4 o5 c2 k6 @                paramSet.bCntReload = PING_PONG_BCNT;
/ F" o. K" p. b6 c4 s* K/ H0 L% i- i9 Y8 J1 O8 O
                /* Src in constant mode Dest in INCR modes */2 u% N7 H. _2 x* p
                paramSet.opt &= 0xFFFFFFFDu;' p+ U$ ~: i2 \
                //paramSet.opt &= 0xFFFFFFFCu;
/ z, A; P" N% U. v2 B) ~                + q; D2 x" ^% a( k' [% S- S5 E: g) W
                /* Program the TCC */
7 ^) p- D! N; }% R& {, ]; P: ^                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 Q4 I. w! R5 R9 ^7 i

. u' a# Y1 g8 H9 V) P0 E                /* Enable Intermediate & Final transfer completion interrupt */
- \9 }  }: S' r- J! Y7 l: b                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! s  I6 [" C* i( u
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 I4 k% s6 m. K7 m8 s2 L- {! D) N; D3 v- O+ l
                /* AB Sync Transfer Mode */- G/ I( T8 K% I2 G% G1 n1 ~
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ Q3 @5 r+ S) b4 K' ]- o& e1 f
               
) d0 K+ o3 \# O) h- x                /* Program the source and dest addresses for master DMA channel */
& w7 |. o" r$ T" W7 u; q# q. g                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
. P3 o" o$ n0 l9 j                paramSet.destAddr   = (uint32_t)(ping_buffer);6 H3 H( v+ e# f* \! ^
+ }4 B" h' V; J2 a* N
                /* Write to the master DMA channel first. */
% X( h5 r& Y9 I: C. x8 G4 V% V                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! V! P( }% D3 h- J) a1 q    }       + Z6 r9 l; L2 O# k# ~; N7 g
6 [  j% V& O' T+ {+ q
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! ]' ^9 P6 x) F0 X. T: m
       
7 M; p, K2 s1 q, A4 f& g1 M    if(result == EDMA3_DRV_SOK) 7 w8 h: L+ x: e3 O- ]
    {" U5 r" P" y6 @. P$ c
            print2arm("edma3 driver init success.",0);
. d0 B3 ?6 T. W$ r7 q1 z9 s    } ; i; ?6 @1 b' I( o, J( e- k$ X
}8 p/ ^9 a. s7 Z- U3 Q
* ]! P9 n& j5 c/ k

$ I' V$ X; H- |8 S5 w4 ^" SEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, v; E8 r* h+ i4 d5 L9 {; M! L
$ j( o& t7 Z" f/ T! W% X+ Q2 i
( U& w7 T0 z5 k3 }, B8 f6 B

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ Y5 ]0 u3 c0 s+ m6 p5 N# v0 ]
每次DMA传输完成后都要再次使能传输

- ?  J- F7 L. K5 |) x7 H! K% j原来是这样,我明天去试试,谢谢了!




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