嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; K8 ~9 \) g# Y$ T1 N* K# g3 W
#define  PING_PONG_ACNT          17 W9 z) U7 k7 [9 |( g0 X2 o& e1 h& P
#define  PING_PONG_BCNT          8*32*40 * r$ a+ E) u7 U: P/ `
//#define  PING_PONG_BCNT       1
% k& ^7 E* f# o1 @#define  PING_PONG_CCNT          15 v* o4 |5 }7 n& ~. l3 a8 Z
#define  MCASP_BASEADDR          0x01D00000
- D- e1 a+ y4 H5 T. }- `#define  Mcasp_RXEVENTQUE        (0u)& x8 {2 q9 ^1 z% h7 ]) F/ X# \

! v2 e/ L- E4 P5 j/* OPT Field specific defines *// k1 i# t/ p! C# g; h' F5 ~: S
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) \4 O: @' c* q" I, z/ }
#define OPT_TCC_MASK                        (0x0003F000u)
& s0 Y* r& r0 V5 n. Q5 q" ]" N#define OPT_TCC_SHIFT                       (0x0000000Cu)) r: h4 L/ }& L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
$ P1 H3 \1 b: n5 N) Q" K. L' ]#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 C) o3 @- z' R% e# T
9 s9 z& R8 {. c& e3 {, ]
char ping_buffer[PING_PONG_BCNT];
# c% j1 Y  v, W% ^char pong_buffer[PING_PONG_BCNT];
7 v# N- ~* b+ L; ~
& i0 b7 W- r- X( z& c3 m2 ~
  x% U5 Z6 o* ]9 [1 {1 Y2 R. @( ?3 R9 B7 a$ P  Q. h1 K8 O0 s" @

( G/ I: P& K+ q7 {$ Dstatic void ys_edma3_init()
9 z  N0 O1 S# C{
& {2 Y# G% a# h, t        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ M1 }( }3 @+ q2 S, @. S4 a! E
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" ?* `( x3 Z( Y, U: B* r# E) s6 U, D        EDMA3_DRV_Handle hEdma;3 {( e% N+ t: l/ ^9 ~& T
    uint32_t chId   = 0;
( \* Y) @; K* _( `1 F) S8 p. e' Z    uint32_t tcc    = 0;
: C; S( T4 I6 g1 H; T4 d0 u, t- b8 R3 Z
    print2arm("edma3 driver init...",0);
/ U% \0 k1 e  \2 Z
  R" [+ O" z. Y8 Y        hEdma = edma3init(0,&result);: L" i4 ?. \: u
        if(hEdma)
' d; M$ A; o5 L: Q6 \        {
0 M: O9 d9 T6 H( ~$ e1 [( }9 {                print2arm("edma3init() Passed.",0);
; F- R( k7 V( Y5 d        }8 R; N( o, j. {6 R. P, T. s) G
        else9 n' p$ V: P% X6 g( Q
        {: C7 r" \( f& d: x. o8 h6 h' b# U
                print2arm("edma3init() Failed.",0);
5 x& y* d" Q% W7 I+ F        }4 O& b# ^6 p, T* M% w
       
1 t. V3 e3 q3 q$ U2 @$ [        if (result == EDMA3_DRV_SOK)
/ y- X  y1 T7 }" t& N    {  o# d+ w- g3 U% ]; e! k" @0 l
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,& g9 g. \% b2 V$ v4 D) Z3 v* C' I
                                                       (EDMA3_RM_EventQueue)0,/ @! [" L) R6 w( G- j4 m5 {
                                                            &edma3_isr, NULL);
* \9 b, E2 z" A5 Y    }
8 A/ x0 @& y( B' B* e        5 A! {$ F& G& l
        if(result == EDMA3_DRV_SOK)1 W0 u  M& G. g1 g1 o
        {/ F9 D5 o/ d3 |2 \3 a+ h
                paramSet.srcBIdx    = 0;7 P1 U% ?1 E, h- B
                paramSet.destBIdx   = 1;
% j: w( P" W. f5 p7 Q2 H                paramSet.srcCIdx    = 0;
3 M* E: m) }4 X/ ]9 q0 C                paramSet.destCIdx   = 0;
# g* {. ~/ t3 J, W+ m                paramSet.aCnt       = PING_PONG_ACNT;) }3 K9 p) J, o* D% M$ b3 g) C; Q
                paramSet.bCnt       = PING_PONG_BCNT;
' g) ?+ d- P( x9 e$ E  H* b# z                paramSet.cCnt       = PING_PONG_CCNT;
% z+ r( e+ z' U+ i+ |8 C! Z& A0 e                , a1 ^4 a. a4 F0 B' a& W4 j
                /* For AB-synchronized transfers, BCNTRLD is not used. */
* ~9 H- x$ H, e: g5 S                paramSet.bCntReload = PING_PONG_BCNT;) C! F& l# k: r) u5 }1 V- f
* x2 m5 ~" Q, X% x4 e8 X
                /* Src in constant mode Dest in INCR modes */
" d9 f1 w! r: t) s! q9 S                paramSet.opt &= 0xFFFFFFFDu;% s% N& o- i' i
                //paramSet.opt &= 0xFFFFFFFCu;
8 u: O( U$ N6 U" a) @9 \" A               
) x9 ?( B) W+ U$ p  w- C  S2 `                /* Program the TCC */
) f" F( H- x! ^3 x. A4 [9 @2 j# R                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! z8 L, M% h0 Q6 Q* |7 ]4 M9 ~" I7 k& o' w) T! Q( F( w
                /* Enable Intermediate & Final transfer completion interrupt */$ X" E# ^7 A2 O; s7 W+ Z$ J
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, O5 O+ O, Y; Z) R
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& f# C! x- Y: w; J
' U; m6 R4 x$ d                /* AB Sync Transfer Mode */: W: I, K/ g, s% T4 I
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% }1 {& [1 O' r; x) g" T
                + w: {" D4 Y+ W. ?
                /* Program the source and dest addresses for master DMA channel */  N* s( Z3 Q% h5 R% f9 ?
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
1 ^1 o" q; l3 C& }: Y& o                paramSet.destAddr   = (uint32_t)(ping_buffer);" l8 v9 W3 D1 b$ H/ n

, D# @* G. ~+ x                /* Write to the master DMA channel first. */& t3 J- e# t- S* i! t" t0 U, n
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ X& ]' @$ S. p' _% @& Y- g0 B    }       * N% N( X. V6 F6 k9 ~/ x$ U
4 M0 D/ `/ D2 t- U4 E9 M* W9 E
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ Q) d* y6 `4 H
        : Z  S& |6 B% \# A* {( i2 ]
    if(result == EDMA3_DRV_SOK)
& A0 V0 V. a0 G  u! {/ j$ i    {
: h* u: E, X$ E            print2arm("edma3 driver init success.",0);$ p: I) Q4 W( |; u- v
    }
5 {! Y+ k5 r" [/ S6 V}
& ^% h& @4 h1 ^4 V2 |' y" P9 |) e5 Z

8 ~  X9 y* Y; q1 }: CEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: C! p! H8 M; `" p# k+ C

6 ]7 Z: U9 U  P2 g& B' J! @
# T( g  H, Q3 A2 e- f9 T5 i: Y
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, x  Z$ }$ h+ Q
每次DMA传输完成后都要再次使能传输
: d. f* n$ [8 J/ N+ F4 K; ]0 T
原来是这样,我明天去试试,谢谢了!




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