嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- Z- ]5 P/ s+ j  u6 t/ C#define  PING_PONG_ACNT          1
* l4 Q% `# z3 I# N' K1 z3 n: z#define  PING_PONG_BCNT          8*32*40
3 T5 B9 L! h2 i7 K//#define  PING_PONG_BCNT       1
- x1 L$ j6 U; M0 l/ F#define  PING_PONG_CCNT          1
  Z/ f0 M* {, k4 p; Y#define  MCASP_BASEADDR          0x01D00000
1 s: {  q5 }6 ?6 e8 Q; @1 W#define  Mcasp_RXEVENTQUE        (0u); q4 W7 K1 M" [, w
# B- v5 m8 i( f: h( d" m
/* OPT Field specific defines */
4 F4 C0 h) ~& |% T) d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) _# q) d% W$ p( C1 ]2 q4 g
#define OPT_TCC_MASK                        (0x0003F000u)
+ H& h7 V7 p' y/ S8 a: E; X#define OPT_TCC_SHIFT                       (0x0000000Cu)0 K3 v# S) j- w$ y
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 a5 q& N5 W6 D, ]* {, r8 l#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% j4 c  ^* G+ b7 u1 H6 [# ]! e7 ]5 E( `* I7 v4 o/ o( y
char ping_buffer[PING_PONG_BCNT];; v; j% Q/ r( H1 c* M/ H
char pong_buffer[PING_PONG_BCNT];
; e0 Q% I3 i/ O1 X+ z& E, n
$ j: f+ e" m. H, _4 O
9 X1 L3 k& o2 K8 \) v
" o" a- |. ^$ s9 k. I$ D/ P8 ^+ ^. F& k) l; D; b: m: i3 M
static void ys_edma3_init()3 _. h! j5 M  h2 ^! l2 q* w# l" q
{
/ b. w- q7 |1 c' p& I+ A1 r1 r        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: K! g1 m7 R7 N7 H% x9 @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ w, C% L2 q" l4 g6 o5 p8 T
        EDMA3_DRV_Handle hEdma;
/ C& N; T1 s% g" x" W/ l+ A) q; M    uint32_t chId   = 0;
" b. o; t3 Q- ^! z+ T    uint32_t tcc    = 0;0 o2 E- R  k- @$ a; {

$ t: h, R; d& F* J& m! _    print2arm("edma3 driver init...",0);
4 h+ ~1 N5 B& ~. N" e( ]# P8 {& o( K  l7 J9 s3 W* L: q2 R8 n
        hEdma = edma3init(0,&result);
" M% \0 o$ [" l9 Y" V: Y        if(hEdma)
8 s; h+ }1 d% r( p! ~2 K        {
1 a( K3 W' x+ h                print2arm("edma3init() Passed.",0);. Y1 E! F1 M0 B: ~: z
        }5 H! @. V+ b: }" u3 b) `
        else0 S8 }# N3 b3 F  F; D8 S
        {
( q5 q- k& |2 Q, o: v2 K6 k                print2arm("edma3init() Failed.",0);; G' M. o: C1 `5 z, y1 Y
        }( z: c/ }) D: U
        + [6 ]7 {- Z1 I" P* r/ d3 [- c
        if (result == EDMA3_DRV_SOK)7 G% Z8 [, h2 r% @: p
    {
1 h( ?, W% [0 z# Y8 Q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ s" m! b0 d$ e( T  U! l$ V
                                                       (EDMA3_RM_EventQueue)0,
2 b) F8 c7 k& A+ |$ @+ r                                                            &edma3_isr, NULL);
, ~1 u5 G$ J$ B5 K* R. ?$ x$ f# b    }
8 p. T4 v+ z0 x/ O* v4 d$ ~' B) b        * a8 l  j) K5 U& T
        if(result == EDMA3_DRV_SOK)( N& F! s6 v0 S) Q
        {
7 E! f8 H/ H; Y0 C& T' ~; E                paramSet.srcBIdx    = 0;
  Z: M* N: X2 v  q/ \+ l. x                paramSet.destBIdx   = 1;1 r: p1 n: v' J9 T& e' @2 f
                paramSet.srcCIdx    = 0;
0 Y% C8 k: e+ h+ }' t/ `( O                paramSet.destCIdx   = 0;
( o, t' i9 o, D5 k1 h  ?                paramSet.aCnt       = PING_PONG_ACNT;0 Y; h% ~0 v  G* N) v
                paramSet.bCnt       = PING_PONG_BCNT;0 O) ]5 m- q) Z- @
                paramSet.cCnt       = PING_PONG_CCNT;& l+ u9 J2 m3 I  h$ k4 x
               
) D" {/ m3 c4 n$ d) _                /* For AB-synchronized transfers, BCNTRLD is not used. */9 i& B8 i8 r# e/ C
                paramSet.bCntReload = PING_PONG_BCNT;
" K9 Y' S- }8 ^3 D" X& Y* ?. ^  i: w$ Z$ H  Z, o; N8 S
                /* Src in constant mode Dest in INCR modes */( ]& g1 ?7 x- U* i
                paramSet.opt &= 0xFFFFFFFDu;" J) W4 m3 |- l+ i
                //paramSet.opt &= 0xFFFFFFFCu;: j- L6 C+ Q* v
                4 a' v! K9 G5 B& s# `( U  l
                /* Program the TCC */
2 M* p! D; c8 N; B$ K2 \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; |, V( H1 E+ v; i3 B) }. T/ L

- @' X7 e- \, J                /* Enable Intermediate & Final transfer completion interrupt */
: J9 b+ Y8 w) `& L                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 K1 a7 z* _+ y; ?3 ?& y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% x  M4 T4 K7 L+ M, `: ?2 f$ Y/ Y
                /* AB Sync Transfer Mode */: m8 K# B" O# o# ?' B/ B4 r. u' d9 k
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  {% A/ x1 q+ ~% s* ^                7 W$ O" F  {; ~+ H. N
                /* Program the source and dest addresses for master DMA channel */$ B1 [& \, \" z/ Z4 {
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
# U/ d- d* i# ?$ ?  H% X                paramSet.destAddr   = (uint32_t)(ping_buffer);
% [. @; ?+ q$ t4 M, r  q& L2 Q: h2 p; L* i
                /* Write to the master DMA channel first. */
. U& b2 V( [; R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 D; l7 F% i, b: p" j2 e    }       0 h( M& I/ e- k, A0 x! s" X9 ~5 H' }. t

- ^0 S4 ^& A" m+ L2 E2 d        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, {: ^+ H$ O- g
       
8 C2 b9 Y& v' K: M: N9 Y    if(result == EDMA3_DRV_SOK) & q7 }0 T8 ]9 i8 v* n2 }3 p
    {
) k* d- A' k/ V  t1 M/ J8 h9 g            print2arm("edma3 driver init success.",0);! ?1 @, k& w0 k5 E
    } 8 F7 t5 V; I' e/ T" B
}' l5 p! N* s: a& u# ~2 u) [8 a9 d

' ^( q3 m: a* R
8 S" r9 s( O& g# y- iEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ E) l/ L# F: ]& L/ f  z- U. E1 M
, a+ x/ c+ [7 \' K. s( T; G
" h$ [4 G% D# I7 ?
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% E6 ^6 _* P9 S6 ?5 {每次DMA传输完成后都要再次使能传输

( R) O; ]# r$ |# ~" H  U( t原来是这样,我明天去试试,谢谢了!




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