嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. ]7 U7 f3 q* r' j7 w$ g1 L#define  PING_PONG_ACNT          1: Z+ Q8 M0 Z5 I2 i# V& e
#define  PING_PONG_BCNT          8*32*40
* l3 X/ ^* a+ t//#define  PING_PONG_BCNT       1
  G* x3 I$ P) X+ |- K  D. P  O" e#define  PING_PONG_CCNT          1
3 E: \/ t: A/ K( {9 {; f% C#define  MCASP_BASEADDR          0x01D00000
4 ?0 ]8 M1 T: n: x5 @+ g#define  Mcasp_RXEVENTQUE        (0u)
; Y  e: ]6 e  z8 l& A1 U1 I
8 P. H* l6 G" |6 R  Z, Y) L: W/* OPT Field specific defines */
( g* h" p* r3 K6 a1 p#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' w8 j: u8 O9 I9 W
#define OPT_TCC_MASK                        (0x0003F000u)- o# K0 o" p+ R0 L
#define OPT_TCC_SHIFT                       (0x0000000Cu)* N6 N+ }- b9 b) H' c6 _1 c
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)2 f* P! M3 H% O) ?, `' I$ E7 Z  o5 b
#define OPT_TCINTEN_SHIFT                   (0x00000014u). y9 J6 N9 F- y$ t/ g" B5 w$ w( o3 L7 R

5 X  O9 h" \+ b3 A3 A* Xchar ping_buffer[PING_PONG_BCNT];& c, X& f, M6 U; k6 l& i. h
char pong_buffer[PING_PONG_BCNT];  i+ \/ b" k  H+ k
; g" w. K# O1 A# _) q
: s) T3 w/ e2 w7 }9 Y

0 c' _, l8 D1 W! U7 e/ i8 y
+ m8 p% D- m4 t6 D/ h: Kstatic void ys_edma3_init()6 Z+ ]& f2 m7 w0 a0 T; G
{
; P2 v. E# w8 \; W2 M! z1 \        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, e! X' y  z0 d. b% h        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ j1 S+ b+ _, J
        EDMA3_DRV_Handle hEdma;
1 \# d9 S/ ~* B" \' W    uint32_t chId   = 0;
3 R) m' P$ X. N$ N9 P. [4 b    uint32_t tcc    = 0;$ R, t5 R0 ^$ V/ _) r$ Y5 L7 K

4 y% h: N3 G5 R: [5 l+ |# _8 t    print2arm("edma3 driver init...",0);7 n- b1 [" }6 ]
7 K9 L. U# h0 o
        hEdma = edma3init(0,&result);; @. v( q  C: a* D# c
        if(hEdma)  O2 e" T4 H% l7 i! j# J# d) P
        {
. r% p2 \; `* T7 e( L                print2arm("edma3init() Passed.",0);  `" Y. L7 J% ?3 ~- X- M" I
        }
* @% q1 H9 X( L9 e2 f5 k        else7 A% m5 X: g7 T# r4 K' {
        {
7 P% i$ P4 |- D( t4 `0 z                print2arm("edma3init() Failed.",0);5 w# ?+ P) \4 e0 c  b' f8 Q0 q8 `
        }6 B5 `/ Y+ N2 @4 J9 `6 x1 r8 v" n
       
7 K1 g0 [/ j9 E# ]& d        if (result == EDMA3_DRV_SOK)7 N, @2 s! i  z$ P! L
    {, m$ |# x& |1 O& H& R  y! u( j" O
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 S( H0 e, _9 |                                                       (EDMA3_RM_EventQueue)0,
2 r- k8 o: ?+ j' t& r                                                            &edma3_isr, NULL);
2 d! F" W' g/ ~+ W  W    }
* }3 ~3 H8 Q" k+ z' O, S       
) S( q- g& N' G. n- _        if(result == EDMA3_DRV_SOK)
3 }/ ~- f" h1 n/ o& X5 D        {
! Q7 B  a7 F( k! g$ |) r                paramSet.srcBIdx    = 0;
( Q  v! L: G3 \- E0 C% Q; [3 I                paramSet.destBIdx   = 1;
6 K( k" _7 C# H: F8 U                paramSet.srcCIdx    = 0;
! t3 ?" O+ a+ Y$ J- d                paramSet.destCIdx   = 0;
" [9 k4 n2 ~! S) s& ]5 K1 ]                paramSet.aCnt       = PING_PONG_ACNT;6 D( K' @; }" w/ Z; U. P' Y8 D
                paramSet.bCnt       = PING_PONG_BCNT;
* @8 H8 T  T  G6 L- d2 M) H; s                paramSet.cCnt       = PING_PONG_CCNT;! `" w1 W2 \( W# N$ z# c6 Y: o/ r8 a; u
                / d) h, k9 n. A6 Z/ C
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 t  Y0 q1 a2 N- o' Y. q2 i                paramSet.bCntReload = PING_PONG_BCNT;
0 \! n; k, L7 H1 X% N7 \; z2 d1 N" w! r  I3 L( G5 [" `- Z
                /* Src in constant mode Dest in INCR modes */
( ~" |, K& X, ^+ b                paramSet.opt &= 0xFFFFFFFDu;
, \$ |2 E. B& C2 U+ L" }9 @+ u; n9 z                //paramSet.opt &= 0xFFFFFFFCu;4 q) W: j( R6 [7 K* u
               
% `) W, l& T8 @* j- G/ y" W                /* Program the TCC */) @0 k+ k3 ~% Z( |7 ~' h% p
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 ^0 D( i5 E1 P1 d3 k" |0 e
/ R3 O5 F, \# A# E! c                /* Enable Intermediate & Final transfer completion interrupt */; r: L0 h9 C2 m& V: J
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" X% E! g6 Z. K$ t* ]1 f
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, v' m+ N6 e; z$ `, w$ ], f- [" ]- J0 A$ t
                /* AB Sync Transfer Mode */4 Y5 f# A1 H) k2 m
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# m) N- o2 u3 e2 Y
                ) Z3 S$ P. [; [/ ]9 c$ [: ~
                /* Program the source and dest addresses for master DMA channel */
4 B+ b; E2 R$ _) f( M8 c! N6 z2 N. P                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
8 w/ G" v* y+ O/ y- o8 T                paramSet.destAddr   = (uint32_t)(ping_buffer);: s( F' b3 K" f$ f5 d
  M- L* f; o$ a& Y- {
                /* Write to the master DMA channel first. */
7 a; u* w7 U) W8 _+ w                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 H" Q7 ~1 N5 i$ G8 G" A    }      
9 r6 f  u* R' b* {
- d/ Z3 w/ [7 b- ?9 T) u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: e1 j  ~8 q% K: z# ?$ _$ G$ Q
        5 Y) l, `$ C. g% ~
    if(result == EDMA3_DRV_SOK)
0 s) Q  D1 B: w6 |2 O2 z; K    {
. j* Y; f7 }% u- t' D            print2arm("edma3 driver init success.",0);( M, o; e  G0 ?3 n9 o
    }
6 o' I1 }7 i" a% i  D9 ?  N}+ D% h  J( z4 i$ D' L3 W4 g7 B

5 L+ I& s; j( C' d% m% r' I4 c6 I* v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L( {0 m& o0 }6 ~& s4 }! ]
" o: h4 q/ t: G: v# b4 J2 N2 M$ h; B4 `" ?

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. t7 z! @/ _" I4 O每次DMA传输完成后都要再次使能传输

' B+ J0 E+ N& \" V6 K8 ]* _7 q  C# K原来是这样,我明天去试试,谢谢了!




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