嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 l, y+ p- `$ C0 C$ D
#define  PING_PONG_ACNT          18 I( b6 q) A3 u" Q4 }
#define  PING_PONG_BCNT          8*32*40
! I8 ?- l3 D* v, E//#define  PING_PONG_BCNT       1
& }* J5 j  g5 z  Q8 i( u1 F; h' B#define  PING_PONG_CCNT          1) E- G+ n. `  `: Q' S
#define  MCASP_BASEADDR          0x01D00000
; z# n1 j8 I! a( [  ?& o( ^& |#define  Mcasp_RXEVENTQUE        (0u)! L6 ~! ~4 A  r. v# l

; N/ E7 m' m7 D) S! t3 A/* OPT Field specific defines */4 P" W; h* W) Q$ Y, L' R$ j
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
: L. a' N' i0 T+ x' ~$ o$ f  N#define OPT_TCC_MASK                        (0x0003F000u). x* \) p8 ^# H8 m
#define OPT_TCC_SHIFT                       (0x0000000Cu)0 w5 s+ n& Y( \; Z' l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. s0 A% ^! K% ]# B/ ?2 O3 E: j#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ m( p/ ~0 v# F; u! n+ {6 G
& K- [9 ~) n1 n2 i! vchar ping_buffer[PING_PONG_BCNT];
% Q" u3 j! Y% Q$ n; X* @char pong_buffer[PING_PONG_BCNT];
) i8 a; z& y# x, j! X% N. u6 t' I/ L; l+ ]3 K7 w) n/ Z8 u1 z
4 A' Z& U% D6 u' R4 ]

! C* Y- ]2 Y( L4 d7 u1 O9 y$ d+ N
# [! U+ W' S" I$ rstatic void ys_edma3_init()# P: R% S( L* G9 ^) E
{& l$ x* E3 o: f
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ i5 W7 i' r8 R        EDMA3_DRV_Result result = EDMA3_DRV_SOK;. ]- `2 [5 t4 j6 M( b. a8 ^& G
        EDMA3_DRV_Handle hEdma;) ~( c/ U# p8 @# D, V( {; V) q+ Y
    uint32_t chId   = 0;6 y0 M5 F" y- ^& ^+ M
    uint32_t tcc    = 0;
9 ?6 U. r$ T0 t- @
& J' R/ O* ~  S    print2arm("edma3 driver init...",0);
2 Q$ v/ T0 c6 _) W8 P6 x$ e$ e( j- ^
$ N5 g$ E8 W& m        hEdma = edma3init(0,&result);
; r! A% m( W$ h4 \6 A) {        if(hEdma)# M0 \- X$ e# x/ G5 D2 r7 r
        {
, I! j1 ~# ]2 H" e. n. M                print2arm("edma3init() Passed.",0);0 n5 Y+ F0 B. V1 m! Q
        }+ Z2 m7 ~" c, P! e4 J- u; e
        else6 y" I# w9 A. B
        {
! x1 R3 L8 ?: D: _/ J, O                print2arm("edma3init() Failed.",0);) x* ~" v. w9 h, I/ x, W
        }, D' @( r" ~4 M3 |7 z
        9 t) S7 ]6 w! h" f
        if (result == EDMA3_DRV_SOK)3 k/ F$ n& d3 I4 i: O1 T
    {
8 c! a  q, g# [$ ]- A# K" C/ X                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 G9 k/ @; y& I$ n% l( q2 w
                                                       (EDMA3_RM_EventQueue)0,3 r5 K, ~* p$ n
                                                            &edma3_isr, NULL);
8 X9 u' f% b6 T    }
- [( j- n, v6 m       
  d$ o2 E" L2 Q0 V3 I6 N0 z2 u( K        if(result == EDMA3_DRV_SOK)2 l# x& _; q6 Z3 N# _, s
        {9 C' @) G7 C3 o9 I$ F( ]
                paramSet.srcBIdx    = 0;* U- K* V# D/ x( r' L1 I! s: i) z
                paramSet.destBIdx   = 1;1 n( K' ~7 M; @7 q0 m
                paramSet.srcCIdx    = 0;- K( @$ d% J7 d+ u2 b% V1 \2 R0 J& H' S
                paramSet.destCIdx   = 0;8 p7 @& Y3 e* o" A( H
                paramSet.aCnt       = PING_PONG_ACNT;3 d! C: x6 |. a+ y
                paramSet.bCnt       = PING_PONG_BCNT;
. A: _* q! r. E8 p                paramSet.cCnt       = PING_PONG_CCNT;
4 X! @$ j6 a( m, s4 Z" E7 \                1 d) W2 F' o0 d3 M6 G$ L% B1 H
                /* For AB-synchronized transfers, BCNTRLD is not used. */
. l+ Y7 @% L9 x9 _4 w, m                paramSet.bCntReload = PING_PONG_BCNT;9 O4 Y% l1 z$ D& _4 P2 o& |

  m: [+ Z9 G; i, ?                /* Src in constant mode Dest in INCR modes */; a7 i$ f8 j/ M  D. j# b
                paramSet.opt &= 0xFFFFFFFDu;9 G8 c9 K8 E' c* L
                //paramSet.opt &= 0xFFFFFFFCu;4 r! h! ^; K$ n3 h
               
" J2 E* ~1 g+ ^' C3 w                /* Program the TCC */
% O  k3 n% E- G( {$ g                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ J5 K5 \1 N. F4 y! L8 x( A8 }1 n0 j! t+ n3 f: f; d5 L
                /* Enable Intermediate & Final transfer completion interrupt */
% |/ C  F5 H0 i                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 m9 Z% E' _* h* c
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) }" p. d4 q( |2 f9 `4 U+ Z; {

( f) r, a( t+ t! B- h                /* AB Sync Transfer Mode *// \. b* I, j( Q" N' m8 B  A, W4 r) ?+ I
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ X7 e2 y5 ~! m' ?1 [0 ~
               
% Q- H+ _* r3 z2 i: i                /* Program the source and dest addresses for master DMA channel */4 H7 E! Z& _$ x, Z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 F) Y, |" o! g- m5 B                paramSet.destAddr   = (uint32_t)(ping_buffer);
, D9 b+ L8 r  h/ r- {6 Q9 P4 }7 ?& S' F! [0 X2 u/ {  ?7 K# i
                /* Write to the master DMA channel first. */1 Q( d- |8 a9 u; J
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ B) D5 G$ {+ a  Q: Z" x
    }       # @* v  K9 u8 T7 T% o0 [3 v2 R
4 s( ?3 r* ?5 K. U) n& R5 s
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# b% l; E; a' B5 E
       
# y+ v# `5 F3 j) i# Z  r    if(result == EDMA3_DRV_SOK)
3 R/ i2 l& {( c" N9 g' E" o    {
% c4 r7 v  Z' Y            print2arm("edma3 driver init success.",0);( p' J/ |/ X: [; G8 q, E) |2 A& `
    } + A. D5 y6 D, G- C" M
}
9 q) S- b  M- K5 P) ?& ~/ v
8 P, n, i9 \( \4 z! q& Y% G* u, o6 P1 w) k9 O) {5 G8 f
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 k7 N- R, U( }9 K9 l

- [9 b! _6 f) d# d) D
* ?6 @' d' \. O7 [4 G
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) V% V8 I3 H  l0 P7 J每次DMA传输完成后都要再次使能传输

/ N) A1 c% h; {" A原来是这样,我明天去试试,谢谢了!




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