嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:/ f' e3 U" g  W7 Z$ H$ y
#define  PING_PONG_ACNT          16 |# T, _. \# @0 Y& t
#define  PING_PONG_BCNT          8*32*40
& g+ x2 |! G3 m, u% O3 e//#define  PING_PONG_BCNT       1 ; X5 d5 m6 R9 g3 u4 w
#define  PING_PONG_CCNT          1, X8 d) j4 K4 w" r1 w; N2 T. t
#define  MCASP_BASEADDR          0x01D000009 I  _0 U! W4 o/ D
#define  Mcasp_RXEVENTQUE        (0u); {" w& @( b+ \6 j6 O+ ?& x! a
% e2 a% Q5 ]" i2 i  e$ P
/* OPT Field specific defines */
6 o5 h% d4 K$ Y. W% U7 T#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" V5 d2 ]6 a& C* n
#define OPT_TCC_MASK                        (0x0003F000u)0 K% y, R8 x- h' U3 V' r
#define OPT_TCC_SHIFT                       (0x0000000Cu)
/ M6 a  ~- R6 P0 \; d#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" x! I5 }; y$ Z4 y
#define OPT_TCINTEN_SHIFT                   (0x00000014u)( f# I8 C9 H# t# d! J" g; J
! J" u& n; i- R2 w6 o" z: y) {0 R
char ping_buffer[PING_PONG_BCNT];
# N9 H% E2 _8 J9 Pchar pong_buffer[PING_PONG_BCNT];# f5 C8 W- ]9 f- c; R  C) ~- n5 E

$ \3 f* _& |% O. h. X6 T9 {, E7 f$ f; R% f0 ~" _# N1 G, I! o  h& T3 A6 @
, `5 M( ~0 w6 Y" k# s5 A% X. p
7 I) h, n" ~. e: q5 j& I/ V4 Y
static void ys_edma3_init()  n! u% `) E) U$ q5 D2 f# L/ Y* B
{
% `0 ?9 n  I1 H) k* J0 m2 _+ q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( s/ ~# x# p. J( e' O& [
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! N9 z) z1 N& C8 M        EDMA3_DRV_Handle hEdma;6 R1 C1 F7 S. ~. P+ N; U8 U
    uint32_t chId   = 0;( k2 W* C8 h, D7 P3 [0 ^& \
    uint32_t tcc    = 0;: `% @# J' y) Z+ l4 ~

: b) I6 S% k7 w1 Y% X    print2arm("edma3 driver init...",0);
/ E, y& w) }& K( h
, ~# J7 i8 [  c; X        hEdma = edma3init(0,&result);: L% o9 O, S5 Q1 L# V
        if(hEdma)+ S: A5 t, O3 V% I
        {* X  V& l# J% z8 w+ S" _3 O
                print2arm("edma3init() Passed.",0);" K2 T( \4 o1 |! o
        }
  m! u/ k& S4 U* V/ }, R        else  u, f9 A6 K4 [3 [1 K' c
        {. Q8 W" z" o% g9 q* H) l' H
                print2arm("edma3init() Failed.",0);
3 Q% u. w2 f! h9 f* X. N7 W. e        }
$ ^& y- W5 N) J; D% G# c: b+ S       
6 a& u. J6 g! G4 s        if (result == EDMA3_DRV_SOK)* k0 t) l- U1 r3 w
    {0 k- F6 m- p* u
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# K9 c, }1 P. A7 V5 O/ E$ u
                                                       (EDMA3_RM_EventQueue)0,
# S0 K" P+ n( x2 w6 _+ C                                                            &edma3_isr, NULL);
) [: X! N0 }" D$ n    }  M3 N0 X! w8 V* D5 y
        ( _$ B! Q7 T# l6 q" G, n
        if(result == EDMA3_DRV_SOK)
4 a0 h4 H& {) \        {( a7 l( }/ Q' d/ l8 ]' Q
                paramSet.srcBIdx    = 0;1 T9 B' T+ d6 a* X: L
                paramSet.destBIdx   = 1;/ w9 v" [! `/ S. A: P
                paramSet.srcCIdx    = 0;
9 V) k8 D8 m- ^9 R0 ~. }                paramSet.destCIdx   = 0;# s% y  d) @0 W; v
                paramSet.aCnt       = PING_PONG_ACNT;
; m% X9 K; r$ Y+ G7 {6 m                paramSet.bCnt       = PING_PONG_BCNT;
; x4 f6 t- H" ]7 p2 K. W# h                paramSet.cCnt       = PING_PONG_CCNT;
3 ?9 }" l& A% A3 d                ! _) j* k" W* q( O# T  t; E# Y; a
                /* For AB-synchronized transfers, BCNTRLD is not used. */# I# I0 U5 h' e0 R: C
                paramSet.bCntReload = PING_PONG_BCNT;4 k- p0 |1 P* K: ~# }, i7 d  N

7 S; n$ A  Q. o" h+ X5 |9 j3 w                /* Src in constant mode Dest in INCR modes */
+ c+ ?4 f- Q9 o7 v                paramSet.opt &= 0xFFFFFFFDu;+ G0 ~, b6 \* M/ ]
                //paramSet.opt &= 0xFFFFFFFCu;
' X/ _3 J/ W7 N# Y: a               
' e5 B3 {' `0 x0 s% F; L) s/ m) t                /* Program the TCC */( M) U8 z0 _  x# y
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 g8 j4 L/ h5 I( f1 p2 K; j, E, s! T, z! }* k+ P* r$ a( o0 f# u
                /* Enable Intermediate & Final transfer completion interrupt */
7 F* y5 J: r2 b- j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 V% a  I$ z, ]# ?1 A                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 O' Y3 d% f& C5 v" W  @* E' ?+ _
0 [' l1 a9 a1 R) ]/ S                /* AB Sync Transfer Mode */8 h: `3 X9 ?. S! Q& @' i
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; C' T3 B8 N- f1 \, o$ {                ' r$ ^; G# s) X  r4 R9 Y
                /* Program the source and dest addresses for master DMA channel */
. T' G$ X- F9 i: [: A9 Q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ ]" u/ G8 L9 S- P, I
                paramSet.destAddr   = (uint32_t)(ping_buffer);) F% J* w, _6 `0 g; D' s

9 c5 W# P6 i' w                /* Write to the master DMA channel first. */; @2 l1 N; y: d' c9 u" W; B
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);  A* `4 R: ~# ^! p% Q$ E+ ^
    }      
6 i; `+ ^7 I* H
" y3 @0 t0 o- g# Z0 `/ @9 H        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 I3 W8 ^8 l9 G
        : v/ M; f/ s% u* I- h6 y) }9 l
    if(result == EDMA3_DRV_SOK)
4 Q  H7 o$ p3 _! M$ I    {
: I6 B. S) \. c            print2arm("edma3 driver init success.",0);% d9 d. r6 E0 `7 h' d0 f8 f: }
    } 9 d* Q5 d5 O) Z, \0 P: J! J
}
- @" Z( V# [  t, \9 u5 G8 M# W7 C
' N2 p5 Z# z" W- l& t0 X
4 w) Q3 V# ^( I* l5 s& {) d7 N0 AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 V5 u- T- ^+ {% ?
: e" t, [) o# p) {% S# U# \% ^
' Y/ S) ]( k) C) E: A
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ i( Q, b8 h8 A+ ~9 b9 L. ?4 h
每次DMA传输完成后都要再次使能传输
# P# ]6 }% Q: E) m4 }! x" n& {
原来是这样,我明天去试试,谢谢了!




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