嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" t8 Q+ b; z2 i& M#define  PING_PONG_ACNT          1
4 V- w6 u& @# G' Z* e' w#define  PING_PONG_BCNT          8*32*40
9 [: _4 L. D5 X! Q" x- g$ b//#define  PING_PONG_BCNT       1 4 o$ [0 n* K* a+ }! s
#define  PING_PONG_CCNT          1
- o2 I3 W0 h+ R& [6 ?6 R8 S#define  MCASP_BASEADDR          0x01D00000" G7 U; L0 k0 y1 I: D) v! G4 ^" ]  X
#define  Mcasp_RXEVENTQUE        (0u)
, L# j( y$ }; y0 L7 Q9 x% t: u: k" `2 q$ }2 d# w. e8 x% e) {
/* OPT Field specific defines */4 G+ u8 _* A7 w7 C* k- z
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& g( F* y" ^2 |, [& I+ F& I
#define OPT_TCC_MASK                        (0x0003F000u)
5 p& X7 i* T8 B& L#define OPT_TCC_SHIFT                       (0x0000000Cu)
. Q/ ], U5 t" b( v# A#define OPT_ITCINTEN_SHIFT                  (0x00000015u)+ f6 V, z+ a* q2 Z
#define OPT_TCINTEN_SHIFT                   (0x00000014u)/ o5 O& S! S! z2 r

, \( P' y$ u) ]! Y. U+ f3 X) y3 h$ d: zchar ping_buffer[PING_PONG_BCNT];
, B" ^& A9 J5 schar pong_buffer[PING_PONG_BCNT];
6 d3 ^0 L' F) f: ^* p( J' y7 A4 Z% U- ^& z

/ A7 m! E" G! f. g
$ b/ \# z1 v0 ~0 m# I3 i6 N9 e! F8 r) A" ~- c0 z& a" C
static void ys_edma3_init()
3 y8 f& W+ Q* ^  b2 x3 a) v7 W0 K{4 W  Q3 K8 }5 t5 {( I& o* q( }9 U' f! H
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};7 P& j8 g% f+ K+ O
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;( y6 H1 T+ V5 E! ^/ d" O  x
        EDMA3_DRV_Handle hEdma;' |, Y& B& [, a
    uint32_t chId   = 0;5 R' V. h# O, y% M! C
    uint32_t tcc    = 0;
- {: s0 A1 C/ z9 S) c9 I$ G# I6 z/ P/ E5 B( J0 j, [: C2 {
    print2arm("edma3 driver init...",0);
4 ~6 P- Z+ \( p* }( n3 {0 e* a; _! t/ T, B. l
        hEdma = edma3init(0,&result);
/ i2 B" s% {( z        if(hEdma)! @9 Q. j+ x5 f3 g( d
        {! w& l: f8 W. m5 M/ A+ @/ L
                print2arm("edma3init() Passed.",0);
& r- \) Y5 ?" b        }
! S7 Q+ H; D9 t1 Y7 f: {        else% \0 F2 r! s/ A& J2 C2 o( l( ~) `
        {- k; n: {; I' K' [+ C
                print2arm("edma3init() Failed.",0);; A* U) w8 I* ~; t; {4 b
        }( d1 X0 L# F6 q7 d% S% K
        8 O0 ]+ i, m( ^
        if (result == EDMA3_DRV_SOK)! O1 f2 r" K, H7 ~6 u) M& u! d
    {
( x) V; l( P7 X; H( |3 Z+ ^                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, p4 G3 L" i2 p- z9 `0 j1 V1 o
                                                       (EDMA3_RM_EventQueue)0,
2 e% h$ w7 g* N* z- t+ W3 G9 D                                                            &edma3_isr, NULL);! v) a! ^1 ?6 M6 R6 c2 U) A, n* {
    }
( H" B0 b) D1 Y7 `8 x& R  `        7 X- U/ d7 c" y; P, |
        if(result == EDMA3_DRV_SOK)
, q" G) F; i' N0 ]2 Q% n        {
9 v3 ^/ x3 K2 r* |, k7 M5 H, z" \                paramSet.srcBIdx    = 0;: J6 Q& J0 C0 R6 F4 z
                paramSet.destBIdx   = 1;2 A: Y! G' d! `
                paramSet.srcCIdx    = 0;
. S& M' h3 X9 v                paramSet.destCIdx   = 0;
( V7 y( f/ V3 L! F0 ]: f                paramSet.aCnt       = PING_PONG_ACNT;% C8 z  {7 e$ n8 o& U: e
                paramSet.bCnt       = PING_PONG_BCNT;) e9 m" a, B& j/ c4 i: a
                paramSet.cCnt       = PING_PONG_CCNT;: @/ ^! _7 Y! Y$ ^
                ( y, s) \0 T" Z3 v% n2 d
                /* For AB-synchronized transfers, BCNTRLD is not used. */
& a. D6 p: X& j% H7 c% m' _                paramSet.bCntReload = PING_PONG_BCNT;) P5 e5 t, K- h4 a
2 c  v/ l9 z* K" ~1 _/ A% T
                /* Src in constant mode Dest in INCR modes */. r+ l) c. x& s
                paramSet.opt &= 0xFFFFFFFDu;
4 h+ x+ c# R& m! t                //paramSet.opt &= 0xFFFFFFFCu;6 m, \- `+ K# A$ M8 U: }
                1 p  y- F: ?" q
                /* Program the TCC */- Z8 i: x2 f# l
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' ~2 M+ L3 z: E; e' T3 b4 i
* P5 {& e8 y0 H6 e
                /* Enable Intermediate & Final transfer completion interrupt */
6 e: D3 Q" e1 P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ L5 n8 T5 F( K3 t1 ?, U
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ Q5 p" E7 h: E, e2 r8 K; G/ A9 P8 t) x' K7 O4 u: q, H  a
                /* AB Sync Transfer Mode *// Z" H/ N+ @" J
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. A! g8 ^& i: `' b& V& b6 y4 r               
( x8 X: i1 x& p) |* K; x0 ?                /* Program the source and dest addresses for master DMA channel */
5 W  u1 }, }& q5 o                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. z! B! ?/ E! [1 R
                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ |2 o$ Z- _3 z2 ]
7 X8 U! S7 d% F& P' [                /* Write to the master DMA channel first. *// }7 o% [5 r0 f% `1 n
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 H3 Z: Y7 d8 |    }       * G- x; V1 T0 z4 X2 N$ f
  B4 P; p0 ?( I7 X- a- {6 D
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# A" V8 j4 L- r! t8 R$ ?       
  ^( z9 I7 }) o3 d+ j    if(result == EDMA3_DRV_SOK) $ L& k* ~* K- s7 w* A3 ^' d
    {/ j, X) c5 Y$ Z9 V: J1 g9 N
            print2arm("edma3 driver init success.",0);5 Y! T) J8 Q" s# b/ F3 K/ r! x& O3 Y
    }
- f( G; F  J3 {- j% E}
3 y- Z( \  f0 j3 Q( U) H! A7 I* H' G! D0 {' `. c$ K
1 W, _% }% m* t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" m/ t( D8 C4 ~# T7 m2 D% J8 l" O7 H9 ~. z' [
; O! X; B5 a3 Y

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, Z8 a4 h" s  e8 ]) `4 x7 }
每次DMA传输完成后都要再次使能传输

; ^4 g& f% ~% K$ N1 s5 v原来是这样,我明天去试试,谢谢了!




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