嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 L* U" g* U7 u. ~1 ~#define  PING_PONG_ACNT          1: ]5 |- K5 [0 u3 I0 S
#define  PING_PONG_BCNT          8*32*40 % Z; t# S+ @! o& r0 h" i& p3 M
//#define  PING_PONG_BCNT       1
( P' ]8 L8 x! G#define  PING_PONG_CCNT          1
9 _5 P" k) ^0 d) s" p9 O#define  MCASP_BASEADDR          0x01D000009 s7 R" R( O" j6 J5 Z# j% j
#define  Mcasp_RXEVENTQUE        (0u)
: X' {) |9 G! m0 `' \" N4 H# `. Z7 Q3 I) E2 }) ^
/* OPT Field specific defines */$ {, _* H$ p# S1 k: Q
#define OPT_SYNCDIM_SHIFT                   (0x00000002u), j! g7 X$ w: a, S( C  z0 W
#define OPT_TCC_MASK                        (0x0003F000u)
6 S4 H  u) z; E  ?) s; T#define OPT_TCC_SHIFT                       (0x0000000Cu)4 P. k" y% @% J8 o0 [* Y4 @
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 q3 _  G( ?% s6 Y) O/ F& e! M
#define OPT_TCINTEN_SHIFT                   (0x00000014u)  ?. m* R9 Y# q- n+ a7 `( D5 L

' O! @# A1 n9 k/ O7 o! ?1 ~- Qchar ping_buffer[PING_PONG_BCNT];
1 q2 M/ p/ H8 w+ u# bchar pong_buffer[PING_PONG_BCNT];
+ r# C9 f: V' V$ q
* Z8 u. p6 C0 R, q( d
  x- f) h7 x) z! r6 W2 |" {1 ~9 q  R; a
" D$ Z$ m5 ?2 ]( k$ |& j
static void ys_edma3_init()( ~$ V9 P! k/ Y
{
* K5 Q# Y/ n& D/ h2 Q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};+ }7 T3 R7 D- s4 D
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 ~; N0 x; t* S% F- D8 Y: V/ Z: x2 s1 }2 \        EDMA3_DRV_Handle hEdma;
5 t& ]0 q1 r% k1 V  e' _5 ^    uint32_t chId   = 0;
$ h: o0 n& V5 @* K    uint32_t tcc    = 0;+ T; \* l6 L' A2 J0 k
( {) j+ g$ J3 P! g9 ~
    print2arm("edma3 driver init...",0);8 X" l; Z4 e- F
' O9 N0 o7 m4 z3 Y' ]1 h  G
        hEdma = edma3init(0,&result);
7 X+ b; q% _* [2 }$ j( T* D        if(hEdma)& y/ q5 r# J* L
        {1 o. x% [3 D" J! N
                print2arm("edma3init() Passed.",0);$ J* s- }' T+ I1 }
        }! r) B% X7 u7 f7 A1 Y! W  f# H* X' }" a
        else2 ?1 ]5 C0 I6 ]& R
        {
% T/ f9 g- W( q, S' u                print2arm("edma3init() Failed.",0);' N- x: b+ `) N. k# W' ^
        }
' c2 O' X/ R3 {       
. O/ @) x7 c! s+ w/ Y        if (result == EDMA3_DRV_SOK)
3 f" m( l# k9 `8 Q8 [4 u, Y    {* B, r8 K  ^( N" u( I/ A  g2 l. ?
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! ]% ]7 B6 j+ k5 a  [; {
                                                       (EDMA3_RM_EventQueue)0,3 _# ]' q, z4 F0 {& l, t9 K9 {
                                                            &edma3_isr, NULL);4 ^2 @9 P$ U7 X
    }
5 A1 V3 d! i. w3 L  o6 {( n/ [        + P% G+ m' x4 Y3 f% l
        if(result == EDMA3_DRV_SOK)
7 V! T" @& F" M; P# m        {( m. _/ t' T% P
                paramSet.srcBIdx    = 0;+ ]- u9 H- \  `. z& r. B
                paramSet.destBIdx   = 1;
7 C$ F% S  n1 {. ]2 d2 N" O, ^                paramSet.srcCIdx    = 0;
3 o# N1 M# a9 K9 ^6 B' T                paramSet.destCIdx   = 0;
& y  l$ [6 e* K; l6 G* O                paramSet.aCnt       = PING_PONG_ACNT;: A+ }/ \8 N9 L% Y& M: a0 A
                paramSet.bCnt       = PING_PONG_BCNT;) v5 y0 ~  W: j" f7 @3 K0 W
                paramSet.cCnt       = PING_PONG_CCNT;
3 U8 p' k+ r# ]  n! s! D                3 @1 a5 |" \! \+ q( u4 ~$ ~
                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 r* R3 l3 E$ Y8 D$ G                paramSet.bCntReload = PING_PONG_BCNT;
1 @% S8 T) Q- S, W4 i# n
% q$ e, y! z% K: P! n( q8 S                /* Src in constant mode Dest in INCR modes */; D+ [0 F9 B. g  S  ~# {" x
                paramSet.opt &= 0xFFFFFFFDu;* q1 Q% w: x9 F7 l, \
                //paramSet.opt &= 0xFFFFFFFCu;
3 M2 n! a' w$ t# ^               
: {( T# }; O8 ]! N                /* Program the TCC */
1 L, t0 K+ D0 }# @. G                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ x1 j) b1 C2 b7 z- Y3 w, k2 E4 C! M! H& z. ]- f3 Q1 l
                /* Enable Intermediate & Final transfer completion interrupt *// `: Y9 n* r2 i  U$ y( k: _
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);4 U3 P' u, R$ r5 s
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; Y1 u2 `+ r3 g4 A4 g. a" X5 }+ h5 ~  W4 T: t7 G# E: s
                /* AB Sync Transfer Mode */" g9 \7 @6 L# K0 Y- Z& c( J7 Y& H
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* H9 u0 X: I& R
               
* L' U% V+ [! m0 B  \                /* Program the source and dest addresses for master DMA channel */4 u' s# t- N  _: C. o+ [
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- t2 X. ^& @  k2 h
                paramSet.destAddr   = (uint32_t)(ping_buffer);/ o# F, S" e* C" `2 Z# |
# F' \0 q* F" `% U4 D2 |4 P% b
                /* Write to the master DMA channel first. */% f5 k# M" B1 S
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);# ^8 b8 M2 Z' X0 G
    }       ' t# D% v* J7 X! k6 @1 j
0 A9 R* K4 @0 Y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 r+ T3 z, A) z8 }$ u! ^! i
        , l# U( C3 b4 N# c: P
    if(result == EDMA3_DRV_SOK) + M/ t3 S; J$ N- s7 P
    {/ \6 K" K/ d6 J9 K* \+ N, m2 ^
            print2arm("edma3 driver init success.",0);& O; {* A5 D/ e, h% r2 L
    } 5 {" D# [; r# p% |" w% L
}
- ^6 }$ }* p1 A" }4 J0 \  B1 K4 {- C7 N' b

/ W0 C) c& p2 ^! k) l: i* w8 eEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 k/ r. \: U4 d9 G7 S3 ?3 x: c
( k2 ]6 v2 t0 H# @2 v$ T6 t5 w5 C5 K, j/ }% f

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; D' w4 \7 z  ?* b5 D! }每次DMA传输完成后都要再次使能传输
/ U( }* \5 U+ b; v
原来是这样,我明天去试试,谢谢了!




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