嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 M) o$ Y/ Z- j#define  PING_PONG_ACNT          1
+ K7 n( Y& i- A8 [1 K# z. R#define  PING_PONG_BCNT          8*32*40
; d- i0 }9 y8 b& F: F. O//#define  PING_PONG_BCNT       1
, v. c/ i1 ^. y( R% e% [/ k: c#define  PING_PONG_CCNT          1
. Q: x8 h- \1 G% O#define  MCASP_BASEADDR          0x01D000004 \0 f/ B# w  s% D( v
#define  Mcasp_RXEVENTQUE        (0u)
1 J) U9 k2 R+ G4 g; O* O# _3 O7 ?& q" N
/* OPT Field specific defines */
1 B0 ]5 z' f  I5 l' |#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
1 }( N5 l1 h4 c& l, k7 y% Y#define OPT_TCC_MASK                        (0x0003F000u)
* ]$ X) v& S% G+ U#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 G& k. {3 x! g$ q- V, Z7 t#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& K, |: l2 O2 A
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
. n3 A( @+ ?# p+ [0 P# u+ k. `& B9 C2 u
char ping_buffer[PING_PONG_BCNT];3 [. m4 F$ p, |
char pong_buffer[PING_PONG_BCNT];
" `6 ?; L* g1 u) I! y1 q7 L, ^: L8 c

7 ~8 x! K7 q+ b" ^# @  h
/ F+ |0 `9 ~* l, d6 `$ G- i+ r0 y  e" K& F2 J% c! R
static void ys_edma3_init()& M+ X7 u5 B* C* A
{$ j$ W- e3 n3 K; z) M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ {- y4 f' ~$ G! ?! h/ v        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% i+ e7 m0 x$ Z9 S        EDMA3_DRV_Handle hEdma;% p/ I* `( i" w& @- |! M
    uint32_t chId   = 0;
+ e: ^* N3 h& S% q5 ]3 [    uint32_t tcc    = 0;
8 m, x4 y6 i5 R8 ?; n$ F, H( R, G6 x) m2 ?. R" [- l2 h8 Y8 g" [
    print2arm("edma3 driver init...",0);% x' ^8 T" M+ ~% I
/ h0 E+ F% S% L8 X: m* m7 L7 M
        hEdma = edma3init(0,&result);
- x4 s: L; g" {; q5 I3 a& }. }        if(hEdma)
1 W; H  k5 u, z$ b3 V        {
0 a0 L# n6 H) S9 q: w                print2arm("edma3init() Passed.",0);
# w3 V$ x- J% g        }- X9 p' f  u) z: ?" X. O
        else, a8 [+ K; [  D4 i; Y
        {
5 \  D% S+ D) V1 n+ Z3 O9 j                print2arm("edma3init() Failed.",0);
& _. A: `- r5 \" N( Z2 l        }, `, d, ?' v7 w% N, c0 A9 ?# l" ~* J2 ?
        ; c, x3 e0 E  P0 ]
        if (result == EDMA3_DRV_SOK)& A5 _. [5 Q9 T. [" }: J
    {8 Y0 }" q, |4 N8 q& s
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& h* @5 t0 a. L8 p8 }. \                                                       (EDMA3_RM_EventQueue)0,
5 e/ |8 C7 o+ Z' r! L5 U8 A                                                            &edma3_isr, NULL);! [/ A/ V$ _& c; R0 k! @
    }3 u& Z+ a. y7 p  E
        $ c' j3 B; \* M: ~" ]3 D, y% F
        if(result == EDMA3_DRV_SOK)( d9 d9 t2 U% O) R
        {
6 u8 f# v( y. q: w( i0 s2 m" ^' F9 l                paramSet.srcBIdx    = 0;
! u. i, F% x+ A3 f                paramSet.destBIdx   = 1;2 g$ o& z2 J. i
                paramSet.srcCIdx    = 0;
3 j/ B' ^; w! }- [                paramSet.destCIdx   = 0;; W9 ]- g. j2 @' u
                paramSet.aCnt       = PING_PONG_ACNT;# Q1 ~) K! p  P
                paramSet.bCnt       = PING_PONG_BCNT;, Y7 K" K* M1 b3 k5 N! W, [9 w$ Q& }
                paramSet.cCnt       = PING_PONG_CCNT;- Z5 N. k/ k& Y% y6 q& p/ Y
               
  T6 P+ H& D6 ^4 u% |                /* For AB-synchronized transfers, BCNTRLD is not used. */
% D5 n  q9 I# v( h6 g3 F& c                paramSet.bCntReload = PING_PONG_BCNT;0 w- g# O3 k+ y' V

3 c) ^5 U& {; s2 p+ a- O% |3 j% P& z                /* Src in constant mode Dest in INCR modes */  f9 d4 Z5 q3 a; m
                paramSet.opt &= 0xFFFFFFFDu;
8 ^9 ?. h" f& U# Z+ w, A0 T                //paramSet.opt &= 0xFFFFFFFCu;
6 h% T2 U' K) g9 K6 L% t4 S& T               
& q7 w- L+ K3 v* P. B4 d                /* Program the TCC */
$ q( e+ S4 r- G" ]8 o$ W2 c                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; i( y, k) a9 C! e& \$ A$ [& V- F) f" ^3 K. S- r
                /* Enable Intermediate & Final transfer completion interrupt */0 _# N* W9 M* t3 _6 W, X* K
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, E* U) u/ ]/ e                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 }# H+ P0 ?1 D+ f  _1 J+ i7 b
- m/ n8 s4 ^3 i( g4 z                /* AB Sync Transfer Mode */
+ x* X$ K5 }  s2 |                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 h) Z( @. M- ]! |& J
               
- e" ~8 S9 H( o9 {+ i, t                /* Program the source and dest addresses for master DMA channel */, s  X( A7 [$ h# Z3 A
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% p- G* r' \  J6 w2 ]
                paramSet.destAddr   = (uint32_t)(ping_buffer);
9 P- `, N2 Q% c. T! N
$ O) {9 J, a8 i5 ^* b2 Z+ W; }                /* Write to the master DMA channel first. */! N, D  ]( u. p' ?; o; w- P
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! ^6 {( G  n1 C    }      
1 I! ?4 N& W  v% v0 V4 J) d( p& N' q+ o  ~3 M
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);' o+ p% s2 P) s! K2 G
        % R7 R0 ]* x- V2 M7 C
    if(result == EDMA3_DRV_SOK)
& {" n6 J2 M- _, k/ `" C" j$ q( Q" A    {( Q4 n* X! {9 }7 m+ o$ `# N
            print2arm("edma3 driver init success.",0);
; u0 U; Y4 y, Y    }
9 y$ @, ]) _8 G1 C  K}
, o4 ^+ ^0 k9 c8 U3 g* e* g! {: q* r' M- h7 k+ u9 }
/ j3 W# E! ]* b$ l, t% E- w) d. c0 E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; V* C9 Q1 C3 j6 X, H% f+ @
3 d0 t3 C0 Y) m
3 m5 X) S+ s. j% C2 V
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
1 j3 g8 w5 T; R" v8 v5 }每次DMA传输完成后都要再次使能传输

* L9 z, R0 p* c$ J原来是这样,我明天去试试,谢谢了!




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