嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 d+ N4 G9 @6 N* j: W# ^1 r8 [+ B. ?
#define  PING_PONG_ACNT          1
7 k! m3 w5 B' C; X9 q#define  PING_PONG_BCNT          8*32*40
" O5 `# I$ h, }+ @' ?- v' }: L6 U//#define  PING_PONG_BCNT       1 5 x8 R# B$ q: {  z
#define  PING_PONG_CCNT          1
# I( _8 a* O; \- ^- L#define  MCASP_BASEADDR          0x01D00000/ v" c8 ^+ k" K5 H. e% v) [
#define  Mcasp_RXEVENTQUE        (0u)
0 ^. \4 x. Z) h: O" B' f
4 D* v: S9 G1 G' F' Z/* OPT Field specific defines */. P) Y* a+ P6 L3 [6 L! P4 }! Y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# C! C  a/ V5 M2 {/ J
#define OPT_TCC_MASK                        (0x0003F000u)
9 W' J" E* v# r% d5 ]+ ?2 f#define OPT_TCC_SHIFT                       (0x0000000Cu)
. E+ e/ Y6 H( t" V#define OPT_ITCINTEN_SHIFT                  (0x00000015u); M; F8 ]# ^2 V" Q
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
. V3 A8 D, V: |1 G8 x& c: ~6 l6 \+ @5 W# N
char ping_buffer[PING_PONG_BCNT];
  j6 i, p+ ^6 J2 Dchar pong_buffer[PING_PONG_BCNT];
9 I) C* C' p! e% w# T/ v' [8 `7 ?5 S5 f0 R
( S" @! u4 z1 B5 S. T5 y

# G7 X6 R8 }8 S" {$ O' m6 p# Y. B* ^1 }% l9 W1 k3 P! j& }% K/ t
static void ys_edma3_init(): y2 C/ [' u( L4 l9 \0 R
{7 R9 L/ Z+ G# \- k1 y  ]) Y: M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ V+ Z, Q( j/ u7 ^: t: H        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* u4 r5 Y6 h0 }+ T  u7 v. e        EDMA3_DRV_Handle hEdma;
; B3 p+ F/ ^1 y4 N! I' R  O    uint32_t chId   = 0;
" D; ^, @1 T7 Y    uint32_t tcc    = 0;3 {& o. |& P/ C4 p

! I4 C# m! v2 E- T0 V    print2arm("edma3 driver init...",0);
6 W* d! E* N( r; g, e
) r- N* d% O) K# E3 Z        hEdma = edma3init(0,&result);
! G  n/ v" m& d: j/ z% i5 `" v        if(hEdma)
1 C  {* F3 }% @* k% y% z        {
, A' {+ ]9 z  N8 C( e7 \7 W                print2arm("edma3init() Passed.",0);
1 E* E  \1 W3 q3 [        }
! {9 W; r) S5 f) v0 h        else7 \8 J6 ~7 B& n% M6 j) r; w
        {
( T( a# ?8 o* D0 x$ C                print2arm("edma3init() Failed.",0);) \" d9 ?9 e  C% t+ c& O
        }
. L) _2 f8 z9 |2 N7 r, P        ) T! o: K; H$ Z8 K
        if (result == EDMA3_DRV_SOK)+ {9 x, b3 |& I7 @4 A
    {
+ u& l1 N, P0 k+ J) W9 F, I$ f                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( d5 [1 F5 b  h& `# |. D                                                       (EDMA3_RM_EventQueue)0,
4 F% }# r" \* j7 @! x  y  n) Y9 e                                                            &edma3_isr, NULL);
) M9 |6 w6 _4 c2 p/ ?    }9 D4 V4 P; f- }; G8 \
        & ~, v5 t. C  }% i2 p
        if(result == EDMA3_DRV_SOK)& J% B3 V# j1 Q- O2 n& e$ j
        {  x* j; e" Z; C  q, N' v: W
                paramSet.srcBIdx    = 0;
2 R7 h5 c% C- Q3 U" ^                paramSet.destBIdx   = 1;
. h+ k& f. H% A4 L% |& P                paramSet.srcCIdx    = 0;* a  i% ?" W: V3 ]' P" N5 x5 E! D) ~
                paramSet.destCIdx   = 0;
" y& P8 f, W- c                paramSet.aCnt       = PING_PONG_ACNT;
* R( g7 a, _& g2 q4 w/ q" Q                paramSet.bCnt       = PING_PONG_BCNT;
) N- `; h/ p" t/ ]- V# s1 w                paramSet.cCnt       = PING_PONG_CCNT;
1 G# o  f% Z( k8 L8 p                4 c. L* n4 y& ~; |3 s- q' ~
                /* For AB-synchronized transfers, BCNTRLD is not used. *// T8 b. W) C7 U" k. H9 S
                paramSet.bCntReload = PING_PONG_BCNT;
9 V/ J- T: Q3 [7 r4 r
0 \! j) P4 |$ ]0 f                /* Src in constant mode Dest in INCR modes */  D. S0 c! f: N9 s4 ]
                paramSet.opt &= 0xFFFFFFFDu;
5 ?4 G5 Q4 Q& w3 Q2 y$ o                //paramSet.opt &= 0xFFFFFFFCu;
+ ^, D# o% c/ R9 U1 I4 N5 k  @% R4 i                & {4 m; f# o  X5 W# H6 {
                /* Program the TCC */
' \, u% \! x/ R/ v8 P' L                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- V3 c  x/ n4 L/ j" `
# ?8 d2 c0 h) `; S' t1 L' m
                /* Enable Intermediate & Final transfer completion interrupt */
# `9 ?! s( B- i8 F3 j+ k                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- F: x$ x% [! Y  Q
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 {% I6 j1 j7 g- ]3 m" \) S1 c

$ U( X* e2 A* f- ?! p. J                /* AB Sync Transfer Mode */
5 T. X: \* N% V8 l                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 q# s% B5 q  U$ l
               
" U) [/ f! A) `7 J! W2 Z                /* Program the source and dest addresses for master DMA channel */) \% B; G- q) ?, M& Y
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 y* S  s7 }" R7 l/ U, D                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 b2 i5 i0 p) V! z9 m" Y9 d  n* K/ v$ e! x9 ~( g. {$ ^' g
                /* Write to the master DMA channel first. */
$ D5 `& |* o3 l: T- \6 }2 w+ i                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
( r% h2 f0 _0 e6 g    }       $ P7 C1 k1 f4 Y5 \7 W: r
  x; u& D8 O" P9 ~6 S7 z* J
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ |5 g& F! D! F% ~0 A
       
* n  U% M# R# I4 @: s' E    if(result == EDMA3_DRV_SOK) 1 J+ @* e: `: m% N! \0 A! e
    {+ L/ @! S4 P2 [6 p: c( Z4 }: p
            print2arm("edma3 driver init success.",0);2 j" c: K  O( d$ h" I) x- T
    }
8 J; L" P2 s1 |# y0 C  D' I) z2 V}' K' G( `4 p# R! i/ @

+ R1 V: X$ T5 {7 O8 S* F& Q
% L( ~& U' U# BEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L) `% ?# w9 b/ U; p* S1 G4 I# k$ |7 f2 p) H# o

" F, R* G8 B8 D5 p& [% y; g9 A
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 G1 A, P" T+ H- I) a
每次DMA传输完成后都要再次使能传输
2 u" Q' ~& A! o, _& ]
原来是这样,我明天去试试,谢谢了!




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