嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 R+ ^  ~% y+ K2 J& B#define  PING_PONG_ACNT          1
3 O5 G. [1 I6 R: n+ z" G$ m9 _# A#define  PING_PONG_BCNT          8*32*40 7 i! d7 ~4 T. c
//#define  PING_PONG_BCNT       1
* J, n& J' B0 ^( O0 |! p. g#define  PING_PONG_CCNT          1
9 `9 W" w/ t; h4 l1 r5 c! n#define  MCASP_BASEADDR          0x01D00000# J# O$ u( I- }# S' @+ k" K( S
#define  Mcasp_RXEVENTQUE        (0u)
0 ~# G# |- o3 M7 r8 x; j! |, w. {+ o( H, J6 a# s' F. M
/* OPT Field specific defines */
# s2 F6 n6 W: W. O3 x, Y( }#define OPT_SYNCDIM_SHIFT                   (0x00000002u). ]1 O: {; S$ }" ]6 U- {. f
#define OPT_TCC_MASK                        (0x0003F000u)
# n7 `( Z" w. D* x2 h% [#define OPT_TCC_SHIFT                       (0x0000000Cu)
. d2 j# U' e# P5 H#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% A2 G& C) w' z  X0 G' e8 Q# P' ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) f' x0 v! D) F6 A5 w# [, e$ M4 ^. V% t+ k
char ping_buffer[PING_PONG_BCNT];6 N* O) _2 O9 f, }# ?" e" l
char pong_buffer[PING_PONG_BCNT];
& U  A/ n# F/ R( E- A! Z" T
0 W0 V3 ^; l, U; l7 @$ f5 {
9 o7 ~/ d3 G! _& A# I/ D% H
+ @9 O, O9 j. `
( o/ e# p+ H: R7 c2 E! j2 @3 mstatic void ys_edma3_init()- q* C8 J: b: S, n4 n4 h
{
8 M& C) g7 ~+ r' l6 ~        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 N/ `* ^8 F. g! Y6 E" |' ~6 k; M8 f2 k        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! J4 K! o5 Y( D8 W8 b        EDMA3_DRV_Handle hEdma;
/ [0 F) c* u4 A  Y: l: Z    uint32_t chId   = 0;
! z3 J( P7 n, v& \7 p    uint32_t tcc    = 0;6 I6 s3 e; ^! j; i: B1 q
& a* v. _# R( Z2 I% `' A
    print2arm("edma3 driver init...",0);
, {+ Y1 ^7 ~/ Z  S0 k6 @; W. ?
1 E! C3 G7 A! X# W: Z2 J# j        hEdma = edma3init(0,&result);
6 a, g6 ^3 S% z3 a$ y) b' h' k        if(hEdma)
$ r- \% J, P3 K; ]$ w+ I0 R        {5 @* }% W# Y3 [  z, ^, k
                print2arm("edma3init() Passed.",0);
+ s$ ~  n$ z5 K1 Y        }! N6 H& ]; T' `3 A! w2 b7 l4 R
        else
7 r( b9 [8 _+ E) s! {. |7 L& v' s; J2 _        {
, q8 v' L3 U2 i. z7 T                print2arm("edma3init() Failed.",0);4 n" ~, d! A: a' y9 X: b
        }( g# c0 i, f/ g' B9 Z
       
3 x( n( t% L$ w. N. j        if (result == EDMA3_DRV_SOK)
  G3 }" b( c2 h" t" @( C/ l2 M( Q    {
# x" ~/ U) \4 b7 B                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' j! D$ l& @9 h. L/ {
                                                       (EDMA3_RM_EventQueue)0,0 i) U# ?5 r2 A  G" O
                                                            &edma3_isr, NULL);9 |3 J8 T: R  ]4 J
    }
