嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) C- ^- g% b; w: Y- a7 E6 h* {#define  PING_PONG_ACNT          10 B5 W: i- B! ^, j
#define  PING_PONG_BCNT          8*32*40
" Y9 H" Y. e! T% K//#define  PING_PONG_BCNT       1
9 @5 i# ]2 V- ^: k1 J2 C#define  PING_PONG_CCNT          1# a7 x; k0 b" q7 R( O+ `
#define  MCASP_BASEADDR          0x01D00000( W  V2 f" B) f/ ]5 u- h
#define  Mcasp_RXEVENTQUE        (0u)
8 }# k4 u8 F( o) X7 D; A
: m) B9 W9 `5 V& |3 I/* OPT Field specific defines */& N+ D* ]' i5 q/ J
#define OPT_SYNCDIM_SHIFT                   (0x00000002u). f4 C7 s# C  J9 |* a" `6 ]& G
#define OPT_TCC_MASK                        (0x0003F000u)
% X/ e; \1 y& j5 p* g4 f5 H/ `#define OPT_TCC_SHIFT                       (0x0000000Cu); ?' P2 F6 c: G
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; s; P- T3 ?; A3 l* z0 z$ b8 `; C#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% M! L2 E0 n% H: K/ d" L5 W! r0 e
char ping_buffer[PING_PONG_BCNT];6 t4 w( X9 |/ s( s0 q3 X
char pong_buffer[PING_PONG_BCNT];  |! P& h& I2 n; \( A, E6 l5 e. K8 g8 y& z

: w9 z3 X# o- P2 f8 y
# f" d4 u, N9 X9 g0 M/ T# o2 w5 X( s: [
7 S+ |. _: w6 V* v
static void ys_edma3_init()5 t3 O, S& @7 T- E/ m9 V. Z
{4 ]5 D8 y6 _! a1 _" `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 I# ~1 H4 _! A6 K( k4 e2 h
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 S0 h$ `$ E2 O  o7 w        EDMA3_DRV_Handle hEdma;  B/ D$ j4 A% i1 w* H* ]
    uint32_t chId   = 0;  S1 L4 }1 Z) V; w& F8 @; ~
    uint32_t tcc    = 0;
% {& F- _3 ^: T2 o" @+ Q
$ H+ ~; d2 [( w0 k& Y& n3 U* p    print2arm("edma3 driver init...",0);
: E% l# S- L- s- ~
# D/ J9 c/ j' G+ U6 c$ e        hEdma = edma3init(0,&result);
  e' m# i& J: l3 {$ N        if(hEdma)
2 f5 J5 ~) I; U, D3 _        {3 @* T, Q. Z! u0 k5 w, T
                print2arm("edma3init() Passed.",0);
+ G" C# V, W6 ~: X! D, D$ n        }" ^6 n# Y  i" [1 t. z' ^0 {+ i* Q
        else7 s/ P2 E& ^9 E; C
        {# v0 N+ C  M; ~
                print2arm("edma3init() Failed.",0);
+ H5 L9 `' }/ t) a7 f0 b        }1 ^* z9 t; d0 i2 l3 _
       
) O3 i4 z# `) S! O) G& W: U& x        if (result == EDMA3_DRV_SOK)
# O: \* X) ]; s+ D! c( P) x9 B    {
: I2 D  H3 ]: M" m9 m2 m5 h6 g( [. \                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ Y8 m( G0 ]" N                                                       (EDMA3_RM_EventQueue)0,9 R+ \0 o+ W4 }7 z9 h
                                                            &edma3_isr, NULL);
& [* l0 M% S' t    }5 R3 @. i5 e6 [4 @4 t3 x9 H
       
" E# f) u5 ]" {1 c        if(result == EDMA3_DRV_SOK)1 Q8 F& Y0 y" y* l0 _0 Y
        {
+ c9 w3 U% j9 a; J2 k3 I4 A                paramSet.srcBIdx    = 0;% i! T. I$ r% J+ i) Y- d
                paramSet.destBIdx   = 1;
  Z, x1 y7 v; C; X1 `                paramSet.srcCIdx    = 0;
' j' z5 I8 c' M, l8 H1 c. V                paramSet.destCIdx   = 0;
- g% z/ D' q6 O8 ~1 R                paramSet.aCnt       = PING_PONG_ACNT;
% Z% A4 H7 I+ e' @2 c& T3 n                paramSet.bCnt       = PING_PONG_BCNT;
' ?" F4 P& H( w3 [& ?: J; h                paramSet.cCnt       = PING_PONG_CCNT;: Z9 S7 l$ o' k" G* S
                * f. X' r% W2 m4 C0 v( u
                /* For AB-synchronized transfers, BCNTRLD is not used. *// |& P1 r$ B6 X
                paramSet.bCntReload = PING_PONG_BCNT;4 T8 D/ W1 H9 Y: A. _; z
3 W& _4 s' P9 o( t, E8 k. u: q
                /* Src in constant mode Dest in INCR modes */2 P5 O. J4 i; G$ u
                paramSet.opt &= 0xFFFFFFFDu;
" _0 U6 N, ~, P, D4 Z! B, j                //paramSet.opt &= 0xFFFFFFFCu;2 n, B. [9 x, |, M$ P0 W6 h% d) |$ f
                : |) ^1 O( x- C6 c3 m) g: q
                /* Program the TCC */* C! L# [) [2 f) X
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 Q/ G9 f- ^% c+ i: h6 O1 [

- e" R$ K- l7 U! Q' B& H                /* Enable Intermediate & Final transfer completion interrupt */5 h3 A! C0 p6 R0 B2 w, |/ R8 u" |# P
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* C( p$ G) j# r7 S                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 F; y7 {+ f( w. a; i  Y, G4 o- X  \$ p; J, y. k1 k
                /* AB Sync Transfer Mode */
+ M0 V4 i) K" T$ Z& y% X5 V8 s" t                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# n# ]% K2 n) Z$ q               
( M4 }! e2 n9 ~! x8 Z                /* Program the source and dest addresses for master DMA channel */+ f; Y# A3 |9 K( x
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
- A& r; i! c; C$ L" j( ?+ D. }                paramSet.destAddr   = (uint32_t)(ping_buffer);
7 s/ s' X9 B: {* O" {) Q% k. M
3 I, Y7 }- d1 X3 r                /* Write to the master DMA channel first. */7 `. ^! h7 W2 ]( `  b9 k- _
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! Y% V2 x* E+ S0 h: P
    }       7 R- e$ v4 L2 v8 c2 s! t

! Q* h3 b+ K/ f3 Y        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 p: @5 f1 {" B  D  ^+ w2 H
          ~' h' R( O4 X7 A* N
    if(result == EDMA3_DRV_SOK)
: e; U, M3 M$ N+ n; y3 u+ t% t    {
2 }+ j- Q; G6 _( V9 K7 L; A            print2arm("edma3 driver init success.",0);
" a& @/ p7 I8 L    }
5 `8 A) L4 b" I$ G; b}7 A8 U! \, g" Z: E7 w
5 j: B  f5 q# C) M, O* i# N
' B( ~+ g& o( D
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 |! J6 g$ n7 i0 {
& E2 T' o5 e) Z
$ r, O7 x  \* I! Q2 y

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" r5 p1 X; k6 v+ Y$ r- \6 f
每次DMA传输完成后都要再次使能传输

& W. e+ d" _. n4 C原来是这样,我明天去试试,谢谢了!




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