嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: J. `! D0 I$ J6 r4 R
#define  PING_PONG_ACNT          1
3 j( K! u* f9 C3 A6 y/ D2 S#define  PING_PONG_BCNT          8*32*40
# g# o% S. U) D5 i: M- Q//#define  PING_PONG_BCNT       1
% \. h* L$ X* \8 k, j, k#define  PING_PONG_CCNT          11 f  y) o4 J- @' T5 _
#define  MCASP_BASEADDR          0x01D00000( ~2 Y, x& ?7 E" b' N6 Q- F
#define  Mcasp_RXEVENTQUE        (0u)
  @" Q9 v" o6 Q* k6 I( Z
7 w, D* ], O2 n1 W/* OPT Field specific defines */
% ?' [. ^" Z0 M: v; i# N  t#define OPT_SYNCDIM_SHIFT                   (0x00000002u)- W; \8 ?* [) Z$ u
#define OPT_TCC_MASK                        (0x0003F000u)' L5 x7 p' y& p" n8 U4 `$ S
#define OPT_TCC_SHIFT                       (0x0000000Cu)2 V6 U3 a+ [- J$ `* r9 v% ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u); [; q8 f# z7 K7 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" z8 L! g2 u- ]1 D7 J" ~" V+ A2 U
char ping_buffer[PING_PONG_BCNT];
; B; d+ ~. [* d/ `  i7 E$ }char pong_buffer[PING_PONG_BCNT];
( m) @: T3 b1 V& V2 B6 W( R$ s
; M+ a! k* q) u$ ~; C# M
! Q3 k) A/ X" `

& U9 r$ |3 _- Y3 Nstatic void ys_edma3_init()( T& i/ f# u/ Q6 L7 \9 f
{
. l6 S, w/ i4 H; E& k9 P  Y: l; n        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};  C# S  ~$ B9 ^7 W/ c9 d* C& Z
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( R6 n4 B, j9 |9 {        EDMA3_DRV_Handle hEdma;
1 C, P$ G+ j) y' z% g& h, e+ t9 o1 B    uint32_t chId   = 0;" ~+ s. J7 i" u- b' J! e
    uint32_t tcc    = 0;
' Q: c1 H; l- S; \4 K. i+ g; g) y. g: k' K  B$ N, O& e# P
    print2arm("edma3 driver init...",0);
9 c& {- ]  e! b+ `
' k  k+ ^1 ]7 K8 P4 W" L$ Z        hEdma = edma3init(0,&result);0 X. B  V4 K) y" g+ E0 U
        if(hEdma)
8 i$ z# Y- _. v. V        {
! Q* E2 T: @9 {8 d+ _: O( z                print2arm("edma3init() Passed.",0);
6 z' s+ U: B1 T( g% i- l- {        }) u# I7 D6 B0 S
        else' h! D- F% [1 q4 s8 D0 y# o- S
        {* M+ o3 c7 e& \
                print2arm("edma3init() Failed.",0);
- @6 l4 I5 f& H7 I$ d# ?; G        }1 R8 g0 C' o2 y3 p. L
        ' N9 n/ y2 R, y6 _; o8 j; B6 O
        if (result == EDMA3_DRV_SOK)& w6 o. v5 d2 z
    {
& l6 b* C) I4 a2 f                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& T. L+ A: y0 `2 f5 t                                                       (EDMA3_RM_EventQueue)0,
4 O3 @7 F. J: x! ?8 G! F5 w                                                            &edma3_isr, NULL);
1 q' K5 @0 I1 c1 G, q    }/ @6 U" P+ a/ e: ^5 k
        $ A& f0 m/ E7 \# L% Z+ v
        if(result == EDMA3_DRV_SOK)
  V+ @4 {9 w- e6 {  [9 {  G' d        {
7 q( V2 W' o: k/ S" S2 C                paramSet.srcBIdx    = 0;' f! G9 Y. h" h# T1 m
                paramSet.destBIdx   = 1;
' [+ ?" Y, M! Q                paramSet.srcCIdx    = 0;
, X* o" o! [8 l  C                paramSet.destCIdx   = 0;1 C7 i" u) r% c# i. \6 L( S
                paramSet.aCnt       = PING_PONG_ACNT;# {3 h7 Z! I1 R/ `  L  e5 K
                paramSet.bCnt       = PING_PONG_BCNT;
$ N2 c" K3 r" e! n* n% J                paramSet.cCnt       = PING_PONG_CCNT;
8 J! Q" U9 n9 z: k5 H% {- }                1 C% U. `: E+ v; ?) J3 F7 W. S
                /* For AB-synchronized transfers, BCNTRLD is not used. */; m. {, `+ I: e+ L: S  ~4 D
                paramSet.bCntReload = PING_PONG_BCNT;
4 W" [" Y6 ?  ~: A; }3 q
. b# p- j( z1 c$ u& Y$ M                /* Src in constant mode Dest in INCR modes */
3 B2 L7 d' I% n/ |3 ~                paramSet.opt &= 0xFFFFFFFDu;5 D! e/ I: _2 R4 Q+ M  O
                //paramSet.opt &= 0xFFFFFFFCu;
- n6 O' p2 |- p               
( y5 {9 H) I1 q# t6 h- j6 z                /* Program the TCC */
, V% T. n  [+ A' \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& y1 [, T% t7 F6 ]1 ^' W
. `. Y4 A6 c9 j! S0 G% w% H" ~                /* Enable Intermediate & Final transfer completion interrupt */
) L2 }0 P8 a4 d& N. j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  H7 O' V6 s; I' i  O- b& U                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 m) Z  \7 T' b, J4 i6 l9 Y0 d7 l+ i8 z. t+ M4 b
                /* AB Sync Transfer Mode */
, ~. L  W5 ^$ e; f8 C                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 Z! \* ?$ f7 k( I1 `                0 ]' S4 `. N. j& \( V. R+ k
                /* Program the source and dest addresses for master DMA channel */2 n" c9 R! r* U+ u3 y& r2 n
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
8 W. q, x0 Y7 x5 b# f2 v& k                paramSet.destAddr   = (uint32_t)(ping_buffer);, E6 g8 v6 Y3 Q* k* u0 p

. w" O5 |) b+ ~: m: {& y3 F2 O                /* Write to the master DMA channel first. */8 e  L' s) l) Q+ V! `  k  i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
/ I- A4 L  W$ L2 h) y8 a    }      
9 e6 Y9 ?# `3 d7 N% Y# G* o' x  s  Q! v" X& f, @& f8 f3 S
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- g2 O7 K6 V( u% I' Z       
6 K! T6 P  t$ L/ N8 N* _$ f    if(result == EDMA3_DRV_SOK)
& n, J. M3 c& ~9 F2 F    {
; R1 s. ?; x* Z  v2 e            print2arm("edma3 driver init success.",0);
4 k6 {8 n6 K" B    }
9 J+ P: P3 W& K, X. i}
) ?: J! k' h5 ~: v0 J/ w7 c* R5 N
  O- ~: g1 A0 i3 u6 S
' b% D5 S2 K4 N6 x& `# D8 R' |: CEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: \, ?' r: F5 s

# S% }" K8 b. h5 O! Q( d- b; ^' O- {7 G$ R" i1 a+ n' U2 E

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: `+ N1 o# m) n7 H  g每次DMA传输完成后都要再次使能传输
9 r* c1 p% ^- C' ~. e* a" H. h
原来是这样,我明天去试试,谢谢了!




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