嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 g! D6 N  d' T; L  E  U- f' I; c#define  PING_PONG_ACNT          1
! c5 F8 a2 A  d/ X# M#define  PING_PONG_BCNT          8*32*40 . v6 |2 t% K- I
//#define  PING_PONG_BCNT       1 4 ?- \' j. r! N7 z) c6 [# v
#define  PING_PONG_CCNT          1
- C7 ^8 @0 v+ O#define  MCASP_BASEADDR          0x01D00000
4 v) f# B8 K! e0 P: X" H#define  Mcasp_RXEVENTQUE        (0u)
' K' n, s% K; H7 n! ]( T5 R6 h$ k7 a4 V1 }, M
/* OPT Field specific defines */9 k5 c6 d: {& F: \- }; i5 t
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
: U5 p' {  y2 ~2 T#define OPT_TCC_MASK                        (0x0003F000u)% B+ ^- p$ k' }# g7 r! s
#define OPT_TCC_SHIFT                       (0x0000000Cu)
- A1 I0 r" Z% G+ U+ R6 q#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 v2 T* ?  K3 S7 Q; e
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ q% J0 ?9 [9 k2 t8 }3 d2 E/ `$ Z( S0 ]- Z: r& C" p% @& [
char ping_buffer[PING_PONG_BCNT];* M3 N+ y; w& K
char pong_buffer[PING_PONG_BCNT];
' P; }: D, Z* Y  w+ p9 m: W
/ b- q7 |6 \/ H; r- T: q( y
* p3 ~3 {) C! n0 X. n  q$ O0 _) A
$ X5 d1 `* D2 t  _% Q$ q7 l3 e) _8 n( j6 U0 W, V, ~. {
static void ys_edma3_init()  z+ p- q+ N" L9 A
{
1 w; q: L$ g3 ?0 u2 ~" H; a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( O2 G7 w1 {7 |% C' f: T% R! I
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;& u( V" y: r: Y8 F/ b8 C& s7 {
        EDMA3_DRV_Handle hEdma;; E6 i# w2 [! e) Y# y1 s* @
    uint32_t chId   = 0;$ b: O  Z! x& x* P
    uint32_t tcc    = 0;5 _& ?5 c. r( B: ?# m- {9 c* y( o( ^

0 o# D) `4 r5 P    print2arm("edma3 driver init...",0);
6 I6 q2 r, r0 L; x0 W$ s8 M5 t9 b# g
        hEdma = edma3init(0,&result);" C3 z( B5 J' O# d% j
        if(hEdma)8 ]4 g# h5 p, X: d. R8 w
        {
% y5 u$ A  p! J" ^                print2arm("edma3init() Passed.",0);3 ]/ Q$ _# r  Y8 b+ W# o# h
        }
8 |: y5 s* u% f* A        else( J" v# y2 b' E" _& q
        {* o% \7 Q9 P; `9 a8 B$ G6 P4 R
                print2arm("edma3init() Failed.",0);# c7 V- [' k# W' b+ Y
        }8 G$ m+ B/ R' R: H4 S- G8 r
       
& A- k7 M: z& J; m  d        if (result == EDMA3_DRV_SOK)' S6 I! D, H% ?+ c% g) r, {
    {3 k) @* x; s* y2 r
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, |3 T4 e- R0 I! G5 `                                                       (EDMA3_RM_EventQueue)0,
' Z! H6 }$ H% |# }& M) C                                                            &edma3_isr, NULL);! H* y- }: {! n1 t5 m  r+ R9 Q9 [
    }
. ]) }8 V% H7 Y' [" F4 T        # a* O. B  m5 r/ c) B
        if(result == EDMA3_DRV_SOK)* o9 |, o3 `) _9 y& Y  S
        {: v) q2 B% t3 k4 e7 H. o& e
                paramSet.srcBIdx    = 0;* g8 N& B6 A; S9 e$ Y
                paramSet.destBIdx   = 1;# g$ }! J( M* h% K
                paramSet.srcCIdx    = 0;% n% O3 f% [; ^* R8 h& J* P  B5 K
                paramSet.destCIdx   = 0;
- r$ }2 V) d' S, b: V$ L% b                paramSet.aCnt       = PING_PONG_ACNT;( o7 H' Z) A& f4 [2 o4 @
                paramSet.bCnt       = PING_PONG_BCNT;, J9 J6 g% ?) J
                paramSet.cCnt       = PING_PONG_CCNT;9 n8 Q4 s& k. K! s; \, g
               
! e3 I/ ~  Q2 u. ]6 m/ E& ?' Y                /* For AB-synchronized transfers, BCNTRLD is not used. */
% t8 s0 ?: O" @+ z5 P$ ?0 t                paramSet.bCntReload = PING_PONG_BCNT;: c4 G( m* j" U" w5 I2 L7 n
' j6 n3 x. s, ^+ e
                /* Src in constant mode Dest in INCR modes */
0 k  H$ L( V! O% p                paramSet.opt &= 0xFFFFFFFDu;. P7 r* a6 w2 x: l5 d7 C
                //paramSet.opt &= 0xFFFFFFFCu;
: ~6 D& T# g) [% T: Z6 F, C7 v                5 v) _% ]$ c6 E$ ]7 V
                /* Program the TCC */
& C! f& E" \7 @; s                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 g5 R! m9 u- K2 |' N) E1 N/ d7 }

, w) A( Z  x2 V& |                /* Enable Intermediate & Final transfer completion interrupt */  K& H+ X9 H! T- ~# u4 v
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' A/ {3 `7 a) v8 F& O                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* E6 Z- I5 ?8 M+ E: S  r6 H' Y5 P- u0 U7 q- _: g* R; d. m
                /* AB Sync Transfer Mode */1 h- _, [  z& {* I, t6 ?0 ^  }" ]
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 w! P+ Z* w7 f4 Y" h* [
                8 O, z: u6 K. z( g0 Q
                /* Program the source and dest addresses for master DMA channel */+ O/ r# v+ u  m0 X  B2 ]
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ c0 _2 j  N: u- z
                paramSet.destAddr   = (uint32_t)(ping_buffer);7 V& r$ e# p+ k3 T8 e

1 d8 g9 w% X2 r                /* Write to the master DMA channel first. */
& ^7 g: Y( t0 B/ _                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
* _* ?( ]7 [- O7 {6 s: M    }       $ I- L! T. u1 k% x+ H: Q7 }

! D% r) m. V  ^2 D: ~& p        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 ]' j' y9 X  O& z. w
        6 p  A2 L" {, F+ u- S2 C. j" h
    if(result == EDMA3_DRV_SOK) ; K" Z8 \$ C  \: c' Y4 |% Z4 t
    {: N+ w4 U' J4 r( T, D
            print2arm("edma3 driver init success.",0);) L/ j* K# M' b3 x4 ?4 t9 k
    }
) D! S; r4 R4 i; d}
! v6 T& ~6 n( ^* g
9 J' W" K' K% H- L( F) M, w( U( r2 T( c; O& E: U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 o- I; B6 b! R. ^2 j/ x
9 s% ~& d: O! ?" I' N) Q; q
! h  F* {& e! h8 X8 \- u" p0 U: z

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:474 m& x3 ^: a; a+ `  k( J+ z$ S5 J
每次DMA传输完成后都要再次使能传输
3 B5 N/ o8 P+ j9 v" D/ |+ R
原来是这样,我明天去试试,谢谢了!




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