嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, l2 ~, @$ J2 J( r3 I4 a! S% Y; R#define  PING_PONG_ACNT          1
( x1 J* K/ j3 r4 D1 d4 C+ {#define  PING_PONG_BCNT          8*32*40 : r  i: {* F: b. k
//#define  PING_PONG_BCNT       1
) Q: j9 R- x. }0 _0 r#define  PING_PONG_CCNT          1+ {! @3 k2 L: d4 U2 _7 b' K
#define  MCASP_BASEADDR          0x01D00000+ h5 y. f4 H8 y0 C9 l; ?. Y! Q8 y
#define  Mcasp_RXEVENTQUE        (0u)6 _# \! C& D: z0 I' D7 T

& Q7 y. a+ U; l& R1 [/* OPT Field specific defines */
/ |" F# J6 N* M7 X/ n#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' j: w; n2 |3 G1 J#define OPT_TCC_MASK                        (0x0003F000u)1 q) \7 c+ A+ }8 h* ]
#define OPT_TCC_SHIFT                       (0x0000000Cu)' H5 Z+ S8 R6 b* m* w9 g" h4 ^
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% j5 |5 R+ y% g" G: C# ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ ^, h  M% E" ]/ P* r

( |: n, h* I6 @% j) S- \8 Bchar ping_buffer[PING_PONG_BCNT];- W9 N' b9 r" i
char pong_buffer[PING_PONG_BCNT];  N4 V& O* M* ~6 ~) t
! N$ S: `& V. T: l

4 n) c6 o7 R+ ?0 X8 a. ~' ~# Y5 ?
1 e* a, X$ p% b# P
8 f2 v7 S6 t$ [5 E5 ]  x' bstatic void ys_edma3_init(), A2 Y6 {9 z- K, v" ]
{
7 K* c+ |+ O6 {1 T# o2 R- r( s        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% M; c" O, n5 l* f0 J0 q% C0 R
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ k: s0 u- w3 O8 F% p        EDMA3_DRV_Handle hEdma;
6 d7 }: v/ P' S7 U" a! W    uint32_t chId   = 0;  m( Z* Q' b. S0 a, v1 U
    uint32_t tcc    = 0;8 J, X" K4 A4 L" l
# D  _, `" B4 U' [# _4 x0 i( u
    print2arm("edma3 driver init...",0);9 c6 D/ d6 p; r
+ U- w: |" l0 ^! V$ r5 ?  U
        hEdma = edma3init(0,&result);$ p$ b6 ]/ X- u6 d% Z$ G
        if(hEdma)+ r- I) K2 X8 t5 P' w+ _* J
        {/ K9 B2 n" ^- e
                print2arm("edma3init() Passed.",0);' |: x3 F  P, l% W6 b$ U9 _
        }
3 z( S" p; j4 e/ U2 c( I        else
. g7 k1 Z6 W; L* C0 ]* a        {6 h# r  a+ d1 }
                print2arm("edma3init() Failed.",0);6 ?$ d  \8 ^; {" A) d
        }/ H, j3 _, V# C9 {. n
        6 t6 h: I+ n7 C! s, R
        if (result == EDMA3_DRV_SOK): |6 q3 D+ n* q* I1 u
    {( z& H- w- m5 W' P1 m, ?3 `
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 c; d; `8 F. Q& ?0 O" ?) ^/ _                                                       (EDMA3_RM_EventQueue)0,2 E1 v. r9 R! N8 y9 v# c
                                                            &edma3_isr, NULL);5 h" r9 X6 i9 B% Q: ]- n/ [, }
    }7 s2 h4 O5 Z  S
        8 \* ?) p+ y1 @3 V
        if(result == EDMA3_DRV_SOK)
  g. N- K* a* k8 a4 D        {5 ~4 d8 ]2 o# f2 j  D' A
                paramSet.srcBIdx    = 0;
: O) P% @2 c3 L  W* m. @  |                paramSet.destBIdx   = 1;% K  [9 F$ l7 [  p
                paramSet.srcCIdx    = 0;
4 n4 w2 ?) @9 ^% z/ X                paramSet.destCIdx   = 0;
, d$ l. e4 r% j  z4 c( x                paramSet.aCnt       = PING_PONG_ACNT;
8 V; H. e+ K. J                paramSet.bCnt       = PING_PONG_BCNT;* m' y) K# y" f4 {; z7 T
                paramSet.cCnt       = PING_PONG_CCNT;
- x. \5 l& x  P) j1 q$ l               
- d8 y+ r* N) c( `                /* For AB-synchronized transfers, BCNTRLD is not used. */
& D5 p0 L$ w' d! s                paramSet.bCntReload = PING_PONG_BCNT;  J  K  j" z  F, j
0 _8 Q0 g+ @1 @8 X) v/ z5 o
                /* Src in constant mode Dest in INCR modes */
5 S% ^. A! t; L3 @) r- t8 M0 h                paramSet.opt &= 0xFFFFFFFDu;  Q! d7 ^$ \/ H
                //paramSet.opt &= 0xFFFFFFFCu;  S0 g/ @1 \7 C/ ^2 S5 M9 k; c
               
% O( S. Z- L1 b. H9 x                /* Program the TCC */3 C. S$ ]" L) @
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 T' `! I$ B3 i  ?
& x$ O6 M1 h, {, H' `8 H                /* Enable Intermediate & Final transfer completion interrupt */& @' \  G! q8 m+ V
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 P% e5 P; a4 E5 R- A4 ~9 U                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 M" r! q8 G- v! l. T& N7 d  Y7 P) F9 w8 {5 `
                /* AB Sync Transfer Mode */
" P, X! l! W! H, {. H3 z$ s; [                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% j/ J9 Y4 a/ \( _0 w
                * P1 U7 k# z8 _
                /* Program the source and dest addresses for master DMA channel */
( Z! ?$ Z  q+ T" G$ N                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# k& Q. h1 W6 J& `- [4 i1 ~
                paramSet.destAddr   = (uint32_t)(ping_buffer);4 C% ]# r. W0 y
" Q; c8 v% B7 t  e! O5 ?
                /* Write to the master DMA channel first. */
  A3 L  a+ l( j8 r- o4 @- x2 n                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 ]; H" C. n5 E
    }       7 C9 S+ V# O3 H6 e8 Y2 ?8 l
- b4 ?8 E5 i/ C9 K( T+ O# }
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- S. D$ ~+ P- F1 _* [       
& z7 ^) U- r) H% @: z    if(result == EDMA3_DRV_SOK)   }8 K7 B2 L" A+ H) C! E2 T
    {
2 c# ~& c2 l- \1 N3 [            print2arm("edma3 driver init success.",0);
+ L# E5 I9 f' [1 u    } ( y. f, G# Z, _. x7 F" n
}9 ^6 ?( E' \0 a

, m4 [' n2 m2 C( S3 \
& n! o6 M. @; K8 T/ `/ f. f- {EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 r" N; I2 B7 G% y# a. }

% M5 r. L; C/ I2 f: O
6 Y% f+ c9 V; `" F- _' H
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' }* w2 [% f$ p- a; U1 S! Y6 |
每次DMA传输完成后都要再次使能传输
, A6 A. e9 d8 i) h/ S0 d4 O
原来是这样,我明天去试试,谢谢了!




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