嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: r# ?5 q+ [2 [3 F& h& q) n
#define  PING_PONG_ACNT          1
) b) a) v  `4 ~# \8 k6 R#define  PING_PONG_BCNT          8*32*40
$ p) N$ d. p8 T5 j- D//#define  PING_PONG_BCNT       1 # ^: T( ?; D5 {, H/ `" X: L
#define  PING_PONG_CCNT          1$ R) y% _! p4 C, y+ l) W1 a/ J
#define  MCASP_BASEADDR          0x01D00000
6 d  E5 e4 p8 v4 \#define  Mcasp_RXEVENTQUE        (0u)
  M" y! B( d# h2 ^6 s% U
) d  k# q4 \& \2 M" b/* OPT Field specific defines */; W5 y$ ?; K' L) f: p* [4 o3 H8 A
#define OPT_SYNCDIM_SHIFT                   (0x00000002u); v& J" I- b' P& \0 x+ ]+ \
#define OPT_TCC_MASK                        (0x0003F000u)
  o6 }9 \" I) W; R#define OPT_TCC_SHIFT                       (0x0000000Cu)
4 g5 V7 _' U* Y6 y% `#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! {  \- X# |' J9 }#define OPT_TCINTEN_SHIFT                   (0x00000014u)
* e0 a$ T' ]& X) {1 D) a; t2 g& k' v* w
char ping_buffer[PING_PONG_BCNT];
2 v2 D( c4 J9 t* L: W3 Tchar pong_buffer[PING_PONG_BCNT];" x- _9 [" R# |

. x+ i6 C1 `; [$ H: |( X) J
2 Y! {2 C+ O4 T. }7 x) p) @8 a1 f) ~# V# Q* y; Q
' }2 X* ~2 t3 ~* O3 w6 _9 Q
static void ys_edma3_init()9 U! E! ?- k/ F, H7 k
{
+ A8 R5 P* ?/ Q0 o        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) d2 e7 T% P* U' v* O8 e' G
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 m$ o/ j: ^, [& }& e% a" v/ m" i& `* q        EDMA3_DRV_Handle hEdma;
/ d( H3 X- |$ i! ~, |* c3 o    uint32_t chId   = 0;
8 Z0 l; T6 ~9 E/ v1 N    uint32_t tcc    = 0;+ C" U2 x. |, g/ R' N

! q% ~+ l, a- b0 o" m    print2arm("edma3 driver init...",0);
" s( x+ e5 `! U8 ^0 Z" i# _1 b) A* ]$ T2 ?" [- ~4 ^
        hEdma = edma3init(0,&result);8 l: O$ l/ [& |  N: w, Y
        if(hEdma)
, g+ j, z+ c" |; |        {
) e1 P/ D1 d7 \2 [4 Y9 k( a                print2arm("edma3init() Passed.",0);% A; f! Q9 x, S6 [: R
        }' A4 @. X2 s; q4 g3 ~7 c
        else' @& }. {/ g' x
        {
- ?/ B' v; @  W% Q9 R) v                print2arm("edma3init() Failed.",0);# i" Y& T$ Z: r/ J
        }
; P: m/ H3 D. y! O' B7 m$ O$ P       
1 a+ }0 y. W9 X3 B        if (result == EDMA3_DRV_SOK)
: m1 K$ f& T. A2 Z( O/ I1 W    {
$ G3 C# |" _5 A: o, c                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ U6 v) W  r5 F! d
                                                       (EDMA3_RM_EventQueue)0,
$ N9 S1 O- D( U! A  P% K                                                            &edma3_isr, NULL);
4 s/ j8 b! f6 L& E7 z    }, g. u+ j/ {4 E, o; G
        ) A: i1 x* M9 C4 f3 c- R  s$ A
        if(result == EDMA3_DRV_SOK)3 }' s4 Z7 r; l6 }1 e
        {6 w0 J) N' b! D" S$ D+ D+ Y
                paramSet.srcBIdx    = 0;
" T, |2 _" u, M0 D0 u9 N) y& n                paramSet.destBIdx   = 1;
. Z8 d3 D; m+ q                paramSet.srcCIdx    = 0;
/ o* `; [0 S8 t7 [$ O3 p9 ~6 _                paramSet.destCIdx   = 0;
8 J0 x3 j& i0 q- K% y/ g! W3 E# x                paramSet.aCnt       = PING_PONG_ACNT;3 [2 b; M+ c% g: }
                paramSet.bCnt       = PING_PONG_BCNT;" T& E8 ~1 k; H; B: u. f3 J
                paramSet.cCnt       = PING_PONG_CCNT;0 `* ~6 }& H* s5 R% b
               
( a+ U! U# I; }4 o/ \9 C# g4 x/ W                /* For AB-synchronized transfers, BCNTRLD is not used. */; A; u% L( g+ ]; j
                paramSet.bCntReload = PING_PONG_BCNT;
# |  S& M4 i7 [6 U* h. b+ B% j' S
                /* Src in constant mode Dest in INCR modes */
) ~4 I- o2 A* M% N! |' Z. E/ D                paramSet.opt &= 0xFFFFFFFDu;
  V; w) `( \/ z7 Y                //paramSet.opt &= 0xFFFFFFFCu;
+ e+ n7 C1 _7 G: S7 r+ }                1 ~  n! h+ y- o
                /* Program the TCC */$ w7 `' C  U8 w, [/ D; V
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) E: n- C4 f5 o' d# J2 ~1 \4 z
- k! C* f; k; _) w4 `. @* ]
                /* Enable Intermediate & Final transfer completion interrupt */7 n+ ?8 N: V; H+ M3 J& |+ b
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 Z' \3 J) k/ w) Z                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 J! {9 z; T/ n: ?- \% x& Q% V1 s9 W* {; u8 I/ S4 k; q
                /* AB Sync Transfer Mode */$ K6 F8 W: I% @2 w3 {6 }) B
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" p! Z, W; `& m# }; V
                4 ?6 e% S& q, `% r4 \
                /* Program the source and dest addresses for master DMA channel */
  s6 ]/ {7 V) a9 k9 J                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  x; u( ?# n9 V& P! d) |                paramSet.destAddr   = (uint32_t)(ping_buffer);
9 {" A$ y* A% b0 _
# U+ p* Q9 W+ F- |                /* Write to the master DMA channel first. *// s1 j. G% r) w+ u7 \" b5 Y7 [
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);5 q  w$ ~# G  m  t- P
    }         G1 [) C3 S0 u4 |

" B2 ?/ D5 ~& C' h) }& F' L        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 H+ h/ l, R% j' ~3 \6 n8 J5 ?
        0 k% F( g6 G' Q  `5 ]2 h
    if(result == EDMA3_DRV_SOK)
8 o0 f' j9 O+ l( C; v! @' P    {* ?  r* c+ k$ j; d- X9 n3 `
            print2arm("edma3 driver init success.",0);& i2 T, n% j1 y3 |1 W9 H% G
    }
/ i  Z) _% M9 T! t+ D) t}$ S  R) H+ \2 I  e! b% t

, c$ R7 ~/ s7 J$ x3 g; s
; u6 P% G' V6 f) U& W  a1 [EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ y" V6 g( m( C, q1 [) G
3 [  b' P0 r7 O; m) N$ t% [! i0 m) f. i& J6 }! Y( S, k

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47. y" v; d2 ?9 O: M! f8 Q
每次DMA传输完成后都要再次使能传输

& v2 T6 l+ Y) O# G/ m+ h# q8 I( {) P5 ~2 c原来是这样,我明天去试试,谢谢了!




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