嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. \! r# p4 b0 a9 O7 X% A
#define  PING_PONG_ACNT          1! t3 |- C& {2 b, V  x
#define  PING_PONG_BCNT          8*32*40
) `& |9 g& P( ]//#define  PING_PONG_BCNT       1 3 K6 f: E  R, h# w
#define  PING_PONG_CCNT          1
  m. ?+ T/ {' j6 b  P8 ~+ R  R#define  MCASP_BASEADDR          0x01D000000 Y9 Y( u9 L9 B( m
#define  Mcasp_RXEVENTQUE        (0u)
$ c  S1 y' k* Z, R7 F
- R% g# R  e3 c1 a) c/* OPT Field specific defines */
* ^3 z9 N1 b& X1 U# D  F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
- i( m1 e: W6 p$ i% }#define OPT_TCC_MASK                        (0x0003F000u)  q1 i7 x; b! T# I( ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)" Q/ Y1 n* [- ?- k0 h) k
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
3 v2 H2 x" u- P( V) s8 S9 x#define OPT_TCINTEN_SHIFT                   (0x00000014u)
+ j3 e* I$ V$ v$ {; f
% i# ?9 D: R! nchar ping_buffer[PING_PONG_BCNT];
% K' D9 L7 v. @3 Ichar pong_buffer[PING_PONG_BCNT];  S* m0 G' o5 \& k( q) \
$ c3 O! o" J- f0 @/ E; h

/ b! H6 @! a! i' b0 n
* U' Z, X3 B1 U, R  V
# [; D! _/ S1 K  Gstatic void ys_edma3_init()
8 f. B: O9 m& y{6 M/ ]. y7 o7 B! s$ y- U
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# P) f8 s0 E: G* s$ y0 _) N' U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 d9 J2 r2 ?1 W8 V6 H        EDMA3_DRV_Handle hEdma;2 }7 b* j+ P+ y0 h0 Y! A# K* [3 i5 T( ?
    uint32_t chId   = 0;6 X7 z: o6 g' ?6 Q2 x6 f/ X
    uint32_t tcc    = 0;0 {4 {+ p5 h3 R8 {2 F
. P0 M( K9 f8 Y, I, y
    print2arm("edma3 driver init...",0);
$ a* h' g4 ?8 s- C$ g! S! a' P" G4 @6 D$ g8 f6 U. O. {2 P. c* N. Q
        hEdma = edma3init(0,&result);9 a7 p( D/ }3 J2 p5 u0 M. X5 e
        if(hEdma)
- ]+ u8 g2 F0 E+ D# L  t  Q        {- E# p" [6 D# Z5 P' S1 S) `
                print2arm("edma3init() Passed.",0);2 K1 C. x  y0 I% X& ^
        }
5 [% }$ F+ i. Y) W! _+ k8 X% }        else8 L1 c/ D- A* E7 L
        {
8 I; e/ ]% s* ]. x3 x: l                print2arm("edma3init() Failed.",0);: A6 l& A8 |( ]/ y1 F7 C3 N
        }
; r; T4 A* J* F# Q) X$ Q$ C! {       
) b; ~9 M) _8 X        if (result == EDMA3_DRV_SOK)
% X2 `0 t* p6 t; d  ^3 ]  s    {3 _1 H! A& o. u7 G1 r
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,& Y# ]/ X) @. h& x
                                                       (EDMA3_RM_EventQueue)0,/ y* x% m5 V( y* g7 A  x
                                                            &edma3_isr, NULL);  N8 z( \4 U$ p1 C  ]8 F+ m
    }
, O2 r. r& [5 }       
. \: U# x" I4 m0 c6 A/ F7 W* B        if(result == EDMA3_DRV_SOK)) f0 O4 Z1 ]2 L, f( _7 M: R! U' X
        {" g* x( Z# {8 ~
                paramSet.srcBIdx    = 0;
% A- c  V( f0 J4 g1 |3 L8 n& w+ t                paramSet.destBIdx   = 1;' M, p) [' Z) Q7 n! q. c' I
                paramSet.srcCIdx    = 0;
+ ~$ k" J9 x# U% b# b) z                paramSet.destCIdx   = 0;
; S2 k/ D/ t% c0 X                paramSet.aCnt       = PING_PONG_ACNT;& g7 @+ t; b, H, Y1 ^3 O1 a: E
                paramSet.bCnt       = PING_PONG_BCNT;
6 _* x. F" m. |2 {                paramSet.cCnt       = PING_PONG_CCNT;  c8 _) w# m/ O$ Z; r: L4 r
                5 T/ t- P! Z" Z; _' a) ?1 n3 ?
                /* For AB-synchronized transfers, BCNTRLD is not used. */
& Z+ v2 @9 }9 ?4 u1 l  d8 {                paramSet.bCntReload = PING_PONG_BCNT;
0 G! V9 i% G; D' T1 S, ^
. U5 U7 ^+ y' a- w, Z& }                /* Src in constant mode Dest in INCR modes */
* E7 s: Y3 {8 W- ~  L4 o                paramSet.opt &= 0xFFFFFFFDu;1 z* v5 {, O! p& l/ C: k
                //paramSet.opt &= 0xFFFFFFFCu;% |$ Z+ D& v  T5 g, j- H. _
               
' k7 V2 c( G) Y" Y; N# C. ]4 F                /* Program the TCC */
7 N7 d, `% D& O& S                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, ?7 ]$ N% x4 F1 c- l& |5 E4 ^/ N: v, u3 E! M6 \# e
                /* Enable Intermediate & Final transfer completion interrupt */
! g, S9 A& }5 |6 L& i0 j) n                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: Q3 G& A6 A" t- g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( @3 o4 `! C  N! C
( L& k" S- O/ z8 C& w                /* AB Sync Transfer Mode */
$ j/ ]! ^! ^6 D5 u. k  }                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: M9 a, W3 z' w$ h9 t
                ( g: E$ Y6 f1 E1 a7 X
                /* Program the source and dest addresses for master DMA channel */& d. r" M- s- A2 b+ {# ]7 H$ B. M
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 X% e. M1 T3 @9 _
                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 U* p7 p6 T5 ^& e& F+ Z( T9 c3 N/ T3 z" {! A" z- T6 h
                /* Write to the master DMA channel first. */
3 d3 o8 X* ~& V& R$ N- I                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
, p3 w4 W/ H; C8 q0 K+ b    }      
# t) i% I0 O3 B. K$ h2 A# H! S3 d6 x
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 n7 H' f+ J# l4 i0 j9 H
        8 O9 X- `6 E2 G2 \8 x: u) \
    if(result == EDMA3_DRV_SOK) + l8 Q. _( `3 I2 U3 h* J$ Q
    {7 e  K! R. h3 s# ~+ [- m
            print2arm("edma3 driver init success.",0);
9 H$ q( s! w7 @; V3 O    } + H1 C0 ^; w* F2 @3 D- H
}
. W9 ]* A9 O$ y2 s) m8 p6 b6 b5 y

) \' N7 m5 {7 q( |7 v  i7 m( FEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& j% n  H' c( B4 n, Q  r' O

, n$ Q/ n- Q+ a! f4 a* j
7 ^6 F5 @. a1 B- A" B% G( `
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 l; D; A- `' G) `. P& k每次DMA传输完成后都要再次使能传输
& s: o( y- v* o, @8 l; B
原来是这样,我明天去试试,谢谢了!




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