嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ s+ z  O' m# G' s+ h7 _
#define  PING_PONG_ACNT          12 `* Z8 C. V4 J, b& |- A
#define  PING_PONG_BCNT          8*32*40
* ^$ h5 G* N% P//#define  PING_PONG_BCNT       1 ) |) h& c2 \& }7 V& _
#define  PING_PONG_CCNT          1
' A- L0 l# b  H, l#define  MCASP_BASEADDR          0x01D00000
- e3 y- ~2 x. R8 z#define  Mcasp_RXEVENTQUE        (0u)- i+ S* a1 ~" X1 l8 L: r
! x6 P4 A6 w8 i! N  o7 U% o' N
/* OPT Field specific defines */6 F% L4 l: ^. z, \
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)4 U7 w4 {  _' T- K6 k
#define OPT_TCC_MASK                        (0x0003F000u): e* j- ^' L% s- Q  V# G
#define OPT_TCC_SHIFT                       (0x0000000Cu)
* H  g! t. a: D$ r5 b' [#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% u5 {0 C3 `4 s9 C4 F8 g
#define OPT_TCINTEN_SHIFT                   (0x00000014u)5 b2 S. j" @6 A; {

% I# p+ L4 i( s# lchar ping_buffer[PING_PONG_BCNT];
! K' |. o0 ]3 X: ], o8 Dchar pong_buffer[PING_PONG_BCNT];. |! f. q3 \7 q4 r8 i3 r

5 z2 a4 P2 ^. m9 s8 P2 d3 ~6 ^
. u6 c% z3 |  Z# o0 {7 y: T" i1 A* c. Y2 d8 _

5 C6 i& l! o9 V0 i8 Y7 T6 qstatic void ys_edma3_init()
" t) @/ Z$ d; S2 ~5 ]( z& ^{
. I8 f- j; P8 p        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 q9 X# p1 l4 @  Q" ]' ?# L( [1 f        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, e6 k# S9 B" K        EDMA3_DRV_Handle hEdma;' C* I% T# [# e/ f; w7 T
    uint32_t chId   = 0;% h% `3 J3 q( ^/ p7 `& H
    uint32_t tcc    = 0;
8 l8 ]5 \, @9 V' K( O% l
# `3 m  r# C4 ]9 M- Z& {" q* Y    print2arm("edma3 driver init...",0);8 f: `4 q# d* a5 V) P) [  a0 @% n/ A
  s+ D' b% K1 b7 o% o
        hEdma = edma3init(0,&result);9 h4 z. F: |8 a" M5 _" p4 o# K
        if(hEdma)5 v# P! u* T) j6 X
        {) Y9 t* u4 a2 |/ D8 ^2 ]
                print2arm("edma3init() Passed.",0);
. c2 ^6 T& F3 Z& K6 ^) P$ ~        }
  b6 K6 X( }3 ]" }        else
2 }# I- ~1 }' I4 P; i# F        {$ y3 G" a2 P( e. q  U
                print2arm("edma3init() Failed.",0);
% s, Y  M% |6 r/ B3 Y        }& U3 g7 d! _+ u/ m3 {3 b" G8 e' X
       
7 Y; p* n# ?' E% N: S4 Y& Z        if (result == EDMA3_DRV_SOK)
; W$ j9 S8 Q, x, P- I% b* e    {* E0 ]/ \0 O' s8 g! U6 h
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% [; k) E# E3 [: Q4 F
                                                       (EDMA3_RM_EventQueue)0,
- n& ~; s% b/ H  }' d& I                                                            &edma3_isr, NULL);
  E1 p- M8 ~) I% ?    }
: F5 A8 M% T' K1 ]       
8 `! T  X% A, Y6 n% K. V        if(result == EDMA3_DRV_SOK)
, O5 f/ B8 `9 O        {6 X9 i- p; S6 `8 q
                paramSet.srcBIdx    = 0;9 N) E( ?3 V: L8 [
                paramSet.destBIdx   = 1;. d7 R2 I5 A; i; {" z' P
                paramSet.srcCIdx    = 0;
; I3 g% M& g# J1 Q2 K$ w4 _                paramSet.destCIdx   = 0;
" I' h  A9 [- c, E& Q6 B2 {3 b$ g                paramSet.aCnt       = PING_PONG_ACNT;0 d- o4 i" u- L5 P
                paramSet.bCnt       = PING_PONG_BCNT;
# J* |; u4 X2 f& B* a9 d, G                paramSet.cCnt       = PING_PONG_CCNT;
3 i5 P0 x8 z" ?/ j. C                ! T- b- U5 F+ v
                /* For AB-synchronized transfers, BCNTRLD is not used. */
3 m! C/ Y  v* q; c6 D                paramSet.bCntReload = PING_PONG_BCNT;
& v; |& o0 p9 t+ ~% l, @" u- h9 ]0 R
                /* Src in constant mode Dest in INCR modes */
! e( n! l' x- a! L- {) V                paramSet.opt &= 0xFFFFFFFDu;
: `. O- ?* o6 |8 k7 k% B! |                //paramSet.opt &= 0xFFFFFFFCu;3 o; F+ B1 K% x3 t3 L- n
                0 j. }6 \9 A3 H* t) B9 G' R" V
                /* Program the TCC */! ]/ k7 V2 ^5 Z8 M
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- P4 [9 `! o* ~' U9 s

9 J! H; y; \# w( Y                /* Enable Intermediate & Final transfer completion interrupt */- M) k8 ?7 \3 r6 L  e. |. v, x
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; C/ @5 \: d* o5 ~; E9 p' k                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( q; K, e5 ?5 g6 X& M
3 n1 k* d2 D. l8 Y3 ]                /* AB Sync Transfer Mode */( y0 x0 f( d% `$ G4 u- L# Q; a
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% h0 [8 q: l: `1 ]* z# ^3 Z               
3 H9 s; `5 J: [- f6 U* p6 i+ m9 n                /* Program the source and dest addresses for master DMA channel */
; P; H" Z+ ?# y' T: |                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
: |2 T; s4 j' d/ w& Z7 L" y                paramSet.destAddr   = (uint32_t)(ping_buffer);/ c$ X! r# g4 Z! [+ M4 E5 Z' g

% A  E! K( e5 E$ t. h                /* Write to the master DMA channel first. */
$ U  K( X+ L- \4 F) ^3 L) C- o7 I                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
( i  f: S. {; H* N7 D, ]7 c. @. j    }       9 F3 k- a3 a7 e8 a3 E! S

1 `/ N: B5 K8 d7 d1 a* @: a        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. S; ^. n/ b* t2 X3 l4 a       
8 T6 ]$ F( _/ T2 K6 P    if(result == EDMA3_DRV_SOK)
3 @; }* P8 q6 Y6 U' A( h  J    {
2 V0 e& b6 T7 I8 A            print2arm("edma3 driver init success.",0);
. Q" v& p% I0 x    } 9 t! O. u% W9 t( S9 j
}
; k% U6 h9 y+ U$ p: `/ q
4 S" y3 f% {( y( n1 w
$ n8 N  ^2 _2 z( v/ nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# R4 v& e& q+ X1 ]$ U

4 @: q, P; y6 i& j! F& M$ y8 f! ?/ |7 i8 W* b# y

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47# _) w' o1 n6 G
每次DMA传输完成后都要再次使能传输

1 V( ^- o, A9 q8 L$ {: T7 F& z原来是这样,我明天去试试,谢谢了!




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