嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 }& @3 ^$ w6 N/ b
#define  PING_PONG_ACNT          1
: b% Y7 v: \* h7 d$ w3 d: q#define  PING_PONG_BCNT          8*32*40
; f0 k& w1 X/ N: R! D) ]//#define  PING_PONG_BCNT       1
. f& H0 _1 T7 l( }2 X' i3 |#define  PING_PONG_CCNT          1
- ~2 v* `9 M, U#define  MCASP_BASEADDR          0x01D00000, r- C- ]! W: T
#define  Mcasp_RXEVENTQUE        (0u)
9 c. X. G; s( L+ ?
' N0 V! C  J8 }8 o/* OPT Field specific defines */
  `# u5 x9 I5 \- C- F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" j8 ]' _6 \# \7 k& d! Q+ X
#define OPT_TCC_MASK                        (0x0003F000u)  ]3 M0 {" `' R# K- y
#define OPT_TCC_SHIFT                       (0x0000000Cu)
/ i$ @4 \; \* |#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
- v& j" t7 H, R3 I/ N4 S#define OPT_TCINTEN_SHIFT                   (0x00000014u)
5 l! [4 R2 \- Z+ [. V+ W. A7 X* j' ?9 a) t; {. A( r
char ping_buffer[PING_PONG_BCNT];, {# Z' R) n9 ]! U' G" [
char pong_buffer[PING_PONG_BCNT];
3 L. H* t6 c, \5 f/ k' K5 D- _
- e" v" i0 ^0 |9 H4 S0 Z' Z, C6 k; C* u

$ Z7 y' G3 Y1 D8 D4 t
6 g5 A' y# _/ `' B- hstatic void ys_edma3_init()
0 p4 ~2 E" L( m' n{
9 T3 M# [) p0 p$ V# s! c        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- I* U/ v. v& x; B$ F) M1 y        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 k. _$ ?; ^3 Y# v2 K7 A        EDMA3_DRV_Handle hEdma;
2 N# r' N4 u& U5 @0 U/ ^( l# W# X- ?    uint32_t chId   = 0;
/ H) K6 d' O- F    uint32_t tcc    = 0;
. Q, i$ i/ Y" K. N1 M3 W9 O: i
# Z* d: M1 @+ ]  l" d    print2arm("edma3 driver init...",0);
4 i/ W9 L; A  ^+ N5 }
, O% ?+ C3 E6 a4 j) {# J        hEdma = edma3init(0,&result);! I+ n# W( C& w5 M, y$ O
        if(hEdma)
3 D# E$ Q$ r/ M  @        {
9 i) H0 j3 `& j4 `5 C                print2arm("edma3init() Passed.",0);
" T+ p* l) G& N3 U9 V        }! g; F4 @5 i$ H% e, d  N9 s
        else
+ M+ R7 A2 }. q8 ]. U$ X$ n. x        {
( F& h2 a' K. v0 H                print2arm("edma3init() Failed.",0);
/ K3 J1 x1 R) _: j6 i& E0 R        }# L/ X) v( ?( A+ m; `; z2 ?
        0 G5 {! v) \3 k) i. W0 m. C
        if (result == EDMA3_DRV_SOK)& j+ N" B5 J* E
    {
: U! m4 P9 y$ K" u9 T                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" B; H6 c; B6 ^$ Z- X                                                       (EDMA3_RM_EventQueue)0,
2 M" K* g* U; _0 W8 \$ @                                                            &edma3_isr, NULL);
6 ~% s% G/ D0 f, L6 h    }
# Y* y: o# g: \# s  f+ v: `        ' ^3 }( H3 p; |: x" v4 O7 C
        if(result == EDMA3_DRV_SOK)
. e1 U, _$ Q  U  K1 C# ~" L        {6 o% ?  Y' [% {) i" N7 q& G. X
                paramSet.srcBIdx    = 0;
/ T$ C* q6 j% e% j( b                paramSet.destBIdx   = 1;$ ]* L) a* o+ _% _
                paramSet.srcCIdx    = 0;
% w6 _6 C1 M, ]5 P: P                paramSet.destCIdx   = 0;
; u. O3 n* Z0 x: U                paramSet.aCnt       = PING_PONG_ACNT;
+ G! A. [( [( q: C" @                paramSet.bCnt       = PING_PONG_BCNT;! ]6 H. L: a  ]; w, e
                paramSet.cCnt       = PING_PONG_CCNT;. x+ w% _% \0 ^/ @% P4 k7 t2 V8 T
               
4 }4 a2 F. g% s  c/ k1 B- E                /* For AB-synchronized transfers, BCNTRLD is not used. */& c2 S% s! \; r( N' O
                paramSet.bCntReload = PING_PONG_BCNT;8 }; @8 Y: S# d- Q6 k0 H

9 D. F9 \0 z7 @: L/ d                /* Src in constant mode Dest in INCR modes */. ?  [: M5 a  J2 Q
                paramSet.opt &= 0xFFFFFFFDu;4 a+ A* T- n( j
                //paramSet.opt &= 0xFFFFFFFCu;8 O# {' \4 a6 B. F$ t
                % q2 D. V1 F" [/ |
                /* Program the TCC */
$ A* g' |$ a. ]+ m- j- S- G" K                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" v6 o% p% s; v6 f/ `3 s. l, ^; R# w: t8 E% G4 C9 b4 w+ `
                /* Enable Intermediate & Final transfer completion interrupt */. d0 a; c9 @8 Q1 \
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 m$ z; k% t: f
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& y# a: }( r5 T; p" T7 v
# B: v& c6 s; S) f4 n, P8 |  ~, e* c
                /* AB Sync Transfer Mode */* [- m1 I7 q; c/ q& {9 f
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ k) g4 D6 J# U                0 V: {0 H, W& Q5 X4 Z" f
                /* Program the source and dest addresses for master DMA channel */2 q$ m$ @9 N1 r+ Q
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
4 g. y$ ^! _: F- Q2 @/ L) x  T                paramSet.destAddr   = (uint32_t)(ping_buffer);* }1 g$ v% `, ?$ K

9 R+ }7 f6 c! @5 s9 _$ e$ P                /* Write to the master DMA channel first. */
" x: V) F& f8 Y" C/ u4 A                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ `6 V  g: C$ K1 Z
    }         ?, W& K( f0 }+ u, _
/ ]8 y$ e4 x+ y: o% Q4 a& k
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 O; o- A4 ^' f       
' }2 J0 e& s+ V- A    if(result == EDMA3_DRV_SOK)
5 _# v; T9 k! T, j8 C    {7 u# _  E2 S1 r1 p$ k+ G$ G% r# z
            print2arm("edma3 driver init success.",0);) ]9 R0 @+ G/ u- X% ?
    }
! _* X$ d( j+ r( ]7 e}' `) t1 {# r, w) I6 z+ Y" }

, A- x8 v& U1 ^  S
# C) T4 E' G) LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) n9 O' L$ {8 u$ W$ t1 c

7 b, f/ R; `/ s# ^0 C9 E8 [: n, W0 N7 C# |; g6 M

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; Q+ I$ R2 U+ G0 X* v每次DMA传输完成后都要再次使能传输
! S: g$ z% S+ v: a
原来是这样,我明天去试试,谢谢了!




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