嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' D1 _' r" O; Q#define  PING_PONG_ACNT          15 G4 M. a( v: ^/ \2 y
#define  PING_PONG_BCNT          8*32*40 6 u( @" B9 S4 ]' ]
//#define  PING_PONG_BCNT       1 4 Y: M9 p' d8 z. ^: J
#define  PING_PONG_CCNT          1
/ c: ^0 Y3 _0 k/ e5 d#define  MCASP_BASEADDR          0x01D00000
; i* G9 H7 F/ ]" x; @5 \# C#define  Mcasp_RXEVENTQUE        (0u)
$ n8 o+ A% x% F' }8 F" Y
+ U. I* D0 g9 ]: c) c/* OPT Field specific defines */7 l: \/ ?0 |) r( n* u
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)% u5 U3 |3 _! i) U6 g
#define OPT_TCC_MASK                        (0x0003F000u)
: L- p0 P2 i1 m1 S7 @#define OPT_TCC_SHIFT                       (0x0000000Cu)! z) W: I" k" |3 L3 {2 a
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)* t+ P  ~, t9 m8 [" j, k4 `
#define OPT_TCINTEN_SHIFT                   (0x00000014u); F3 {2 e" w$ ~. W( m

$ Q1 m) r8 z1 b$ v$ V6 E6 x7 g, e  bchar ping_buffer[PING_PONG_BCNT];
% K" T* G1 m# b$ pchar pong_buffer[PING_PONG_BCNT];8 z+ o- c" @+ Q$ f8 X! r, Z7 R2 C1 g

8 F$ a6 c- g! K; M! v/ s9 C. m1 V  G6 L+ N! W! }3 b

& N- a5 p; z+ L+ c1 l7 @+ X5 \2 C: K0 U2 c
static void ys_edma3_init()
8 g- A$ U( f0 @3 M1 ?! d{/ g1 m5 g+ u: M# C2 e. n# f
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 b* r# m- ^1 u# R) |
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; e: G& J) W& m, a! P        EDMA3_DRV_Handle hEdma;" m; f$ {8 b) I$ q2 x) S
    uint32_t chId   = 0;9 @7 w' H7 \7 G5 O- T7 ~3 \
    uint32_t tcc    = 0;
" O. b% i! g; F+ t5 r
0 W, m( T) L" T    print2arm("edma3 driver init...",0);0 i) k* M) L) x8 B$ y: c8 `3 L; R* y/ P3 y

: @" k( T( u# I. @; V        hEdma = edma3init(0,&result);
( r; S) \- M# e  A! i2 {        if(hEdma)
: X6 N& e' Q( o        {
: R6 j  s. v* F                print2arm("edma3init() Passed.",0);0 F9 C$ Q/ K& E4 `4 ]7 k. Q
        }0 @0 O/ K; h. Y' L/ b
        else
/ O/ K: j& B: }- ]4 z  I        {" N1 V1 b; T$ Q: r
                print2arm("edma3init() Failed.",0);% I3 k# \( \2 O% e1 e
        }
* y1 @5 f( ]. Y" g0 x" i1 D) B* r        * d" \6 l0 ]: Q+ o' u9 Q
        if (result == EDMA3_DRV_SOK), n2 D4 W- j  s# p7 ^' o, Y& V
    {
- d8 E7 m$ o" K& w                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
  e1 ?' `0 n, ~/ \* m                                                       (EDMA3_RM_EventQueue)0,/ I% ?$ D8 j4 ?( I4 X5 D
                                                            &edma3_isr, NULL);
8 |# T1 Z6 X6 \    }2 `2 x! y0 s# i7 ?3 Y' b3 T
       
6 y; g7 \/ F- D% B- j        if(result == EDMA3_DRV_SOK)
" l2 b3 S+ c1 o" b% b        {
' N' Y% T, r# z: R' z8 i6 n" Q                paramSet.srcBIdx    = 0;
) G# N3 X, ]5 e                paramSet.destBIdx   = 1;
1 b( Q& V) w" w; x0 h2 Z1 X3 M                paramSet.srcCIdx    = 0;4 @: r) G" i6 v: |. Z+ O
                paramSet.destCIdx   = 0;
( d) i  D( `+ i9 c0 }6 U7 O                paramSet.aCnt       = PING_PONG_ACNT;8 j( B* q! _) P
                paramSet.bCnt       = PING_PONG_BCNT;
% L1 R* ^' P4 H6 |) ^0 y                paramSet.cCnt       = PING_PONG_CCNT;
. t8 V) ]. b. B; e  \               
1 ^' |7 C2 N. b6 c9 j                /* For AB-synchronized transfers, BCNTRLD is not used. */2 R( w2 `: e6 M( Q8 H. q
                paramSet.bCntReload = PING_PONG_BCNT;4 W, m. k. [0 T: U* V9 x( u8 o! M

0 }; j" v# P  v' ^                /* Src in constant mode Dest in INCR modes */
2 p, c3 g* `: `                paramSet.opt &= 0xFFFFFFFDu;; f# m/ K4 J% H: c4 {- M9 a
                //paramSet.opt &= 0xFFFFFFFCu;% W1 m5 D5 \& ?5 w2 K* X) O
               
( Q6 h" ~! Y" R+ ]- h: S                /* Program the TCC */. w/ S3 R' s  {$ l5 U* s
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, K' D. f$ i, J+ U& k; o5 B, m" K7 [  [
                /* Enable Intermediate & Final transfer completion interrupt */4 S8 ?* X9 r& _5 L8 `5 x
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 [. A4 u' c9 W# P1 s! q                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' X* F# `7 }+ x" C2 Z8 }. i6 _! t2 J6 V8 j8 N0 S" m
                /* AB Sync Transfer Mode */
  Y+ I% U+ e" q; j( E0 b                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 N% \5 \  V$ y% d4 {" Y               
+ {, G5 [" c) F8 \- Y, A! ^                /* Program the source and dest addresses for master DMA channel */7 p9 ]# H8 r9 E4 R
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, [8 K7 R8 u3 N8 R8 {  o( P
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( S. @+ I; C1 X8 @4 R- S% h; t) ]* O8 ^6 W
                /* Write to the master DMA channel first. */
; b6 R( k7 p2 m% _                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
7 X6 _2 ^, Q: H* f5 F, |    }       3 A) E& X* t$ V0 u+ [! o; Q
4 E2 z( W# d* o, j7 ]( k
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 c2 F7 C8 Y% i5 g8 s
       
  a; `' C2 Z, V! `    if(result == EDMA3_DRV_SOK)
; ?' m1 L, M' |2 v    {; b/ m& q  ~1 S% p
            print2arm("edma3 driver init success.",0);, {7 M% J( D* ~' ]
    }
  V* c0 ^% ~5 d7 `' x9 @}
& c  W! u/ V. i& V6 g$ v; D1 Q' y$ G- b
6 _7 H, p# g3 u9 u' Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% R5 O4 N$ k$ t6 _  J; u
4 l. G9 P& F, D8 |- ~- w9 T
) x, c( k. u( M7 h

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 `6 B/ ]5 D& U) H6 h% {% v每次DMA传输完成后都要再次使能传输

  q, e- _$ O& o& v+ v原来是这样,我明天去试试,谢谢了!




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