嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:3 Q4 b) C9 A; R! k# t/ I8 R
#define  PING_PONG_ACNT          10 D9 b* F% C: G( T/ g  }
#define  PING_PONG_BCNT          8*32*40
2 x  E9 d( @+ x2 s. D//#define  PING_PONG_BCNT       1
: M$ h* h2 i5 c* {8 Y#define  PING_PONG_CCNT          1: {# @1 [  D4 D: Y9 K
#define  MCASP_BASEADDR          0x01D00000
) ]# o2 M7 `( ?#define  Mcasp_RXEVENTQUE        (0u): p( j: f- Q/ u4 d
* ~* H! w. b3 N5 K$ ]: B: `: o
/* OPT Field specific defines */
* X, H; N4 A- z1 U" d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' l* P, y. u9 y5 K: `3 H#define OPT_TCC_MASK                        (0x0003F000u)
0 L# [, m% U5 p' \+ l#define OPT_TCC_SHIFT                       (0x0000000Cu)
% C) [# |" G8 E' x#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
* j+ P# o! O5 P#define OPT_TCINTEN_SHIFT                   (0x00000014u). I; w& U, t- F
6 {6 ]0 m+ p* {' h# X3 H
char ping_buffer[PING_PONG_BCNT];
7 y7 Y& O: Z/ Lchar pong_buffer[PING_PONG_BCNT];3 R, B7 c9 k$ {$ B8 z

/ k. q  V1 c5 H* b$ R! r) M$ V0 D1 r& n' k4 O: M

( A+ q$ e7 j, R
" p# B+ O: q5 f9 A8 `( z+ Y7 I( P) sstatic void ys_edma3_init()# E- t8 d" @( \8 K3 I- [
{- `4 {7 M8 }4 n. l2 M2 \
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 s7 v- s+ v$ |' L. Y: x        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, c( A; R+ v# c) z
        EDMA3_DRV_Handle hEdma;
- i0 d% J$ {4 D' x) r    uint32_t chId   = 0;/ H3 n, q& |: P% s! w" ?
    uint32_t tcc    = 0;
# N+ l: Q5 Z' W; c& Q! v: |( l
$ c' Z) ?% m; ]+ @! _$ h) W    print2arm("edma3 driver init...",0);/ p6 y4 ?+ I. x2 q2 U" y, U5 a
% S9 H: \+ j3 M+ _6 E, |
        hEdma = edma3init(0,&result);3 c5 p( f- K' \1 G- v: g2 M1 M- u
        if(hEdma); W. S" y$ H  u3 @4 m, F
        {! O# a1 _. M# H
                print2arm("edma3init() Passed.",0);
( g6 ]4 b3 @) C0 K/ r1 \        }8 e- r9 I1 v% g$ H
        else  j/ z5 }1 d! ?' d" m
        {
9 g+ ~5 N+ m1 l/ I; }6 }" w& ~                print2arm("edma3init() Failed.",0);/ P- `7 U* S9 |
        }5 }4 Z- A& V: O. k& |! E  |
       
, E7 S1 ]' V9 a) w- k        if (result == EDMA3_DRV_SOK)& }7 w" }$ b/ A$ \3 Q) X& u- P
    {# l( p5 f! V! D! M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 b! x# x0 ^+ _$ B
                                                       (EDMA3_RM_EventQueue)0,
$ N& P( ^8 J" e' K* L- z) `                                                            &edma3_isr, NULL);  J1 e, a. W1 z- y
    }$ R$ X9 S  G+ U1 z
       
  N: i3 N9 A. V( ~) J# t        if(result == EDMA3_DRV_SOK)1 N  W6 J9 n% r9 n
        {
) S# r; u4 ?, w                paramSet.srcBIdx    = 0;( j3 F, o2 W% C3 U
                paramSet.destBIdx   = 1;" s; a" w0 d( t! l
                paramSet.srcCIdx    = 0;; e7 F& k/ h6 B) ?
                paramSet.destCIdx   = 0;% V* R+ b+ t5 J7 C! k7 o& p
                paramSet.aCnt       = PING_PONG_ACNT;
% X' y+ E/ U% G# P, ?                paramSet.bCnt       = PING_PONG_BCNT;+ k* [7 {1 ^0 w" N, R4 s
                paramSet.cCnt       = PING_PONG_CCNT;: E; k* P5 |0 t
               
" D7 n- t' Z1 z4 r6 s% d5 X                /* For AB-synchronized transfers, BCNTRLD is not used. */% l& ~0 J7 V4 e7 z
                paramSet.bCntReload = PING_PONG_BCNT;5 z- h) G8 y3 b" W& `# y* L8 I
) _$ F0 H9 s$ M- z* U
                /* Src in constant mode Dest in INCR modes */6 L0 B7 }+ U+ \9 \* ]5 W
                paramSet.opt &= 0xFFFFFFFDu;
* {: o, G3 f$ _8 k2 s                //paramSet.opt &= 0xFFFFFFFCu;2 I+ m2 x4 D0 w4 K- J8 p
               
( y* k+ }& H8 V9 j2 ~+ o6 \                /* Program the TCC */
  K( \9 T. a/ ?: i. A* s                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);, ?* t- h0 a4 l$ X8 U8 S! ?. S
; B, d) F) k) T% e/ d
                /* Enable Intermediate & Final transfer completion interrupt */& P6 G. U% E; c3 g; q# @+ z* t0 R  V* w
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);5 O; e- L: H0 a$ X" }
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);" d8 o4 x+ D1 c  r8 V0 |* Z( F( a3 a0 z
$ s0 T, X0 `* r% j  a
                /* AB Sync Transfer Mode */9 S' H. _" Y! u. i
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: j4 |3 S4 y5 m  Z& P) k
                % \% ~3 K# [5 l
                /* Program the source and dest addresses for master DMA channel */
0 Z. ]! o% r% i, \                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  Q2 w/ c& N7 H9 o. }* [+ V# q                paramSet.destAddr   = (uint32_t)(ping_buffer);
( A' }8 G. E0 _+ `# E, B! u+ f7 L$ S" m' K
                /* Write to the master DMA channel first. */5 {) w* `( `. Q# E( ?% n. x1 L
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 B3 I4 {" K) `+ m3 w+ d% u7 z6 g% b
    }      
- l3 l% D6 q! Q, I4 Q/ I
; q  K* B' ^1 U) O7 S! R" U        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' u4 r: i2 b9 ^) v       
7 L- o8 H7 a- {5 ~: f* l" Y- l    if(result == EDMA3_DRV_SOK) 5 s. `  c3 b* a7 e! o+ L1 D, x! o) b
    {( e* d5 E. O2 M0 O
            print2arm("edma3 driver init success.",0);
: V$ F0 i$ P# X6 D: y- U$ E    }
1 O% f; m. o8 f2 t7 Y* G}0 |9 D+ {% K4 v% Z3 w( e
* @% P* ]0 z4 p; ~' S
9 _9 p/ l, U$ P% A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* S  s$ @: k6 l

6 ]8 i# C! |0 ]) e8 U; s! K7 e, I0 v, h+ X6 w  V0 Q& [- n

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:475 R( {& v+ n' Q: k, J) Q. ?: D( V1 H* J
每次DMA传输完成后都要再次使能传输

4 F# {% |& q) s6 n1 N原来是这样,我明天去试试,谢谢了!




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