嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ h5 A8 h5 J* N# y+ P- V' ^#define  PING_PONG_ACNT          1! t4 J+ v& L0 E7 D  I% `& O
#define  PING_PONG_BCNT          8*32*40
+ W/ f/ i( N) Z6 E  k//#define  PING_PONG_BCNT       1 , v0 n! o' ]5 r5 y$ V: I
#define  PING_PONG_CCNT          1
6 X# d/ {/ s) t) ~#define  MCASP_BASEADDR          0x01D000005 Y# h7 W2 u3 l
#define  Mcasp_RXEVENTQUE        (0u)0 f+ c2 m$ p- ]+ O: ?. d
0 ?+ v, D" ]' |; G
/* OPT Field specific defines */
- @3 o; h; e$ ], u( {#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# q& `, T/ G* g, W2 K#define OPT_TCC_MASK                        (0x0003F000u)
1 P( i  f; o$ u2 Q6 T+ q#define OPT_TCC_SHIFT                       (0x0000000Cu): h* Z& F( V  }3 g0 ]2 \) b; e
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% o9 K% H  |8 r0 d9 }. Z1 `#define OPT_TCINTEN_SHIFT                   (0x00000014u)- H0 n/ [! `5 e7 j
, u  M3 K: y# w6 ^; `0 ]$ O
char ping_buffer[PING_PONG_BCNT];
, l1 C8 m5 B& H# b( fchar pong_buffer[PING_PONG_BCNT];
/ L; L9 F8 A) g& G( \) \
  t% n( z$ J2 s! [' |0 j# T
. X) Q. C) o, f
% v; q# y7 }  Z/ {( |: C. K$ @3 y0 J! W! U3 _6 a# N$ T1 _7 I0 j: g
static void ys_edma3_init()
- K! `! p+ |# r! `{/ E# v3 [* a' p
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 Y. B, H9 k  s
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 n) k- v; l: g# c0 \
        EDMA3_DRV_Handle hEdma;% P  _; N; v4 c0 ]; u
    uint32_t chId   = 0;
: }+ u1 A' |$ l8 R% L& K' h4 o    uint32_t tcc    = 0;; V$ n$ f& K' E- X
* g! o4 L7 {) u8 W) J4 ~2 f
    print2arm("edma3 driver init...",0);
! x) H/ W3 M5 @$ w/ a
4 D, s1 ^9 L& W9 A8 W8 C        hEdma = edma3init(0,&result);* i6 y: }, ?# {! q! i: ]9 s
        if(hEdma)* X9 I7 U. a: w% T2 i# S" {
        {; g" d* o1 j& [) ]; C& Y
                print2arm("edma3init() Passed.",0);7 j$ I/ y+ n6 o$ t, c' f+ s
        }
& D* T7 h0 U" x) o5 G1 c        else
' K+ g7 o3 w$ D. W0 Q; w        {
, J2 Y+ B  X# N, `' S                print2arm("edma3init() Failed.",0);8 q7 w$ g- [1 a' W$ O
        }
1 B' Y1 x: A0 d2 x$ m  `$ G        # R0 ^4 w9 ~( q# V! h  C+ F
        if (result == EDMA3_DRV_SOK)
+ d0 V* z0 I% \$ [" R! d8 L. J( N    {$ ~* d! j* R1 t2 u! J6 t( G
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 ]  y% d$ v8 F+ N                                                       (EDMA3_RM_EventQueue)0,9 `* @6 v+ O2 \  h: v. O' }
                                                            &edma3_isr, NULL);
4 R& W$ y! a; F9 R4 i' p+ Q    }
5 u* ?, F6 F& s8 K- H        # G* @# V' K7 H0 V1 d  `$ D6 q4 G
        if(result == EDMA3_DRV_SOK)
4 q  E! t$ K! ?3 j7 @        {
6 |9 _( x1 }9 m% o+ t" b( L                paramSet.srcBIdx    = 0;5 `+ a$ `7 \6 s5 E4 i' \; E
                paramSet.destBIdx   = 1;
$ ]! E2 k0 c3 a& X1 B) B+ K                paramSet.srcCIdx    = 0;) u$ X% V+ Z: E
                paramSet.destCIdx   = 0;' M6 K( _( c6 i/ `8 _
                paramSet.aCnt       = PING_PONG_ACNT;% k2 }/ W  |5 H( Q  S, A- c# e) W* w
                paramSet.bCnt       = PING_PONG_BCNT;$ z7 J. X% {8 h" O3 r2 H& Q
                paramSet.cCnt       = PING_PONG_CCNT;
$ u8 [8 P& I$ I* y. l& O- J7 L: f                / }8 _* M8 }$ L$ V
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 N  Q; n  w5 J. y, W+ u
                paramSet.bCntReload = PING_PONG_BCNT;2 C2 a$ G- N' E+ U
! |7 g8 H4 r: k
                /* Src in constant mode Dest in INCR modes */
/ z' k5 s) X) J- k$ N                paramSet.opt &= 0xFFFFFFFDu;
' x  Q; v% ?/ n0 d& F* l                //paramSet.opt &= 0xFFFFFFFCu;. v2 x( C, ?" R# U  [" v# c
               
" t9 p* P7 r8 K1 ]                /* Program the TCC */
" L! u* w" H- s7 Q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ D$ E1 r- u/ `5 [
% L5 z. Q8 Y- N0 v
                /* Enable Intermediate & Final transfer completion interrupt */
& A& U* M- L# v3 _5 v                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ D* c6 w6 r$ u. t& D+ o4 _
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 i. L. @0 D- m* ]
" w* H. N6 I' K5 Y  N/ v6 Q0 E                /* AB Sync Transfer Mode */4 V. A* ^$ ?  q: C
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* C5 a' b0 e. G$ Q7 G
               
/ `1 N( Q/ ]8 ^  [6 g8 F/ r                /* Program the source and dest addresses for master DMA channel */" C% s) F" i2 x. a" D$ U
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( i3 W  y, T  t: R; M. v) W
                paramSet.destAddr   = (uint32_t)(ping_buffer);
. C& e# [* r  [  q( g: U  l
6 U8 z7 r$ _9 f1 H                /* Write to the master DMA channel first. */! j; l7 H% e" |- X" _! P5 e8 f
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 R& s. S. g# b* q
    }      
* u7 r" v; o5 _
3 S5 D% G7 D& V2 i/ F2 U        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 r1 H' x! {1 m/ e
       
/ W9 u, U7 N: t# b4 h6 Z) ^    if(result == EDMA3_DRV_SOK) 2 X/ T3 a+ {. J* [/ K, N! a' e
    {/ O, Z. @2 t% h2 h9 c$ N
            print2arm("edma3 driver init success.",0);) g5 G) ~$ X" {/ a0 a3 _" t
    }
8 v/ o3 C( ]# b8 I}, h% F% x/ c$ n% ?- U0 {9 T
; U, ^5 w9 c  A/ z0 v; g; z
# h+ t. I8 {1 T% Y# L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; d- \( R$ V% O( J
# o1 H6 e: S, W; c2 \
: t, w) ^# w7 a+ N( j, n8 O8 c3 W# u
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; Y" i$ `7 U0 f& I- I每次DMA传输完成后都要再次使能传输

. {! f( W# \% b: z3 l  y原来是这样,我明天去试试,谢谢了!




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