嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! d9 g" t+ C; q$ x
#define  PING_PONG_ACNT          1* _0 s2 G: I* l9 q0 O! z
#define  PING_PONG_BCNT          8*32*40 ' ?. h+ j0 n  Q8 J- W, D% r, X6 E6 y
//#define  PING_PONG_BCNT       1
! A) l) S6 b* i3 E! k3 [5 D8 y#define  PING_PONG_CCNT          1
% l; ?! Z9 a) ~! C7 |# v#define  MCASP_BASEADDR          0x01D00000* ~/ u, v. [6 c% O
#define  Mcasp_RXEVENTQUE        (0u)
2 `! g/ q& d; C, K. K
' t0 m8 h( ^( r* z/* OPT Field specific defines */. f: w) W6 H" _, c) g$ V
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. o  z( m$ Q2 n+ t) s#define OPT_TCC_MASK                        (0x0003F000u)
1 B# i% N: i' }1 u#define OPT_TCC_SHIFT                       (0x0000000Cu)$ ~- I1 ^& ]( x1 ?" i
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 a/ u3 k& f, O5 X3 t
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 s( B3 N. U1 ^! ^

, w# {. G3 o( P$ E, z; s/ S; B+ Tchar ping_buffer[PING_PONG_BCNT];
) V1 S. s* ^5 K! Y. P( i: w2 Y' Qchar pong_buffer[PING_PONG_BCNT];6 E0 W# Q; F  x

" k% `* }: v. e0 ^, I' z8 v4 G6 V9 B# \3 W( A
6 G: Y8 v* d& n# N+ k: |1 m

. |( w8 V* x/ j; @static void ys_edma3_init()4 T- c. ^" U8 ]/ j0 K8 ]
{
# t, w1 e( ]* A) G2 r0 l, T8 @        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 |) ~0 Y6 K/ \# ~0 }
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( R6 j6 Y- N* ~' M8 i) p4 Y' y+ P        EDMA3_DRV_Handle hEdma;
0 V+ Q; y! y( z- |8 Q    uint32_t chId   = 0;1 Q" H) G% w6 }# e. H0 I+ X+ y
    uint32_t tcc    = 0;
% X% V0 _4 i/ \* N
/ A4 U/ G9 Y5 U0 O: ]" d    print2arm("edma3 driver init...",0);
. t3 I# n% H. M# \0 y5 Q: {. `; Z
/ q4 _0 U- F5 j& X        hEdma = edma3init(0,&result);
; |2 j. ^; j: H0 b+ b; P! I$ q        if(hEdma)
: P+ d8 Y4 D) z8 v# @        {: |; h9 M& J, K3 V3 X
                print2arm("edma3init() Passed.",0);1 d3 y/ X1 w! [/ V2 C1 x
        }1 J( ~' z+ m3 x
        else! j( w. n4 ]( v" a
        {
1 |. G+ H$ [- E                print2arm("edma3init() Failed.",0);
8 z' o7 r% O5 `' C6 d3 B5 k        }  L' x% |8 Q9 H, J# }
       
. ~5 v! d$ t, j. f) {        if (result == EDMA3_DRV_SOK)
+ Q8 g' |5 H+ p! j& O* @: A    {, C' s% a1 G! K: b3 M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) W* C% }) N7 H+ _" D! N                                                       (EDMA3_RM_EventQueue)0,
6 w* r' Q8 ~5 G! L) ^                                                            &edma3_isr, NULL);0 ^8 R7 C: @& p9 A& D5 l* h
    }
$ E8 @7 f' m# Q        4 ~9 P" `* e1 k; J3 u
        if(result == EDMA3_DRV_SOK)
8 n' A- n" X3 f/ S( c        {
, ?2 C- n3 k7 L5 ~. I                paramSet.srcBIdx    = 0;
. z# T) }  S0 ^                paramSet.destBIdx   = 1;/ N* L& _& H8 u/ p
                paramSet.srcCIdx    = 0;
7 ^% \2 y9 F: H# h8 _+ m                paramSet.destCIdx   = 0;5 q6 A( `# G2 [. ]; K' u; i
                paramSet.aCnt       = PING_PONG_ACNT;
  B9 g9 a" [6 [2 b- X. G, N+ p                paramSet.bCnt       = PING_PONG_BCNT;1 W. z) b6 [. {& }8 u  Y% z
                paramSet.cCnt       = PING_PONG_CCNT;
! q* Q7 K8 e  }# R                6 r7 j" ]5 }) E' W* A: g9 z
                /* For AB-synchronized transfers, BCNTRLD is not used. */9 \6 t: G$ A; \. s! R- j; J
                paramSet.bCntReload = PING_PONG_BCNT;: e) o' F3 [8 X

) |" P7 l+ B; R                /* Src in constant mode Dest in INCR modes */  A) @, ?& L" {7 \5 r+ K/ }$ K9 c5 i
                paramSet.opt &= 0xFFFFFFFDu;7 b; Y) ~7 R) Y: q5 Q0 V. @
                //paramSet.opt &= 0xFFFFFFFCu;
+ x) }, l8 B5 j0 ]" o' V$ n                8 G9 m* }" r; \, s+ Z* k' B
                /* Program the TCC */
1 m% }! Q, O3 j$ L                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 m' H3 E% {1 x! d% v
. Q, L& m: z3 y* K  V# J
                /* Enable Intermediate & Final transfer completion interrupt */
& }! I1 B# o5 Q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);5 T0 r2 A: r: Q! t* c$ }
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: z$ D+ N3 ^( ]% x. u
0 U; |. n5 ], h7 ?. b/ W2 J$ H                /* AB Sync Transfer Mode */
$ k5 f+ l) L% S* x" B0 |; k5 K4 F                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 @0 u& H1 a5 \% R! X% U               
  |5 v0 ?  {# D/ G2 @# I# L) P' F! c                /* Program the source and dest addresses for master DMA channel */% y; d- S$ H+ ]- s
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- c) ~6 t. x) T" W8 e
                paramSet.destAddr   = (uint32_t)(ping_buffer);3 [5 c) T$ ^+ K) u6 K4 z0 A% @+ }; c

, ~4 |  x/ f; J* z+ t$ V- K                /* Write to the master DMA channel first. */
# L1 _$ E! ?" W                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);' U. F$ n5 @+ [5 F
    }      
: [+ a3 p0 \  w# [) k& r# e) @1 ?$ C
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! U* t# W  t8 k! z3 ^/ P0 l+ p
       
- Z6 z. L; `' g2 |3 x    if(result == EDMA3_DRV_SOK) ! a9 P2 t8 k8 n+ y' I! e
    {
' P  y1 t" F3 L) y& F            print2arm("edma3 driver init success.",0);0 z1 @9 k9 l2 Q7 S3 T
    }
( o0 d4 B) d9 W& a+ h( C5 A}' ^! \( n# ?" e/ l" x5 k3 \

, _$ N$ ~2 g, D1 O
5 l  T* X* i, Q" W2 Z' W$ n! q" I6 XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# g- |8 n' y4 |

/ N" X- \% ^$ \% d# g7 Y* t! A5 Y% g* T

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* }, o* h% z- C  U
每次DMA传输完成后都要再次使能传输

. _$ A4 R; t8 j! z1 I9 |3 j( i原来是这样,我明天去试试,谢谢了!




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