嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 V/ W8 c: b" c$ }
#define  PING_PONG_ACNT          1+ Q5 j( `9 D; ~  T3 ?
#define  PING_PONG_BCNT          8*32*40
' Q! p( ]! l6 @7 F( ~; P//#define  PING_PONG_BCNT       1 9 Y6 D5 X; u2 R* j" A
#define  PING_PONG_CCNT          1
) ~* z9 t. ]( d" `#define  MCASP_BASEADDR          0x01D000003 `# ?; u- E6 a
#define  Mcasp_RXEVENTQUE        (0u)
% o) f  `9 r# H' v( s: F+ {! B0 `1 J5 s6 y, e2 _; P5 s& V* Q
/* OPT Field specific defines */' K% e5 o: q& v$ ]
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 a7 v# K" [: t0 ?2 J" D" O#define OPT_TCC_MASK                        (0x0003F000u)
2 T7 `9 M/ f: e( i#define OPT_TCC_SHIFT                       (0x0000000Cu)
" X2 k* l3 T. |2 w. @  _#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; i" B% Y; [5 ^: t0 N# P1 w+ ?5 @#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 W$ H/ m- B# r9 L  M8 E
6 Z$ L# s" f; h0 i; A  b0 Xchar ping_buffer[PING_PONG_BCNT];
$ p4 |0 J5 k# B' I. Echar pong_buffer[PING_PONG_BCNT];
. j$ b: y+ p* x- h
& h1 c/ {6 R. c
* I$ a5 {( s) h" S
5 R7 E1 r$ f- ~, L- j; W
6 C  |; Z9 a; c$ V. Z  \& n9 Lstatic void ys_edma3_init(), P  l$ P7 _& R- \
{
3 q- ?$ B- k& w# Y! S0 r        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' H( F4 C7 w8 V% Y& z: ~        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  J4 ]$ n/ `$ L6 z        EDMA3_DRV_Handle hEdma;
8 R( ]3 [& G' c7 C8 W  T% i    uint32_t chId   = 0;
# C: A8 X8 E- C  h, ?- j* R( G    uint32_t tcc    = 0;: ?8 B- V* q( X. x8 i! Z. K1 v: y
3 S5 x' m$ _' O7 y7 ?  H
    print2arm("edma3 driver init...",0);0 Y4 h+ f" \, U' j8 _/ I# d

0 O% R( J0 D+ D; K& s! _2 D        hEdma = edma3init(0,&result);
, T6 J3 c' p+ z8 W        if(hEdma)
* e2 S' l# |2 @- H; n/ J( e4 |- b+ [        {
- Z) Z1 F& [, @$ M                print2arm("edma3init() Passed.",0);
* B; G6 A' o% A" ~- G- y3 s        }
' b1 P" T% i) ~! B2 [        else+ X  D; R, K) J# s
        {2 b# {3 ~: z# y0 @7 H, O0 U
                print2arm("edma3init() Failed.",0);
2 i0 j0 M8 M+ c6 f4 |/ m8 b% [0 S        }
! K( m5 o. S) n       
; h/ R. E; Q' h& B        if (result == EDMA3_DRV_SOK)6 W4 C8 O2 b) ]& W0 ]
    {
8 z! V5 O, z3 L+ T" Q( O2 `                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  }2 i, M4 ]  s* {* O2 z0 I/ ]
                                                       (EDMA3_RM_EventQueue)0,0 y& k* d4 f' N2 _& w3 C
                                                            &edma3_isr, NULL);9 s4 Z3 A( v8 O+ p! s8 o
    }
1 `9 N0 Y: H7 ^7 ?4 W        ; s9 a: c& s5 ]& Y9 l7 h) U' S
        if(result == EDMA3_DRV_SOK)
: e* A" d6 B  o, ^6 `        {8 q* j# b, T) Y" G; P! F3 J
                paramSet.srcBIdx    = 0;
* y" w! M+ s4 F/ `; F                paramSet.destBIdx   = 1;  S% H& V) L6 x% v5 c" d4 C
                paramSet.srcCIdx    = 0;) ]8 A# L2 F% Q
                paramSet.destCIdx   = 0;8 J9 L& p7 B) X0 F0 A5 v" _
                paramSet.aCnt       = PING_PONG_ACNT;9 q! c! @2 W  h* k; `
                paramSet.bCnt       = PING_PONG_BCNT;
) {* u: i& j/ }7 q6 n                paramSet.cCnt       = PING_PONG_CCNT;
$ I: k1 i) {* a# E                9 c& U% e4 k, n0 K8 h4 X) I
                /* For AB-synchronized transfers, BCNTRLD is not used. */
7 G. J; K) E! ?- y. S* K0 X  S                paramSet.bCntReload = PING_PONG_BCNT;+ v: M6 d9 ]/ s  [3 Z8 I; r
+ }: K+ I  Y& w1 b
                /* Src in constant mode Dest in INCR modes */% v& g9 ~. t; `0 \8 r2 I' \; T8 G
                paramSet.opt &= 0xFFFFFFFDu;
! F) p' Q8 `: M9 ?: q                //paramSet.opt &= 0xFFFFFFFCu;# M/ [# I7 d$ `5 J
               
0 @% G' _" D) ], q3 X5 B( d5 E                /* Program the TCC */
+ y5 c. T$ o: J2 K" E) \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; [- N& b2 \* m  e5 {: m1 `
% ]9 f  ~. O/ u# i1 t/ O7 y
                /* Enable Intermediate & Final transfer completion interrupt */
5 {& {' A6 X# F( [2 L6 U5 \                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ \' L/ }2 r6 `- k3 m                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- ^: d, d" F- W5 v$ `+ g6 `; F% B9 m7 a& D
                /* AB Sync Transfer Mode */
0 ~$ a* d7 {' o8 G, P4 ^                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. X. K( P2 z( p                5 s3 g8 V0 y. w* d
                /* Program the source and dest addresses for master DMA channel */! c' b$ K8 _% e8 I4 K
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
% g; ^7 k) D, x0 x                paramSet.destAddr   = (uint32_t)(ping_buffer);* r% o  b: l% X) E" I- D
3 q, Q% n6 z6 o- |8 T0 w6 a
                /* Write to the master DMA channel first. */# ]5 M" @0 O: G. s  g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
6 i6 L1 L' ~' A    }      
4 m. E* q2 ^, _7 J- u
$ s7 J" f& a5 r4 K  n        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ @0 ]0 J6 n" I+ Y
        ( r) S/ z& {) W0 h0 l, B4 l
    if(result == EDMA3_DRV_SOK) , t/ `. m8 S5 ]
    {2 L: B$ Y+ W% Z9 f+ Y. q, O
            print2arm("edma3 driver init success.",0);
/ a( T$ d! \7 A3 D* m7 p3 R* w8 E/ k    } " y. p! @; p( x
}) e# z+ O( i) ~0 }9 f, l% T7 H
7 E0 d4 W9 n+ m, U/ B1 m
" o0 G4 \" ~/ h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 M7 C4 }& u  X$ U) S  n2 }" C( U9 ~) O( o# `% e% q6 G9 h

* e( g. M& m; d( p
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47/ i: K; |- p9 w8 S
每次DMA传输完成后都要再次使能传输
- H- B9 t4 P" n' Z5 O. A$ U
原来是这样,我明天去试试,谢谢了!




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