嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:, F/ e, z' u% ?( Q
#define  PING_PONG_ACNT          1" z6 t5 L! h; ^' y
#define  PING_PONG_BCNT          8*32*40
  U3 u7 W: b6 v1 _; s9 p" E6 r$ \//#define  PING_PONG_BCNT       1 ! ]" n0 m' |0 f. c: [$ N. G
#define  PING_PONG_CCNT          12 r0 X! _* {/ T$ [2 ?! I+ `
#define  MCASP_BASEADDR          0x01D00000
2 o0 o3 @- m+ N4 B# V8 J+ y/ X! w#define  Mcasp_RXEVENTQUE        (0u)
, f+ N) Z( H4 r! q0 a, z6 W" r% O5 P9 Z% Y: i6 H" Q
/* OPT Field specific defines */
( g6 Z- V1 ~" e% _9 {7 E3 B#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& K7 N( V/ |' B4 c* e0 S' `#define OPT_TCC_MASK                        (0x0003F000u)+ t- j* b3 f! V8 x7 h& G
#define OPT_TCC_SHIFT                       (0x0000000Cu)
5 Q* }4 K) t* M, E% I% y#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 w" n$ ~6 G% I3 W* [4 |
#define OPT_TCINTEN_SHIFT                   (0x00000014u)4 V3 }( u' I* S+ Y* B+ z/ c

6 x5 V* w% b8 {char ping_buffer[PING_PONG_BCNT];5 j2 b" S0 y. t* A) x
char pong_buffer[PING_PONG_BCNT];
* r! X+ A) z/ {; n4 p( s7 m" I  w5 Y/ d# h! R% V" \! k

. c( P' k6 S4 t3 l& G0 G" `  x% R0 u) U0 U- |6 f5 W" e- T- V
# u# Y$ y. h7 b# N
static void ys_edma3_init()* D: n' X5 J. B; K, j  i
{% V% C* h9 o1 v: l9 H
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) D5 @, T9 x7 G0 N        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 W/ V9 h, r4 T  V5 m! N" I3 m
        EDMA3_DRV_Handle hEdma;
) g& K3 k5 M, @8 V. A. M, R3 W$ e3 o    uint32_t chId   = 0;
1 W8 F0 X# N) Y1 Q; N  r    uint32_t tcc    = 0;
: G7 e% a# u/ t& O8 M' ], l
- x6 \% h0 k: ?4 E0 T9 l" k0 C    print2arm("edma3 driver init...",0);
" D3 K/ V+ q% M1 W, F6 N4 ]2 @4 L" ~; u
        hEdma = edma3init(0,&result);
2 o( [% }0 F' I; U0 t        if(hEdma)2 p; N8 _1 b; s$ {0 j
        {& u; ?/ C$ L) V+ D. K  Y
                print2arm("edma3init() Passed.",0);% W/ H' s1 n0 Y2 [0 I3 @& i' j& X3 {
        }
/ S& p( B$ ^. y# S, N        else
5 Y7 w4 H6 T/ Y4 \3 ^$ d        {* Q$ i# Z2 j9 Y. b# R& O: }" ~
                print2arm("edma3init() Failed.",0);
3 F  A! w% m/ N2 t, A( N        }
  @2 E: T4 z6 J4 Q2 H        ; p+ z. F) ?) a" w+ O$ v: p$ L
        if (result == EDMA3_DRV_SOK)& r* O7 K6 ?* Y7 s1 y, g
    {0 r$ Y4 D6 Y  P4 g. F; ^) D
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; A' S+ j9 \/ H# L: ]8 H+ o                                                       (EDMA3_RM_EventQueue)0,
' u( X5 O6 w, X; h: l0 z4 B                                                            &edma3_isr, NULL);% O8 u8 L( l( t" |2 N
    }
/ c; S8 Z4 g: D& D, x       
/ A% l. }+ ~' W  ^        if(result == EDMA3_DRV_SOK)
) Z- z2 |5 g2 ^( ]        {- k, Z* U( z2 ^* U4 K8 v, X3 c
                paramSet.srcBIdx    = 0;( T1 t7 _8 \. l: ?+ A( S8 w
                paramSet.destBIdx   = 1;  r+ W$ d, l9 V& ^  J
                paramSet.srcCIdx    = 0;9 \& h/ J* O* V3 b6 R8 e
                paramSet.destCIdx   = 0;4 X5 p  \" p! D7 m3 ]
                paramSet.aCnt       = PING_PONG_ACNT;
" l9 l8 X& t5 |  I* c0 B                paramSet.bCnt       = PING_PONG_BCNT;
5 Q/ a+ z6 N7 O: W+ w* O' ~                paramSet.cCnt       = PING_PONG_CCNT;
2 h1 x6 r' t/ n7 R: M  i8 m8 Q' }                6 ^0 V9 R9 t" l/ Q# k$ ]. V+ H4 t
                /* For AB-synchronized transfers, BCNTRLD is not used. */( q* W6 M2 W% z6 d
                paramSet.bCntReload = PING_PONG_BCNT;9 }# c7 J/ Z! q( v& ~$ ?) T
+ g0 Q, o+ O8 J, @2 T; H
                /* Src in constant mode Dest in INCR modes */+ k0 F6 V/ e! H" s2 P, w) M/ p
                paramSet.opt &= 0xFFFFFFFDu;
1 J1 ?7 V/ D1 a7 r6 L- b                //paramSet.opt &= 0xFFFFFFFCu;
9 A2 I$ o$ ]( n3 j( A               
, o' k, Y' Q; S1 [                /* Program the TCC */& R& }. r: t: x% N5 ~
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! T8 C1 v) B1 I6 _! W* A
  w& w+ Z* _: m5 F% j
                /* Enable Intermediate & Final transfer completion interrupt */% v9 e% f- c" @6 h9 j
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* `% }' A7 ^2 L; J) P  h
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 o) ?# W, |/ _1 O7 q4 [, i5 g4 ~

. r( f7 U) U( \                /* AB Sync Transfer Mode */1 ?4 R. ~5 ]2 J; }" Y
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 I# k8 ~* X4 n' i3 ?               
% ^% q! T& v1 F) G0 ?) `% B$ a* Z                /* Program the source and dest addresses for master DMA channel */. x' ]0 M$ @, }% b0 Z3 Z/ \
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
7 E8 e2 P$ F7 V8 }                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 X; ^, f' c# R  x* x' S5 w2 o( Z) C" W9 j$ t1 G( a. U
                /* Write to the master DMA channel first. */6 d, {; G! e: o, F
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
7 t5 f+ W  u* _" S1 m' X% h    }       ! H5 R7 p" a  a, |

" b$ p3 E; f% B! K& m/ {        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, x- Z, s2 q: Z# C
       
, Q$ G3 H+ E8 C8 D5 U: Z: {, X    if(result == EDMA3_DRV_SOK) , ^4 {9 l- K) g+ s+ w
    {
* F4 N( c" V# P6 \            print2arm("edma3 driver init success.",0);
; f0 o! X1 U# r" t5 p- M; Q    }
2 X. {$ f1 Z+ p}- ]6 s# e! E  q

* p2 B4 p" G3 S+ ~
* j4 }; o& j. d/ B6 AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, C4 O# }7 ], C2 n7 v! y1 d% X

: e+ e; `: f# d9 T) t# [. |- A9 F; p/ O3 w

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 w6 I: T+ `$ E4 G
每次DMA传输完成后都要再次使能传输

% P  Y: _5 }* |) D5 S, L. }, ?" g原来是这样,我明天去试试,谢谢了!




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