嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 I6 p4 f& V8 k6 i7 j; ]2 v/ ]#define  PING_PONG_ACNT          1
1 \, Q& ?, j* G#define  PING_PONG_BCNT          8*32*40
; y( A( E7 E6 z# U4 l* p//#define  PING_PONG_BCNT       1 5 b7 e6 u  S2 [0 g9 R2 M
#define  PING_PONG_CCNT          1
. P0 O# n+ u( P) B( Z#define  MCASP_BASEADDR          0x01D00000
$ c4 C7 I/ s! D#define  Mcasp_RXEVENTQUE        (0u)
4 I  F* m# `; q4 Q6 A
+ |; H! @, Q8 y! Z1 x( O; K/* OPT Field specific defines */
  c6 F' ~, A, u2 D8 F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)2 t0 U7 i% x5 `# L( p2 }% t. M
#define OPT_TCC_MASK                        (0x0003F000u)" _1 n9 ]& ^: t4 t
#define OPT_TCC_SHIFT                       (0x0000000Cu)
5 g- b0 J) A' n% W3 |/ Y3 l#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& n! e* \3 d. o7 M" x+ z0 V, K2 @
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
- {$ X, g$ J7 b3 l, K. ~+ O5 t
% f0 {6 L/ q5 \2 Tchar ping_buffer[PING_PONG_BCNT];
& G8 ?; m% d* @, b; d  u" mchar pong_buffer[PING_PONG_BCNT];
  r. {2 ?- o4 A2 ]" ~4 K
' u1 b* j  F2 G+ H! d: }5 ]: V1 ~" Y6 E  V
. v! Z1 S9 B. j6 G! z, O
( O# ?* n9 H* M& k/ D
static void ys_edma3_init()( C- s  B- p& D; a/ X/ I
{7 t' S8 r* r# q" K. o2 ^3 b; G) X
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 ]! B4 @  d0 W" ]        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. {) R/ [/ a4 f" ]% x. D        EDMA3_DRV_Handle hEdma;
! @3 w# R, q+ |) t  ?    uint32_t chId   = 0;
1 i4 _/ k- i; P    uint32_t tcc    = 0;
) P% d( E5 `) D2 J; A4 l8 G8 o2 U4 I6 Y3 m% T
    print2arm("edma3 driver init...",0);, t+ \# W+ b0 X# ~6 c) j, b

+ D& Q; X& D# P; G% s; Z. f  G9 @        hEdma = edma3init(0,&result);- T: W) s: J& N6 S* c
        if(hEdma)8 H; T1 ~: B$ f! a: c
        {
/ f. G& u4 t! u5 _                print2arm("edma3init() Passed.",0);
0 @* U3 y4 C# p# S+ j. M; b. d$ N$ |        }* w: b0 t( H* |. }! B
        else7 F; L; a$ X5 N2 k) [- G4 A( t
        {  U8 m* d) k! d2 }- p
                print2arm("edma3init() Failed.",0);
" _/ J+ X2 l- V9 A! G! z+ J        }
; s" Y* p1 S9 o# [3 g        ( e3 s3 ?8 U) Z7 [' ?/ N
        if (result == EDMA3_DRV_SOK)' z4 s  Q& a3 r& D. Z
    {
$ {+ }3 O) `) |( X, K4 @0 u                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ F( g% ~4 n" l! ?+ U
                                                       (EDMA3_RM_EventQueue)0,
3 h0 o6 a9 x$ e1 G                                                            &edma3_isr, NULL);
) F, d5 b9 Q4 }( r4 k' Q    }
% o( t1 }; _5 [9 ~5 h7 F       
+ g9 Q7 i4 r7 @  `2 D        if(result == EDMA3_DRV_SOK)! X8 I5 `7 Y7 C1 G
        {
7 _2 C9 p  t* W2 `$ t. e7 _* X                paramSet.srcBIdx    = 0;
% U! A7 J, c. ?$ d( @                paramSet.destBIdx   = 1;
- A) i" M+ K, W- I9 R  @                paramSet.srcCIdx    = 0;
# M3 V6 ]+ |$ c- X4 @- p                paramSet.destCIdx   = 0;
+ @* c) P) }5 K; ~  T8 x  f- I9 }                paramSet.aCnt       = PING_PONG_ACNT;
+ c$ I3 C6 }/ H4 j' q5 d- [                paramSet.bCnt       = PING_PONG_BCNT;% s2 C% A9 L4 n2 K
                paramSet.cCnt       = PING_PONG_CCNT;. E. k  @) @+ x4 p$ I# R
               
# S6 z4 i0 r/ o" o" R* [, O5 v, h- j2 x                /* For AB-synchronized transfers, BCNTRLD is not used. */
( k7 N* h; j4 L' y8 e/ n3 s9 w4 E7 |                paramSet.bCntReload = PING_PONG_BCNT;
" x3 z$ Z2 G5 N1 A$ w
6 v% O2 }& o* p                /* Src in constant mode Dest in INCR modes */, L  {6 d" @9 Y# \8 P0 `9 M
                paramSet.opt &= 0xFFFFFFFDu;( e+ Z6 Y9 {! w( M  X' H% U) S5 s5 @
                //paramSet.opt &= 0xFFFFFFFCu;
# g% D3 D/ i9 ?+ G  L( @               
( {* E2 W$ V4 Q4 F, Z$ R                /* Program the TCC */( N2 B4 k& n% L9 Q/ N) {
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 H; g) u7 U1 e1 P/ [, K, s
$ l6 ~5 s( F! `1 G
                /* Enable Intermediate & Final transfer completion interrupt */
3 y" A- b, j( w% T+ `                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ \, }7 l5 E. C* b% h
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
  G( [0 O' {5 c: m, X3 p& P& i% v2 m1 K# D% x
                /* AB Sync Transfer Mode */
/ q6 N! k/ j9 g! u5 D2 D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  e3 H0 A4 h+ V               
4 J4 i9 b- N6 j, E8 Y0 ?: @                /* Program the source and dest addresses for master DMA channel */
1 Q6 U; G, u3 f8 K8 U4 |5 H                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% p- Q' U6 n$ h# Z. H$ h
                paramSet.destAddr   = (uint32_t)(ping_buffer);
  y8 B1 D: Z  L) h% f
8 m. p6 ]9 K+ {5 i) y; b% f# k                /* Write to the master DMA channel first. */
& B  n0 j; B- m% P                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- ~  ]; [9 A4 u3 W6 U; I( z. y- G    }      
; P, Z/ [7 u5 G: @% L& R; V& e$ @3 M. O' N2 d
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" `4 k2 t* o* K        : t% n  d' D. i
    if(result == EDMA3_DRV_SOK) 9 _2 X) u4 f; R% r9 G5 [% F
    {
) \3 M; Q7 L& s  e/ k            print2arm("edma3 driver init success.",0);5 ^- n9 H! \! J* u' _3 N
    }
- f. b8 T' V) n( Q& L3 y}- T- R; P/ O( [; ?4 h, y
8 g8 z: o' u$ \

; K4 h- z( ?) E  [' nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ |& y+ b. b' S6 e9 A/ `$ Z6 l) K2 ?0 y% E2 Z3 h, P

; B# R5 _$ x. g$ X9 ?; E+ K
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
  s8 p( Y- s/ m, A" R8 `每次DMA传输完成后都要再次使能传输

, j. V7 T3 b8 e1 y原来是这样,我明天去试试,谢谢了!




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