嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# V' S! x: P  `( U" a7 F6 \2 y#define  PING_PONG_ACNT          18 n" X. l( N5 H- L4 v3 y% L
#define  PING_PONG_BCNT          8*32*40 + Y7 L( @3 f# N' m3 w) ^0 i. ?
//#define  PING_PONG_BCNT       1 2 l8 L6 h9 {7 b5 e( P# M
#define  PING_PONG_CCNT          1
2 i( O, q* g2 p# G+ v$ v#define  MCASP_BASEADDR          0x01D00000
. x4 a& e0 M+ ^) W#define  Mcasp_RXEVENTQUE        (0u)
+ u% ]: f2 l" p/ o% _
* x* o$ H3 c' n- B' B( M* Z9 a/* OPT Field specific defines */8 A9 J& k7 A$ D7 B  U. }
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# o& S  o9 F' v5 X: y! i: D#define OPT_TCC_MASK                        (0x0003F000u)7 q3 ?# D6 |$ n& S
#define OPT_TCC_SHIFT                       (0x0000000Cu)
; I, q. I) ^# Y/ p#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
+ k5 H3 V  i' a7 S' M8 u0 G#define OPT_TCINTEN_SHIFT                   (0x00000014u); u5 k( w% ^9 u) E5 Q. d# i) j
/ E' v# `4 R) U# K5 K5 S7 n6 P3 w! n
char ping_buffer[PING_PONG_BCNT];
. f- C  M4 c' A8 C# c' Z0 @5 ~- @char pong_buffer[PING_PONG_BCNT];
+ _5 k% m. u# b% M5 b0 A5 x& f3 E9 G; v9 s1 y9 U6 _9 {* w5 `1 y' M- e
! J; \5 {4 A8 |7 a3 V

. O4 s3 q) ^- F. R5 r; g; f. f. B
static void ys_edma3_init(), Q) }% {9 ]8 k* G
{7 o$ w' u0 E9 F) r) D
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 k. L5 t  n+ n; D, r- ]+ a& s        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 _) j% ?/ k" h. M2 a4 @2 t! s        EDMA3_DRV_Handle hEdma;
7 B  l0 _$ T$ z3 D2 b+ _5 Y6 Q    uint32_t chId   = 0;" h3 Q6 s6 H- O( d. }
    uint32_t tcc    = 0;2 T" G0 a" O- _! W! n- x; h

  ?, J0 a% O$ c# @    print2arm("edma3 driver init...",0);. c9 |0 |! x" `: R# e' `
& @3 }9 r4 d& y4 S' C- V9 d* v# `
        hEdma = edma3init(0,&result);
) L% b. I' T1 i: y2 D        if(hEdma)
$ |% s- h0 V# s' w1 s        {; \8 w( h7 g. e8 E; I# U5 G. Y
                print2arm("edma3init() Passed.",0);: o: x# G3 O" w5 j% Y7 g; g+ A! X
        }
/ Z& X9 V! S2 z        else
( j+ Q4 l! c( @( o        {
/ w6 f# X6 p3 _: @4 e9 }5 `) N1 q( }                print2arm("edma3init() Failed.",0);
! V0 O1 v. e/ h! v+ `1 L' }$ O6 P        }
- v$ u6 ?- X5 R       
. o2 c' O0 q9 y$ z6 Z        if (result == EDMA3_DRV_SOK)
7 D8 c( ]  P  G6 h1 `    {
. p; }7 z4 t% U+ d                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 u4 u' A2 s0 U4 z, k# S
                                                       (EDMA3_RM_EventQueue)0,
, U8 Y+ V9 g3 A' S8 B                                                            &edma3_isr, NULL);
9 G+ x; F) Z  N" g, D* Q7 I& X" j    }
1 o1 _0 R) T/ B2 s' j        ( J& l1 {3 G) f  H
        if(result == EDMA3_DRV_SOK)
, J& a, f0 n, ~        {
% K4 X- z0 U/ ~0 a  ?1 S# r; O( ~                paramSet.srcBIdx    = 0;0 _6 a0 R# {6 G8 o( r4 B" i( K( D
                paramSet.destBIdx   = 1;. o5 T8 E" H2 X! g5 r" p/ a
                paramSet.srcCIdx    = 0;
: d5 E4 R1 w, j# U6 h7 U8 {2 K                paramSet.destCIdx   = 0;
9 V- _: Q+ C' ^8 u                paramSet.aCnt       = PING_PONG_ACNT;
3 Q2 u, R; H! I# l                paramSet.bCnt       = PING_PONG_BCNT;
7 [6 D# M) D& a1 V' j% N: `                paramSet.cCnt       = PING_PONG_CCNT;' v* i% n* F( q1 f  s! [
                & Y  v; b. c% T
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 x$ y& P% ^) x7 a" r  h& C+ G, _
                paramSet.bCntReload = PING_PONG_BCNT;
. b; ~" J1 H7 e- |" P) x6 {- R2 f$ J3 B# Q( b/ f8 u
                /* Src in constant mode Dest in INCR modes */
- d/ L$ p. V8 c! }5 ?* W                paramSet.opt &= 0xFFFFFFFDu;- ]  @2 K% V8 p2 z* {$ C
                //paramSet.opt &= 0xFFFFFFFCu;
; O- V/ T4 Y0 J" P( o5 D$ K               
' M7 {; m# A, ]6 E                /* Program the TCC */$ ~* r- [3 _# i
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# C8 p6 n$ o+ G  G- R  F
1 q, ~0 w! `: d, k; Y
                /* Enable Intermediate & Final transfer completion interrupt */* V2 U/ Q2 ^: H
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; R- Z0 C+ S8 d( q3 D
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( |+ L6 N6 K: Z8 w) a# v% K) w% C4 }; C" E: p$ v
                /* AB Sync Transfer Mode */
# T" [1 K( _* c/ T  U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: n+ W, h% s; l. @$ Z' v1 t) [               
  O8 T4 X5 D& R  Y6 w) z& }; n                /* Program the source and dest addresses for master DMA channel */
- b" a, g. H# ~6 @9 b$ F                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
8 i: d0 D# [" h' m                paramSet.destAddr   = (uint32_t)(ping_buffer);
, ~5 ?; {0 y2 r: u  H' j2 J7 Y, I0 g; _0 T4 a* N
                /* Write to the master DMA channel first. */
7 e, [0 `! M6 s7 s                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! s3 A4 z& F0 @9 O' c    }      
" L' q- a0 k* t0 l1 {1 F4 L$ b4 o% W) E/ S: G! V6 o7 d6 W- n
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( E( a4 h/ x, d- o
        " N  f& q! Z4 N  `1 Y
    if(result == EDMA3_DRV_SOK) 2 `; g# ~2 G' E4 V
    {
6 U6 S( H: x: m% v6 t6 P            print2arm("edma3 driver init success.",0);: L  D9 {1 A6 s: c- ]/ {! u. d1 D
    } 8 ^" E; t- S* z( i
}: m* k2 P% k+ p

# t, y8 i  s4 g* w' C  d' e% Z
1 c7 y1 P: j4 n& \9 t. @: h9 bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ O* }# V/ b$ A# f* D% S
% z  V, {5 @; E; F4 a8 b! @) t
  _' u& x% Y2 K8 I" Z( m: Z

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47; H( {! T1 V3 k( s0 `# M( D
每次DMA传输完成后都要再次使能传输
% t( m2 G. ~0 i  f0 i! a3 ?5 H
原来是这样,我明天去试试,谢谢了!




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