嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ @& c0 m. I1 j. O5 Q#define  PING_PONG_ACNT          1
! x, d; r; P* _; k  s# z#define  PING_PONG_BCNT          8*32*40
: ], q4 X) @5 O- |1 H//#define  PING_PONG_BCNT       1 # z3 }; V+ q1 ]; p
#define  PING_PONG_CCNT          1, v7 V- x! o2 M( M
#define  MCASP_BASEADDR          0x01D00000
6 y/ E9 i, @4 h/ y" h) N! X( }#define  Mcasp_RXEVENTQUE        (0u)5 _  d9 @8 J5 ^. a
( Z6 x7 ?  m: {8 u; @- ~. y
/* OPT Field specific defines */5 z3 y, p6 k5 j7 i: ]
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* w  g4 R$ a+ J7 ~3 E
#define OPT_TCC_MASK                        (0x0003F000u)
& |- n: \# I# \. o  t1 F& H* w#define OPT_TCC_SHIFT                       (0x0000000Cu)5 k9 Z/ s7 Y& C. i5 T) l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u): v+ j, E9 G" d
#define OPT_TCINTEN_SHIFT                   (0x00000014u), \" ]  ]6 Z! x5 N- j/ o7 G

2 H. z. f* I/ m3 Pchar ping_buffer[PING_PONG_BCNT];
: R; {" s6 w  ?char pong_buffer[PING_PONG_BCNT];
2 g9 m5 J; k* e# V6 d. l* z. U0 r0 X
: @; q9 v7 ~, u4 o. a; e

) k! O# p4 G: ]5 p% Q2 ^% D# r  a4 _& y1 X7 _
static void ys_edma3_init()
) N  ?( n# m( C{
. M0 a1 n" b  ^4 o7 a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ U# F0 `4 M1 R8 [/ h
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& e- |% j- M+ {. T        EDMA3_DRV_Handle hEdma;8 T& ~, \* s' [2 j; L0 o
    uint32_t chId   = 0;# S1 n0 I! v6 B/ m+ V, N- a
    uint32_t tcc    = 0;6 h! J6 J8 P* U6 `9 N
* d) M! `" q& S* z" l" J# D/ }
    print2arm("edma3 driver init...",0);: g6 u) \+ c0 W& }1 f0 k

* y+ s) v8 |' E" T( q. m        hEdma = edma3init(0,&result);1 i; E# I  F+ z9 @
        if(hEdma)
2 p0 F: b% `& y" |9 P9 J9 r3 R        {
* \9 k+ G8 D" {2 ?: _$ w1 x; y                print2arm("edma3init() Passed.",0);
2 e' Y" g. C9 ]2 ]" a$ g: B# ^: x        }, j: ?2 [9 T$ m3 k( U6 d
        else
% A+ o; x' n+ l+ P; C# U% b, m* i        {0 L# V" i2 h, H+ P; r- }4 f
                print2arm("edma3init() Failed.",0);! \7 N* j$ @: o. B, v( v$ }
        }" F+ ?. S  z) x" m: Q0 f
       
. N; {" s3 J" q/ a) b  `* `        if (result == EDMA3_DRV_SOK)
4 f& J5 `6 o8 j9 k7 i    {
8 {% e- e' g# ?* `0 i7 `- h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 V: X7 p& R- T8 Z: s3 R) V9 G" {+ V
                                                       (EDMA3_RM_EventQueue)0,
, P" U1 v0 l7 ]2 A  @                                                            &edma3_isr, NULL);; u7 ~' ~/ Q. h! r
    }
  a: F$ M3 s, M* G. E        ; _+ W5 V+ P, P, `
        if(result == EDMA3_DRV_SOK)
0 H  h1 n! N$ c) B( t        {& f- d) W2 l( I. ~9 P, }) S6 s$ E
                paramSet.srcBIdx    = 0;* w8 a: A, C$ b5 F% T, J
                paramSet.destBIdx   = 1;
/ J& ?. i$ G5 l) C3 c, c) E                paramSet.srcCIdx    = 0;
. z5 b7 X9 M  @! ^2 o  Q: ^                paramSet.destCIdx   = 0;
& q) x5 v- }2 I" r$ _8 l                paramSet.aCnt       = PING_PONG_ACNT;: V: F# k* \4 V  y
                paramSet.bCnt       = PING_PONG_BCNT;
% c/ c+ F5 L' l6 i                paramSet.cCnt       = PING_PONG_CCNT;1 M7 u" C) f; D2 C. L
               
8 e( l: |; w% w! u5 _                /* For AB-synchronized transfers, BCNTRLD is not used. */! i# @- w$ L' F6 g7 [1 s/ b
                paramSet.bCntReload = PING_PONG_BCNT;4 S& s' Y- _, ~# G8 s

: V5 ]7 u2 v& C                /* Src in constant mode Dest in INCR modes */
6 A  X% s+ Q( n* ^& i( _                paramSet.opt &= 0xFFFFFFFDu;* Z/ G: ?0 S0 H: ~+ t
                //paramSet.opt &= 0xFFFFFFFCu;5 }7 }* @6 G. `( m6 N/ U5 P- f5 S2 J
               
, k4 _3 X: I# g# S9 |# [+ |. c                /* Program the TCC */
0 x# G2 e. X# F1 d" P                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 `. G# {" C! D# j/ o$ b

3 J3 ]/ g1 U( [4 N) I                /* Enable Intermediate & Final transfer completion interrupt */
( K1 i' f" S7 h1 q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 T& R" y# |( V. V7 |- ~                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) ^: }4 e# W9 ^0 a- O; e

& [, ]. q, t" y+ l1 G                /* AB Sync Transfer Mode */8 J& S! _0 p( ]$ I4 W
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 K) L( W" g3 T% k% `7 h, q- v                6 k! h  _/ m+ O3 L
                /* Program the source and dest addresses for master DMA channel */3 k: I" J' N8 l; u
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 R5 S& t8 E. z2 k2 ^                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ _( l! K: N8 |. F( A" W( g6 G  ^5 h
                /* Write to the master DMA channel first. */' _3 b; t; @8 Q( c( P# v
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ X. e4 f" b( P3 S6 }    }      
7 g4 t5 H2 J( E1 k, t7 v! T$ I% j% G" n5 w! `1 y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ z9 L% E" q/ @  n  M6 `0 p       
* y, ]8 c% Q# b! O4 G    if(result == EDMA3_DRV_SOK) ( I0 p8 \. Y6 i. E
    {
$ j# y+ O4 e0 x! ~0 o. t            print2arm("edma3 driver init success.",0);  N/ N; F- r  n
    } & G4 t, B- H3 G( P0 d8 ~1 b
}4 m* y% i9 D# g4 r5 F6 a

1 v- [: Q0 x# P7 ^! F( j8 U- p5 Y. `% r# _% n& R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 m! E+ ?2 Q: M) M* a
8 C1 e% j7 D% h) G) w6 a- P
, [* u9 d' c3 t0 E; c" k
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 [- }9 f8 u- Y3 Z/ K7 i$ M$ D7 B. `每次DMA传输完成后都要再次使能传输

( e3 n. f. e, c( S) O4 r原来是这样,我明天去试试,谢谢了!




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