嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* C; v( o) }7 t3 K+ s. h#define  PING_PONG_ACNT          1
; K, K$ a1 `' A8 K2 ^#define  PING_PONG_BCNT          8*32*40
+ ?- G, G- w, k//#define  PING_PONG_BCNT       1 , F  j3 J2 X% w+ C2 Y
#define  PING_PONG_CCNT          11 N# T8 G! }8 w8 w2 ~( J8 h' b7 w
#define  MCASP_BASEADDR          0x01D000008 ?  s7 J  a; U! ?! }% S8 W
#define  Mcasp_RXEVENTQUE        (0u). r+ s% H' C8 |# \8 k2 {+ O/ D
2 ^) @6 V) b2 `$ v5 f
/* OPT Field specific defines */
1 }7 @: Z8 ]% u#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( Z6 h( F- G6 {6 J1 k" `/ I6 n#define OPT_TCC_MASK                        (0x0003F000u)
7 Z- o' p' a5 Y/ B/ h$ `" ~) I& V#define OPT_TCC_SHIFT                       (0x0000000Cu)
( a, z9 @5 N( Q( R! W#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 R6 x- Q% d+ G% L  R#define OPT_TCINTEN_SHIFT                   (0x00000014u), B  C) _6 b8 v
; g3 n4 X7 ^4 W
char ping_buffer[PING_PONG_BCNT];
& n, q1 y  L9 ^char pong_buffer[PING_PONG_BCNT];/ M# R7 S. u/ P  z
5 p* r3 Q3 V5 b3 ?4 K

6 _* W- Q& b* {2 W7 B7 u# @, y9 |4 L, O( d% y+ ?
: B4 C6 T5 |: S
static void ys_edma3_init()
5 y( z7 i5 y1 u! M% x: v* q{
6 S, ~# r4 N& `9 j& f0 z! s. u        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 S$ D5 t3 T9 O/ ]) @        EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 A; t% ~4 ~- v$ u; }& k8 s
        EDMA3_DRV_Handle hEdma;
! M; a6 R) b3 o$ k    uint32_t chId   = 0;
# t% P- Z3 H. X+ D6 y9 w    uint32_t tcc    = 0;
6 t7 B% ?0 M3 o& K! U, w# b* {' d( o5 }3 A3 A/ Y* B# _/ ?6 R) W
    print2arm("edma3 driver init...",0);
& M' x0 V' Y1 C- l: h' B+ Z; B; R2 U9 d. l7 J* \0 q
        hEdma = edma3init(0,&result);
( P* Y; o2 `& O        if(hEdma)
) m0 M( y/ z1 X, q8 l- ]! Y3 b6 s' F        {
/ N8 E0 `7 L) C3 f$ J5 v4 N                print2arm("edma3init() Passed.",0);
4 r# f0 w& o4 V1 J, C% v: [        }4 T! D9 P+ W7 A9 T2 V* D* B6 v+ j
        else
( n0 f( n  L4 H8 ?* e  e" o        {# i! B* E! Z. D1 m  ?, E; N
                print2arm("edma3init() Failed.",0);
! [( G) |4 |$ |6 m        }& V) L( {: C! ]
       
* _7 \3 k3 f8 }8 t/ X        if (result == EDMA3_DRV_SOK)# Y* z. |7 d+ N9 x$ }4 e
    {
0 p! x% E# G4 |& K- R4 y" `! r                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,4 r* [) {$ Y4 q! y3 o
                                                       (EDMA3_RM_EventQueue)0,
2 C" R5 b# K1 |/ D- ]- v( r3 A                                                            &edma3_isr, NULL);5 ?! T/ q* }; O" g+ N
    }- D/ I& Q' a: f# P
        ' \4 i$ `! ]+ d- {! a5 H6 G" Q) m1 [
        if(result == EDMA3_DRV_SOK)
" O0 x! |) r, R        {  v& I$ M" Z2 q( L
                paramSet.srcBIdx    = 0;
% m& A, V% X8 c                paramSet.destBIdx   = 1;  J) w# B5 {  }' w4 s& ~
                paramSet.srcCIdx    = 0;
/ Q* u/ d7 K, L9 _                paramSet.destCIdx   = 0;0 z3 y) F) c8 l8 E' N0 Z6 Y
                paramSet.aCnt       = PING_PONG_ACNT;
5 c/ ^6 X' Z: n- o                paramSet.bCnt       = PING_PONG_BCNT;& x# H; w5 N  G9 @  L
                paramSet.cCnt       = PING_PONG_CCNT;. q2 X- }, B7 p, I3 B
               
; f" V! {$ Z2 ?+ o/ K3 F                /* For AB-synchronized transfers, BCNTRLD is not used. */' U+ ^+ Y/ K6 A; K" r6 \" F
                paramSet.bCntReload = PING_PONG_BCNT;* P: @( i, I5 A1 G' K% f

& H  D/ B* s! ]3 X                /* Src in constant mode Dest in INCR modes *// w+ K3 r" H" j& d3 z- r2 D7 E
                paramSet.opt &= 0xFFFFFFFDu;9 J$ ^; C$ U" w/ ^0 |1 n; _8 w
                //paramSet.opt &= 0xFFFFFFFCu;
1 M1 B9 S+ q5 I+ c( ?$ \                . o9 k" f1 @0 L! l
                /* Program the TCC */
1 `% I& y. r$ [* K7 I                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! C" z  f) E; M0 D* J
1 c* U, w9 D4 Z
                /* Enable Intermediate & Final transfer completion interrupt */( v( U5 x, A/ R# @* x) Z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! Z' j7 y: m1 d2 {, u9 e                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
  u' p$ \1 w! {* k! U
! g/ Q/ y( d% J) v                /* AB Sync Transfer Mode */
" w2 p# y0 x* x& ~                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @/ }) g" o' n! {) E$ C               
2 D' F* F$ {9 D  q7 q. n                /* Program the source and dest addresses for master DMA channel */
" F, ^: _, P/ g8 L' Y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 ?& M* L$ l$ O8 Z5 S
                paramSet.destAddr   = (uint32_t)(ping_buffer);4 d# ^# b! t/ b. i$ Z0 T* @

1 e$ N: w8 p$ ^' }                /* Write to the master DMA channel first. */
9 w- q( @$ X- \& ^" F                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 g( P% D9 [6 C2 g
    }      
) G2 l0 j3 L( L7 J! @" v$ D1 [- N' @2 E/ i& t  p
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 }$ o; K8 W+ a        : ?3 e9 L; ]* C3 a* R0 b! d
    if(result == EDMA3_DRV_SOK) $ m' t1 y/ X& m  t) {0 g* v
    {
6 j6 W# O: u+ z% r% J. b5 f; R            print2arm("edma3 driver init success.",0);
* Y# u: x7 C- R" [" ^5 f8 }    } 9 n3 Y7 E: A2 T0 ~7 m
}# y8 M9 i' J0 ~( W/ N; T9 F7 ~

7 U; J3 Z9 R% W# J) o8 V( A/ ]6 m! O4 {0 T  d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 {7 q% i& K2 s6 A1 D

- ^% h0 d4 ?, ?* v2 B' b% t: v# ^. Q$ S: K

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. }( b/ A( X# E' A; s8 K每次DMA传输完成后都要再次使能传输
8 @5 I, ~7 c' n( r. }
原来是这样,我明天去试试,谢谢了!




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