嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:4 q1 C9 X# Y. [! k
#define  PING_PONG_ACNT          1# y- L: H4 r* z0 H) l+ M$ f
#define  PING_PONG_BCNT          8*32*40 2 V; @( z9 e# C3 B# L: ?9 W
//#define  PING_PONG_BCNT       1
7 `3 D$ y. J- F5 p0 ^5 u#define  PING_PONG_CCNT          1% J0 Q: N% Q. i- _1 L0 g
#define  MCASP_BASEADDR          0x01D00000
  K- g8 y/ r! [* P$ p#define  Mcasp_RXEVENTQUE        (0u)! u* t- g+ ^  H* A4 S9 U& E0 |
# p. O! v8 m! V) U5 n9 F
/* OPT Field specific defines */* A) N) g5 {& n! a  |1 D
#define OPT_SYNCDIM_SHIFT                   (0x00000002u); V! Z. x+ g% V3 b  s7 ^+ U
#define OPT_TCC_MASK                        (0x0003F000u)  L5 x" M. Y4 z
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% b+ x" T6 h' b) v. [#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& P$ s9 u! O6 l#define OPT_TCINTEN_SHIFT                   (0x00000014u). r/ N, D6 V# }2 j5 ]  i

2 V% @4 p4 q( Z/ Ochar ping_buffer[PING_PONG_BCNT];( U) l6 s3 i( o" X- F, p1 X
char pong_buffer[PING_PONG_BCNT];. J+ S' c( U! G8 m
+ {2 m" E" V" ]: g- m' V2 Z$ j
+ B. Y/ ^6 X' b6 y8 N+ f/ y

0 P7 F3 Q6 V9 o
2 T% x0 R2 f7 Q! W! U6 e/ q0 Q$ Kstatic void ys_edma3_init(), Y& X' r% x5 r9 Z1 M" t: J* M
{; J# D5 w& n6 R# L; y) O% B5 n0 r
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) k" i; J6 `+ D2 v+ N& Y! G9 U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 k& }# V4 i! b% r$ s+ l        EDMA3_DRV_Handle hEdma;
0 c$ I6 o  f  o    uint32_t chId   = 0;2 z3 X( h, O" c2 P# @$ O
    uint32_t tcc    = 0;
8 i4 a9 W+ ^0 D9 B6 Z
' a8 V* f* ]  f  [& @2 y    print2arm("edma3 driver init...",0);  h* a  r& A& o" b

6 ~6 s! p/ H8 r3 G  Q        hEdma = edma3init(0,&result);
4 d) L- W( v: m) L; W        if(hEdma)
$ S" `# g5 T% F: f! n        {
# W: e- M6 D0 h+ r, {; p4 g; L0 t9 q                print2arm("edma3init() Passed.",0);
( t+ I' v- |2 D% t        }
& e9 `/ H! v/ J        else
5 ]& y1 F# o# D        {( ^! Q5 D  x9 G+ O6 v  w7 y  y
                print2arm("edma3init() Failed.",0);
7 s' L; B5 s3 C. o7 a6 T) p, M        }
" z! @/ Z/ h# H" B& B        / M) a# w6 B9 R) c" M) W
        if (result == EDMA3_DRV_SOK)1 Z$ J/ p0 R1 T
    {$ i$ f( B+ n2 r8 Q# I
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 Y5 z- s& v3 i9 r8 e, P/ [                                                       (EDMA3_RM_EventQueue)0,2 J; o3 }( B# @( G$ c4 D2 W+ r% x
                                                            &edma3_isr, NULL);9 u$ ]" {5 |$ u5 c
    }
  H/ T& `8 ?& v        6 m  o( {4 d6 @& ~
        if(result == EDMA3_DRV_SOK)
5 W" K; [9 [$ l. z2 R$ P        {/ m+ ]( |. W- f; r4 c, e8 H
                paramSet.srcBIdx    = 0;0 f2 W9 p5 X- f- b2 v& {& [+ z: J
                paramSet.destBIdx   = 1;$ W& G, u8 x/ ?+ q& o
                paramSet.srcCIdx    = 0;  O% f0 k! p0 O6 k4 d
                paramSet.destCIdx   = 0;
: l$ }- ?) H. d) e0 f8 ?                paramSet.aCnt       = PING_PONG_ACNT;( j- @! ^+ o9 ~. q2 Y
                paramSet.bCnt       = PING_PONG_BCNT;8 _! e+ ?; m* h4 e( ?; T
                paramSet.cCnt       = PING_PONG_CCNT;+ h) b, p, ]8 A) C
               
- a# O5 f2 h% N0 Z2 ]+ M1 c                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 @. D# I8 m" l7 ]  j5 X, ?+ A                paramSet.bCntReload = PING_PONG_BCNT;
3 x6 H/ I6 W6 h/ R' w7 q7 ^2 K  s
: n) }9 d% S" ~) n                /* Src in constant mode Dest in INCR modes */8 a$ @& |* Y0 f( X( w
                paramSet.opt &= 0xFFFFFFFDu;" Z" w3 N. l' ]/ k
                //paramSet.opt &= 0xFFFFFFFCu;; Y( o6 r. ^) g( `* C/ K0 r3 F: D
                ! G0 T- A: P7 X* z8 X
                /* Program the TCC */
1 `  l& D9 T, t3 J                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 ?- X0 x* x8 C- |# t- t1 l+ i( _8 |7 y+ S
                /* Enable Intermediate & Final transfer completion interrupt */
, u1 C: D+ |, O  l: l                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* V8 {- U/ o+ q4 {                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& n' ?+ b' {8 F
2 \6 e6 Z& a+ P- S' X
                /* AB Sync Transfer Mode */
; B+ D  d- a% T3 r                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 R6 h1 \7 {; T4 z4 [; `
                1 v" m% o3 H: U; h( l
                /* Program the source and dest addresses for master DMA channel */% y: o3 X% T& h
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 P0 S1 f. H3 C7 u  s* f+ T                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 S- e- T# b3 N  h. }" W6 y4 F; B% f2 g" l/ W/ [# M% F$ J
                /* Write to the master DMA channel first. */
  f2 ?- N8 l6 ]                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
) k( a" E! W, ?: I% }  }$ X! K" V    }      
1 X& H# f7 H; y2 S, ~; B2 u4 G5 t1 y! T
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. p2 @0 d; u: k2 M& x        ; G" J- q" v7 P
    if(result == EDMA3_DRV_SOK) ( r+ Q, S; ~+ p6 i' [( k
    {
: K( d2 E3 W( X- R            print2arm("edma3 driver init success.",0);( K. n- `8 B, O5 T& G9 F7 l5 E: v
    } 4 S; X* b! b. d
}
, j- Q; l- L) O  [/ P3 a3 N, z4 w. B
$ v1 L4 U! H  V4 _4 Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 m& n/ H1 M* P8 k6 B2 I9 b

/ @7 C9 R/ o  y" l
# N3 |1 H/ k$ y9 F* I' c6 X
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 @* B. c% t4 y* X5 c9 t+ l* R
每次DMA传输完成后都要再次使能传输
6 J# E5 d6 }& B0 B$ }3 |) Q- H* B
原来是这样,我明天去试试,谢谢了!




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