嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 y& k/ [% s; ?
#define  PING_PONG_ACNT          1
& @) U5 `% f& _#define  PING_PONG_BCNT          8*32*40
" _% f  k' i2 t2 K; h//#define  PING_PONG_BCNT       1 ; l, e+ S+ n4 m3 }8 \( ]# @9 I
#define  PING_PONG_CCNT          1
" D9 V* w, U1 {2 A- X#define  MCASP_BASEADDR          0x01D00000$ c2 B# B* B& t# w. _5 X
#define  Mcasp_RXEVENTQUE        (0u)
5 E8 Q0 c1 D2 ?9 G4 x8 {+ @: K; I+ q5 |0 _; Y8 U$ l
/* OPT Field specific defines */+ R9 D) L/ m7 X) k
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. J) y5 m- c' i' R#define OPT_TCC_MASK                        (0x0003F000u)
: \: R5 K1 j* `8 ~#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 [/ u% ~7 [6 s* ~+ n  A  S$ W) g#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 @$ @& ?/ f2 H6 u; {1 ^/ O#define OPT_TCINTEN_SHIFT                   (0x00000014u)3 o/ |$ }, c: }& T8 I: @4 Q

% A5 t9 S* z5 A9 Y) Nchar ping_buffer[PING_PONG_BCNT];
0 h" S1 F! D' Q5 Kchar pong_buffer[PING_PONG_BCNT];
" r$ j- T5 _" M: c/ k; e2 q( B) }) u3 g9 F; r+ F
: `  d; d( g# B

% V  K# `) r8 ]; {/ a/ f8 `; |8 P/ A1 {4 ?4 R% K" N5 s, \
static void ys_edma3_init()( h, R2 `9 ~% F9 C2 {9 d$ F
{2 |1 D, `0 g5 s: W  Y$ M/ @6 c0 P, ~* Y
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};. ^6 q( J! a; y4 I) Y" a7 q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- }8 g! L+ R" S+ p/ }        EDMA3_DRV_Handle hEdma;/ w& n9 h2 k' N' \( M. G0 ]* b
    uint32_t chId   = 0;/ T" w" |1 Y( F) d
    uint32_t tcc    = 0;
! \1 G/ i3 R2 l6 Y# g/ l' F8 T
# z1 `4 R& }8 v& y) i    print2arm("edma3 driver init...",0);/ `. B3 E+ S4 g% Y# N
1 C- w! `5 B9 c% s
        hEdma = edma3init(0,&result);, c' Z; I, h+ E/ E
        if(hEdma)
+ C1 @% c" Q$ O        {
% V. X% y$ v' @* C                print2arm("edma3init() Passed.",0);9 }2 G1 t* _5 B9 j' b" g+ I# {. ?- ?; @
        }* w$ q' O; U7 b# f/ q0 W: b
        else
  T5 H9 s- z* U* q5 f) f        {
/ \4 j2 Z3 a9 b9 x8 W  b                print2arm("edma3init() Failed.",0);- L. y# n; c1 s4 D/ O
        }/ s5 ^% v+ S% I, g! B( z
       
7 P+ G. p* k9 L" y! V        if (result == EDMA3_DRV_SOK)
/ j% d/ [; w( X8 M, o9 @    {/ F7 Y/ S1 e7 o- W
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' J, p. X0 X0 m9 V1 t" j3 ]$ m/ \* v
                                                       (EDMA3_RM_EventQueue)0,$ @( H+ H! n  Z
                                                            &edma3_isr, NULL);
5 W* o& ~( t% E; }  i, M    }
7 p6 T  a6 x; Q9 p- X: j        + x: H# M7 g* [
        if(result == EDMA3_DRV_SOK)
  H' ?; i# o. h/ H2 N7 o        {
. Q* j0 J& E( ?4 ?% n                paramSet.srcBIdx    = 0;* v2 R  @) j3 @: ^8 T
                paramSet.destBIdx   = 1;+ y- r2 [, l  Y- F' g2 i2 [* [
                paramSet.srcCIdx    = 0;8 u$ o- y3 e) g- r, ^
                paramSet.destCIdx   = 0;6 p. w% A& |* Y2 f2 N, Z
                paramSet.aCnt       = PING_PONG_ACNT;
# B1 Z0 z0 \9 R1 N/ A                paramSet.bCnt       = PING_PONG_BCNT;
. J, N- q0 A. j2 H) g6 _                paramSet.cCnt       = PING_PONG_CCNT;
3 p8 S) L4 v' a) `% ^  D               
& w' e1 A+ j. i$ y' T9 M7 k                /* For AB-synchronized transfers, BCNTRLD is not used. */$ K, C% W# q0 V. o& U- ]
                paramSet.bCntReload = PING_PONG_BCNT;% K$ G3 j9 a8 j' R3 d9 ]# f

. W6 w* `; i$ F( k: y! ~                /* Src in constant mode Dest in INCR modes *// L/ D3 ~: S2 Q' }( i& c
                paramSet.opt &= 0xFFFFFFFDu;
) W  N& s5 Z# X* F4 g3 A                //paramSet.opt &= 0xFFFFFFFCu;6 ~# e+ {, a7 q3 _! W7 Q1 V
               
1 U# T# b2 I0 X1 k                /* Program the TCC */% n3 }; ^  y) j2 W7 Z+ F: A' S4 C
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 ]7 r2 D) z+ I# V% _

0 @& O1 d# r/ x2 o                /* Enable Intermediate & Final transfer completion interrupt */: H6 \* K1 }5 D
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ @/ o6 X+ i/ n( |- y, q                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' `5 {) ]7 l: E+ N
0 A+ V7 M% x. R                /* AB Sync Transfer Mode */: T( w0 g$ D; g3 d- b
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% j7 G9 K2 a( e& c/ w/ O
               
- n6 B% H* b0 j8 C- ^# l- o                /* Program the source and dest addresses for master DMA channel */1 [- h, Z4 Y( y  x. k
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" \5 l5 t  M1 [0 z9 J0 S; X! w3 n                paramSet.destAddr   = (uint32_t)(ping_buffer);
) B  D& M; S! u9 Y6 ~& H0 c4 q: R% t: z! x  r+ T4 X8 l7 Y& y* @/ s
                /* Write to the master DMA channel first. */1 B, M1 w& t% P# T
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
6 ^: {# h; S( i0 v    }       ) h/ l6 v. a: J
  Z& b& ]# t/ R
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);  N! K: M; G; k, `# Q- T& E# N$ Z  ^
       
0 J6 @; O+ E8 j1 p  Y    if(result == EDMA3_DRV_SOK)
. q9 @8 t8 ~( h, q1 X    {
& z6 [' g3 T- O% {- J            print2arm("edma3 driver init success.",0);# s: J1 H+ }: t
    }
' R2 b* g/ V& x% c; a0 D}
! a3 `7 o" O' ^  n0 T
2 S8 ]6 s* k# t# ~" }' G2 L8 D2 N. H! k% J3 y  z  \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- I- L3 E1 Q% }6 \8 L' W2 A8 C% c6 ?1 B' T& A

7 o& J, W7 \& z$ j; a; I0 Z
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, g; ^) z. L  i7 _- t
每次DMA传输完成后都要再次使能传输

; }8 q$ K; @7 l$ M8 |原来是这样,我明天去试试,谢谢了!




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