嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 y  x' h1 o2 l; T- x#define  PING_PONG_ACNT          11 M/ y! e! ^- ~1 ^5 w& S, X0 `' E
#define  PING_PONG_BCNT          8*32*40
2 u  V* m' J2 t; m//#define  PING_PONG_BCNT       1
; t; W% G' ?' Q, g, \8 K7 r; E#define  PING_PONG_CCNT          1
  K1 y) J( x7 S) C#define  MCASP_BASEADDR          0x01D00000! c; a* ~2 K+ t7 {' |( t8 g
#define  Mcasp_RXEVENTQUE        (0u)
: F2 h& x3 v, ^3 v# o9 l/ b8 D9 P; v8 K7 N0 C$ W! a
/* OPT Field specific defines */
) `+ R! l0 D+ e4 B#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, x4 L/ t$ o1 w#define OPT_TCC_MASK                        (0x0003F000u)
) X* B' D6 i5 d- [+ g, j0 d#define OPT_TCC_SHIFT                       (0x0000000Cu)* q6 Z; \3 Q! {/ ?  W  D
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 N+ b! D5 B8 W. r! r/ a
#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 }2 j9 m! C4 A' Q

* x- u$ s6 R, j7 Ichar ping_buffer[PING_PONG_BCNT];" s; f8 p$ V" `- {' j, ~, z
char pong_buffer[PING_PONG_BCNT];
% T2 F8 {; R5 e  E% b; I6 {1 v6 c
% w* {* K* P' ?  Q3 U  L, g9 G. d/ J; V
6 L  c1 x! n: t7 g' z; M

3 V' t. V& i! a. ystatic void ys_edma3_init()
/ \! c+ O  V* V2 L{
( j6 |" ~/ k9 g, e% f9 \2 R7 ?        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};" M; d+ |; ^; @0 ~- a" w. e
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, |% Z5 n: ^' v# E4 N/ i$ {8 x
        EDMA3_DRV_Handle hEdma;# l9 K, A, ~5 W3 ]0 z7 y+ b0 |
    uint32_t chId   = 0;8 _: A2 R' C% R" g
    uint32_t tcc    = 0;6 c) M) a6 @. a) {3 `  ~

" M# F  M3 D. x5 M, Q    print2arm("edma3 driver init...",0);
% Q) S/ f8 y% U7 L* W
) v5 d2 o1 S4 v. L2 a/ n1 q9 P- U        hEdma = edma3init(0,&result);
" I0 j  c8 r6 D, Y3 d( Z        if(hEdma)* t( C( L% F6 j
        {
3 q6 |' N( i1 b6 s) X                print2arm("edma3init() Passed.",0);4 m6 R1 p1 \$ v# R* Z" d* [2 @
        }; d4 H1 x* C* @( [
        else6 I# T8 B% H9 S5 G, [6 m4 `" o! D
        {
- G  ~2 e' t1 m% d0 ?: e0 A) P                print2arm("edma3init() Failed.",0);8 i& R! e1 l& ^
        }5 I: E$ t6 J1 Z# Z$ {: G
       
: h) p  D7 E3 }9 ]( e9 n8 e. Z        if (result == EDMA3_DRV_SOK)
+ b! N* @0 J3 L* [& w    {/ |" H: R7 S7 g  j/ U! i3 O$ i
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; o) n8 f5 j( B& ~( u+ I6 t' B
                                                       (EDMA3_RM_EventQueue)0,
* T, Z& @1 g, [8 S- L" X5 q: m                                                            &edma3_isr, NULL);
& q; g. P3 P7 M+ I1 G    }
0 Z" s3 O7 p( p# n/ K       
2 S7 P/ `4 L* @$ X: E3 [        if(result == EDMA3_DRV_SOK)) n/ i* ^; e: @
        {
! w1 R7 d3 D/ s                paramSet.srcBIdx    = 0;% J9 o, \* P9 e5 D. F+ s) y* ?
                paramSet.destBIdx   = 1;
  r0 e% y% b5 Z, I, S* P8 ~0 l                paramSet.srcCIdx    = 0;+ b7 d% |# W2 i+ K
                paramSet.destCIdx   = 0;
. z. e. [9 j% S$ D- S                paramSet.aCnt       = PING_PONG_ACNT;9 ]8 F/ {, W9 A& X/ T
                paramSet.bCnt       = PING_PONG_BCNT;
) e) B9 S: o  ^+ s* [                paramSet.cCnt       = PING_PONG_CCNT;7 q5 S/ v% H4 _& g6 E. ^+ a% ~7 c
                3 U3 `- v7 b5 ^
                /* For AB-synchronized transfers, BCNTRLD is not used. */% F8 n- S4 O" N1 |3 P9 j3 C
                paramSet.bCntReload = PING_PONG_BCNT;
& M* P& b: A4 L
  R% n) E5 J3 t( U/ x" n- ~                /* Src in constant mode Dest in INCR modes */
0 {- g3 E9 f- d7 x                paramSet.opt &= 0xFFFFFFFDu;0 `! Q; h4 B8 \& O  x
                //paramSet.opt &= 0xFFFFFFFCu;
  F- ^( V, R9 t% ]2 D               
3 }4 d3 n+ D4 p                /* Program the TCC */
8 D9 V( X; u) I- D9 p: J. F                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 u1 i8 N6 R4 X, M6 I
" f$ b. n6 h0 u1 K! N3 G
                /* Enable Intermediate & Final transfer completion interrupt */
9 r6 V$ z. e" Y, |- f# Z" N                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- v" E+ w5 Q/ v  H                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 Q, N& p6 a! @' J% E4 k3 k. u
5 |# a3 A9 A$ u% h6 }. c9 l' u                /* AB Sync Transfer Mode */
; n- x/ p1 c; a0 {/ Q+ @                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: K2 L) M4 y- `' ]5 I  a  w
               
' ?, y' v1 c2 G                /* Program the source and dest addresses for master DMA channel */6 q: t, |  B( R6 [
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) A, P- a. w* S) w3 h: {                paramSet.destAddr   = (uint32_t)(ping_buffer);& H) g. ^+ E* W$ t1 N+ b

/ A8 s! G/ l$ L! [% M                /* Write to the master DMA channel first. */8 a: |6 K, C! B; i( I# q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! f' q4 r5 b. \( n+ f7 f
    }      
; p* m( G4 p* b# s+ Y" C2 J# T# @; G# ^7 D1 j+ y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 F- }9 i; `) y5 P4 H       
: F' q, G+ J$ h+ W# E    if(result == EDMA3_DRV_SOK)
6 z+ j0 V1 a% l# ~3 I1 D9 [5 {    {" I; m3 R9 g  r$ ^; _
            print2arm("edma3 driver init success.",0);6 [  G" P) ^& ], p  r1 G% ?8 ]% A2 |
    } - c& }$ v4 K. @9 n1 m% q
}3 ]& @4 }% o8 l; h

; W' [9 z% |, u& g5 I1 N2 }
- v! m/ u3 q# _6 `5 i/ O$ }! yEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' W8 n& H7 k# G2 B, ?2 Q, i6 n
1 C2 Q$ Y4 z6 g- a8 e# U

4 {' d+ E0 E" `4 f" a+ M# C
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' ^& m; ]: G9 _" Z" o; U1 T* N每次DMA传输完成后都要再次使能传输
, M: U, O5 m* |/ P( O
原来是这样,我明天去试试,谢谢了!




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