嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! P  _2 X) K) p/ v6 S#define  PING_PONG_ACNT          1
- }. E4 _  Y: j/ }8 c1 e#define  PING_PONG_BCNT          8*32*40
* L$ }  x+ q$ Q4 @7 f' T/ `//#define  PING_PONG_BCNT       1 * F1 N5 z/ ~* i3 a( u+ @: C) I# d7 L
#define  PING_PONG_CCNT          1
/ o: _. g1 N: [' {9 Y; g; g#define  MCASP_BASEADDR          0x01D00000
& G) |" u6 {! j) N#define  Mcasp_RXEVENTQUE        (0u)
0 A- K; i5 ?: F$ L. b! N' A/ M5 d1 E
/* OPT Field specific defines */& J; ]8 x/ V' Z% Z
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)( `7 m0 M9 Y: j2 ~
#define OPT_TCC_MASK                        (0x0003F000u); K% d. |, B% a# v2 R$ g; V3 v
#define OPT_TCC_SHIFT                       (0x0000000Cu)
" F) E3 f% t7 v/ ~- D% P, F& `9 O#define OPT_ITCINTEN_SHIFT                  (0x00000015u)  X7 r( E* F# R
#define OPT_TCINTEN_SHIFT                   (0x00000014u)* l4 C3 n; o( k4 w
6 k/ F3 Z* a$ c$ B  i$ {6 ^5 ^& @; o
char ping_buffer[PING_PONG_BCNT];
1 @4 z6 N4 H9 u, |( @6 n. nchar pong_buffer[PING_PONG_BCNT];
+ @, f3 w) e2 T8 `; X( n6 l
# p7 ^' Q" Q1 v  O4 W" `4 @9 M% @) |4 Y$ c
- [6 Y3 @' c$ X" U* q8 ~2 H. z  Q
+ I! b5 e9 @( H9 }! N
static void ys_edma3_init()* f; [6 y' T2 \/ H/ ?! a
{
6 U7 Y' q7 w% O- p: L: Z0 k        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 p0 X) P7 [: V3 q( b        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ w' y( K3 g" H" D, t1 T        EDMA3_DRV_Handle hEdma;
0 i4 o! E' g2 x! f    uint32_t chId   = 0;' N1 d2 `( o5 B) x) g
    uint32_t tcc    = 0;( Q6 a: F) F/ Q, h
& U1 e$ {  u- D6 p
    print2arm("edma3 driver init...",0);
! @0 ?6 c! D" H2 g/ @0 e2 a0 }* Q; t* ?6 Z8 A
        hEdma = edma3init(0,&result);) n) `0 W/ \, V( Y
        if(hEdma)1 [8 g7 E! {6 x% w, ~0 B0 n
        {
' X" z* v+ P5 |3 T% a                print2arm("edma3init() Passed.",0);. I, u/ g) R0 s# M
        }
. b8 S# [; Q& U$ ]        else
. N& A0 V: ~/ L- Y4 V6 f) @        {* W4 [' ^9 }$ c& @! D. u) V+ g
                print2arm("edma3init() Failed.",0);
3 s2 v7 b0 p( D% [4 G        }
* q' j' ?9 S" m0 q1 j        ) `$ A& @$ O" N- H
        if (result == EDMA3_DRV_SOK)
8 t5 r4 M4 @5 \- f9 B    {
4 T$ x$ g  k" J7 g' K                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* C# V6 J+ ~: `
                                                       (EDMA3_RM_EventQueue)0,0 ?% A, C6 w5 Y# @
                                                            &edma3_isr, NULL);
% L) {. Q7 t. Q) e% L1 Q6 `+ ]    }
: V5 _1 ?8 U6 o       
/ [' W1 M% m4 {6 a& K        if(result == EDMA3_DRV_SOK)9 k6 ]  _* a8 A: X) Q/ b
        {
( @# g5 n1 W( m8 A7 d                paramSet.srcBIdx    = 0;
" s( J+ R% K6 A3 P                paramSet.destBIdx   = 1;8 Q- u$ w' E# q; E) R  ?
                paramSet.srcCIdx    = 0;7 B  W3 j) v8 }' J* v
                paramSet.destCIdx   = 0;
2 B2 d6 [9 R( l+ L                paramSet.aCnt       = PING_PONG_ACNT;! D8 z, }( m; d% N  t# V' b9 M
                paramSet.bCnt       = PING_PONG_BCNT;, q" b* c7 s/ M$ d$ ?9 y
                paramSet.cCnt       = PING_PONG_CCNT;  F% y) J; o/ V, i9 ^
               
+ t9 K+ A. A; ^& T  u- B                /* For AB-synchronized transfers, BCNTRLD is not used. */. W9 @7 ?2 f" K( u, X5 f
                paramSet.bCntReload = PING_PONG_BCNT;
+ @% [6 i2 _  a  T+ r3 a
7 z/ t; U3 j3 c' l) F; b                /* Src in constant mode Dest in INCR modes */
* I! n! p0 r- Z% f                paramSet.opt &= 0xFFFFFFFDu;+ w$ K( Y% \1 K; o% w$ L
                //paramSet.opt &= 0xFFFFFFFCu;- V, o  j: t/ B# v  }
               
$ g- T4 ^0 i$ l6 u* S( s( W; `( B                /* Program the TCC */. O$ A1 K7 @& N/ f% e" x5 E+ ^
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 L  t0 G" M/ G  I: o- h+ y
. l' r% P9 P* `9 T0 c
                /* Enable Intermediate & Final transfer completion interrupt */7 c0 ?* G, k, k* w% F
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ ?& @' }! u/ y
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 A# f" [/ u8 W

$ {0 s8 y8 i; |, u, J                /* AB Sync Transfer Mode */+ p6 n- W& J8 R  f+ l
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' V; L( P' ~# Q" |( a' Y4 Y
               
. S! [3 `- p8 X% J; ?/ k" U                /* Program the source and dest addresses for master DMA channel */
, q, h, Y4 N& `0 I% l# w; G0 F                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 Z% m# Y7 u* Y" D8 s                paramSet.destAddr   = (uint32_t)(ping_buffer);6 T5 y' ~; L) E9 A* X; o" x
# l" M3 o6 I% R* o( j  N
                /* Write to the master DMA channel first. */- `( |' B) z% d0 J: {: o% i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- b* v* M& K$ q/ ?    }       5 y& Y1 N: R2 j# Y' G# c* O
! n  g8 e* k$ ~  E9 ~* g7 I: [
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ ^. m. g( D: }  w1 R6 s* Z: ?# q
       
" ^% g/ f+ |  N, N( r    if(result == EDMA3_DRV_SOK)
# O3 B& j% T# Z2 r! V. \8 y* v    {% p/ w4 ^2 y) `) d9 R
            print2arm("edma3 driver init success.",0);
# [! }( b1 ?. _: ~* N* H, _    } ' A) a# B5 M8 q% [0 k' d9 [
}
+ [2 C' P% L2 ^+ L8 c+ Q* o, i9 r1 w* q
3 Z7 s* j  ^  R4 N% y; k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' f! @! i" O& g# E9 x
" Y2 {/ o, B7 R$ d' S5 G
' O- E! C/ y9 g( ~& a6 e* D

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 o. N; y8 Q2 b  j) g! Q: i  _每次DMA传输完成后都要再次使能传输

2 p- V7 b, o5 P" t. E; _原来是这样,我明天去试试,谢谢了!




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