嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. ^0 D  D$ _, |#define  PING_PONG_ACNT          15 w' j# W* b8 m" C' @4 a+ ]9 ]( A2 G
#define  PING_PONG_BCNT          8*32*40 $ O2 P6 q1 t) U. o- A  Z" C
//#define  PING_PONG_BCNT       1   }7 W. l5 \+ Q% x  y( x
#define  PING_PONG_CCNT          1( Y3 r( u/ S; ?1 }/ I' A
#define  MCASP_BASEADDR          0x01D00000
( c9 o$ g6 |+ h: j4 c' |6 `2 E#define  Mcasp_RXEVENTQUE        (0u)
$ i3 y0 M# o+ b" V' f  t( T9 [7 r7 r9 N
/* OPT Field specific defines */
" S, Z5 ]0 l7 \, x8 P& h0 z#define OPT_SYNCDIM_SHIFT                   (0x00000002u)- a2 Q- ?; W0 ~8 L
#define OPT_TCC_MASK                        (0x0003F000u)9 b, ^7 ~' g5 w- s' J% y
#define OPT_TCC_SHIFT                       (0x0000000Cu)6 |, |3 J* C8 |" S# `  L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
' N* y, l$ S4 x/ E" W#define OPT_TCINTEN_SHIFT                   (0x00000014u)% e+ ]7 {) o+ J8 R+ @
% u2 G7 g& J- d4 E
char ping_buffer[PING_PONG_BCNT];
" U# ]; ~/ B  Y" G# Pchar pong_buffer[PING_PONG_BCNT];4 j! A8 c3 |  P
6 x) F$ P, G, V  t  N
! u5 d4 |) j( U  V
  T4 P8 R$ Q$ u' |
; x. J, R6 Q0 m# y8 l
static void ys_edma3_init(). }1 ]! ^4 c' W) B  W. W  O
{
0 |  W5 q- m$ _& V0 L7 E        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' S. ^8 E' z; J0 |4 @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ q& P- Y3 ?4 M( o. |- H6 X
        EDMA3_DRV_Handle hEdma;6 Z* x6 _! d, T/ x
    uint32_t chId   = 0;8 Q* S- c2 [& `3 O
    uint32_t tcc    = 0;" d! `( P0 q- A" u5 W! m
8 g& _& M  ?& M1 m. e7 E; Q
    print2arm("edma3 driver init...",0);
9 w2 C0 q, Q: ^: V3 j: I  S$ [- A% n( E$ L0 a: Y: Z- u- `
        hEdma = edma3init(0,&result);
1 P$ r% o5 I8 [; u; N5 ]! h  |        if(hEdma)
/ m! ]4 S% h- g6 s7 r: T$ B! u        {) q0 Q- P" o4 K& T, Q
                print2arm("edma3init() Passed.",0);
+ g/ J7 D: x+ C  J( L3 w        }% X/ R* ]" ?0 |  A( C# n
        else
; q: `! Z/ |( b4 H# L. a. g1 n        {$ U7 z# S9 E8 K2 V
                print2arm("edma3init() Failed.",0);
+ w8 b0 `5 Y% |: S% X) n1 |        }" t, J! Y* f9 m0 Q' O# H
        ; m4 V( E8 r5 B4 p
        if (result == EDMA3_DRV_SOK)% W+ @' @. O1 A4 n1 p! I" ^
    {
' F9 o+ o) M( i                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( i* ?* d+ p( J' L/ D                                                       (EDMA3_RM_EventQueue)0,& V0 N& z: \6 t, g! n6 \
                                                            &edma3_isr, NULL);
3 x5 p, W5 J+ }    }& Y/ A) I) _: \. F
       
/ |4 A( \% K6 f! |4 D        if(result == EDMA3_DRV_SOK)
0 C0 [/ }) ~% [8 |        {- O8 G% D+ b' @. n/ F5 b+ ~
                paramSet.srcBIdx    = 0;
: J4 ?' f6 q9 J                paramSet.destBIdx   = 1;
5 }  D/ ?# m( ]( o                paramSet.srcCIdx    = 0;
* S. V  B! [% A- l" D2 O8 ^                paramSet.destCIdx   = 0;
/ E$ P) u/ q5 U7 d: v- P1 P                paramSet.aCnt       = PING_PONG_ACNT;; Y0 t) w$ }0 k5 }0 \' n
                paramSet.bCnt       = PING_PONG_BCNT;, m: x) K( Q- @0 u+ D
                paramSet.cCnt       = PING_PONG_CCNT;4 _: W( X9 M( L" l$ b6 R6 W2 r
                : N6 D, j0 D4 [; g# z4 e0 m
                /* For AB-synchronized transfers, BCNTRLD is not used. */
$ C. [/ k8 ^9 Q! |/ \0 j: Y  ~5 m                paramSet.bCntReload = PING_PONG_BCNT;" D' U, w& `. o

6 g3 Q: |$ I; M0 q9 p4 O3 `  i- q                /* Src in constant mode Dest in INCR modes */$ y5 S3 l- G- x6 m- ^, V, @: r
                paramSet.opt &= 0xFFFFFFFDu;
4 j: c, _0 M( u" p& o                //paramSet.opt &= 0xFFFFFFFCu;: q1 [$ `, B; u7 g0 {9 m
               
/ f0 R8 `" q* E) n                /* Program the TCC */" B" r+ w" i; ^( T( D0 ?4 s! c8 |
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' U& y) N# o& o! P2 @6 j1 o2 }" Q) z

% `" b, \/ \6 S# D  E                /* Enable Intermediate & Final transfer completion interrupt */( M2 B  ], [6 b( ?8 ?; H1 r( y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! J, r& q0 u; p# F
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! n0 t7 O, U8 S" a+ y- F: z9 A" a+ G" s$ `; g3 x
                /* AB Sync Transfer Mode */
" c% y0 v" Y' I. v( e                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. k, _/ X0 G* w6 T+ p+ B9 c                4 f4 W$ X+ F; m3 Y' I
                /* Program the source and dest addresses for master DMA channel */: C( A/ ~1 |5 q7 D
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% q( |% O5 _& f( {3 O& g
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 ^- V  X9 U3 `& r7 @2 G9 Z  A7 x9 q% s# k1 R: x- P
                /* Write to the master DMA channel first. */
& L# l! R' Y0 S                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. H) n/ j$ M8 r5 \
    }       ' I& ^, b. f2 V7 F# x

( [2 w' [. N4 I2 }+ P/ ~+ W        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 i: B7 v9 D2 K# l        . N+ x& v5 R9 x# W5 {
    if(result == EDMA3_DRV_SOK) 9 j5 p4 c+ o  A6 l/ v0 x
    {- X, {" K' y4 _- `  n4 R
            print2arm("edma3 driver init success.",0);
, E/ a( X  E+ R' l9 U$ d: a    } + i5 H/ {- m8 U3 p# ~! c7 i
}
" P  Q% k0 ^3 a1 U9 }- Y
& o' @3 j4 g% @5 h1 E0 V' R+ E6 G; n2 m
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 \: v0 i2 i* }( j! {

  h( g% w' j3 X2 v/ g: n" h4 j# g+ W1 O; b: s

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ V9 `7 y- v" T3 X  [每次DMA传输完成后都要再次使能传输

9 {# V5 M& H- R4 [+ X: c# I5 m原来是这样,我明天去试试,谢谢了!




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