, l4 X* `5 z7 [; _3 ~: T. c        " q- x! u* T! R6 I
        if(result == EDMA3_DRV_SOK)
- l/ T+ m' d! p" W4 e" P7 }& y        {
1 q' ~3 A; N4 b% N/ I$ G                paramSet.srcBIdx    = 0;
; ?4 s4 C$ G6 O  ~$ M                paramSet.destBIdx   = 1;9 @8 J1 z8 b5 H, S+ w
                paramSet.srcCIdx    = 0;
% g1 k5 b) d* f/ w7 ]                paramSet.destCIdx   = 0;
3 R( p7 _. K. G8 x3 E                paramSet.aCnt       = PING_PONG_ACNT;
$ G* Q0 p/ z) c9 _  X% N                paramSet.bCnt       = PING_PONG_BCNT;7 H9 l7 P0 N8 U# M0 \
                paramSet.cCnt       = PING_PONG_CCNT;
4 f0 s3 x' m; p/ d* Q9 @& \               
* |1 L; ]/ o$ t/ R0 d# H7 Z                /* For AB-synchronized transfers, BCNTRLD is not used. */! g7 X0 h( F5 X5 P
                paramSet.bCntReload = PING_PONG_BCNT;
, ], ?9 [7 r3 ?+ Y6 _5 L2 p6 n& \* ]+ {! X
                /* Src in constant mode Dest in INCR modes */( M( [, D/ `$ x2 A' T* j0 b
                paramSet.opt &= 0xFFFFFFFDu;
: D$ {: B: T# r                //paramSet.opt &= 0xFFFFFFFCu;
2 p( n! m0 S9 K! j               
" z; x2 ^! s: B5 G! K3 |                /* Program the TCC */
2 r, U4 L& E' [1 J: t                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 o2 v' }  V/ M' h& q0 i
: ^7 C2 ~  l. a9 M: A, K                /* Enable Intermediate & Final transfer completion interrupt */
$ z* C& t( J5 z( ?( y, ]9 i  \                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# x1 t7 m6 x, J- F3 N/ u; j" O; U
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ V3 U2 r" d' E

9 |- C: p- o3 L7 |( Z( K                /* AB Sync Transfer Mode */8 I- s$ J# t$ P% I3 q/ {  Q! i6 h
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 T- e( W& b) ?! a7 o! F                  \2 U  O% ?/ p, h6 ]2 X
                /* Program the source and dest addresses for master DMA channel */2 R# x# l! F9 \* \  p% d6 }! G  c
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);' s$ u' o4 B7 u  {# Q, D0 |
                paramSet.destAddr   = (uint32_t)(ping_buffer);
5 b1 W' N" J6 I- k+ j% v* ?5 [7 @( K- }. E. \/ _, n& f% d3 O3 P
                /* Write to the master DMA channel first. */6 p: m4 L0 _4 F8 ^4 J. I
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
& l( b0 e* v4 ^    }       + P! _. ?3 D" l( J8 \6 C0 X8 o

" H: T* C1 \0 ?4 o# e        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 H1 T# R( b! ^2 Y        2 ?0 T2 p* [" ]1 F
    if(result == EDMA3_DRV_SOK)
! B+ k) i8 P2 a; ]7 l% D! Q6 B' y2 e    {
6 }+ r: G) Q9 H( Z4 V- f            print2arm("edma3 driver init success.",0);
, X8 {2 R$ T: G7 ^" @    } 1 M4 y- T: E* U9 g% F% m5 W2 v0 {
}6 O# N% L; X6 g( w

( E( K  N& ?; Q, h2 f( X3 z
$ n3 Z; L8 j7 Z3 W$ nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。2 |- N3 @/ j8 ~! i+ `
1 i" X0 {9 J0 n. A

1 b4 y- x9 l: l% i* m: n' }
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ g' z% e2 z/ F2 T2 h每次DMA传输完成后都要再次使能传输

: V8 M, k% G& g# W0 c1 w! L. e& E) T) q原来是这样,我明天去试试,谢谢了!




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