嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; J: \3 \/ f) @/ E1 w0 @5 [#define  PING_PONG_ACNT          1
4 v: G9 {; Z% k6 r5 [#define  PING_PONG_BCNT          8*32*40 $ p* _6 \! h  I( u, R2 ]* o
//#define  PING_PONG_BCNT       1 & n% I: e# J5 K/ T! ]9 f, ^* \
#define  PING_PONG_CCNT          1
9 @8 e* ^% \! `+ Z' \#define  MCASP_BASEADDR          0x01D000000 }! D0 F9 r9 h1 I, g* I2 L
#define  Mcasp_RXEVENTQUE        (0u)
# J, @2 `" Y( r4 }! l* i6 b2 `" E3 |6 {% {( R( X: \- x8 I) o
/* OPT Field specific defines */
! ]: K( M+ s8 y5 T' L$ v0 ?#define OPT_SYNCDIM_SHIFT                   (0x00000002u): C5 y6 J  _, e' ?
#define OPT_TCC_MASK                        (0x0003F000u)# q) n3 s2 q# V8 k+ i4 x; ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)4 p/ c9 o4 c- `$ ^$ _
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
( p1 j" `4 U  A  R; D6 l- a#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 N; I" T# H7 P- Q( `( |
8 ~; T- w8 @4 t0 b8 f7 q  dchar ping_buffer[PING_PONG_BCNT];
# h, Q9 |4 X4 B9 H$ E" O2 Qchar pong_buffer[PING_PONG_BCNT];% a- o( @! z5 p7 t+ z5 _9 B

' \$ |: K3 q0 Q. t4 Y
) Q+ Z$ I4 O. q9 k5 Z6 P& a, ~/ A7 H

% l' U/ q' R% G, fstatic void ys_edma3_init()
" d: y1 _% s. X# X7 I- o{
: p+ O( s; n" r) M2 x5 z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% o$ n. m: m3 {0 d2 O4 X        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  X5 c8 W; \$ v$ p! X: T        EDMA3_DRV_Handle hEdma;2 z- s- }* [& R. B& O# t3 ^
    uint32_t chId   = 0;5 R* g4 X0 O% Z2 ]' K3 D
    uint32_t tcc    = 0;
# A8 U7 M8 K: u& G) N
, ^( u; Q& m9 `    print2arm("edma3 driver init...",0);8 s5 L) i& [: E5 H$ Y

! n) w* |$ _3 \        hEdma = edma3init(0,&result);
' a& m' a' @( \: x3 `0 z        if(hEdma)
  M5 \; O$ q8 [9 Z/ U/ X2 X        {  J- b1 Z0 O+ q
                print2arm("edma3init() Passed.",0);
& t/ d' @! z# e  C4 \. R' [        }
3 e5 Z4 m5 U: {6 x. H$ C3 f        else
2 n/ g& y# G) w& J3 S        {
/ f1 e  c* |7 s" D1 V0 x* c                print2arm("edma3init() Failed.",0);# y( g8 E$ s9 P% b5 S
        }0 Q; D3 E7 L" ~  O, M! y: U: v4 |9 ?: E
       
( D. e; A5 }7 D- V2 m        if (result == EDMA3_DRV_SOK)# k) _' a2 n- v& g8 n+ Z0 X, _! ?
    {
' G% p: b; W+ Q  z1 O+ u% z                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 ^0 @+ ~; `; ?; ?6 A, J, i5 y3 g! Y                                                       (EDMA3_RM_EventQueue)0,# z/ c# x& d7 Y8 C/ f# ]9 ]
                                                            &edma3_isr, NULL);
& v' h$ V' J0 W8 x' s    }
  e' l; U& q9 A! L, H# t  h        8 N( w5 |1 f0 ~3 y; {0 L/ N
        if(result == EDMA3_DRV_SOK)
! }. ]: W' p0 i# _) ~/ t        {
  x" j2 v8 V" z( N7 l) Q6 q                paramSet.srcBIdx    = 0;
2 z7 F% P  r3 ~/ {# @1 ^4 D1 \                paramSet.destBIdx   = 1;# j, o: p. |! g# l2 s: Z
                paramSet.srcCIdx    = 0;
! ]* I/ U; U. s7 v& O2 |! ?                paramSet.destCIdx   = 0;
+ R% \/ f" ?- J* H. _                paramSet.aCnt       = PING_PONG_ACNT;# Z+ a* a9 v; W. d% B! c( i: F, w
                paramSet.bCnt       = PING_PONG_BCNT;
' n# O# X; L( ?+ L  w1 Y                paramSet.cCnt       = PING_PONG_CCNT;0 u2 ~: m1 y+ ^1 G% p+ V% V! _8 Q
               
+ `: s! I. F; h, Y5 l                /* For AB-synchronized transfers, BCNTRLD is not used. */' `0 [2 E/ b% c6 b  {) n
                paramSet.bCntReload = PING_PONG_BCNT;0 d) F4 o8 N0 c1 `: J
, k4 @1 I' `1 B5 n5 |5 P
                /* Src in constant mode Dest in INCR modes */- [2 w9 X( E* D- v$ X
                paramSet.opt &= 0xFFFFFFFDu;
4 `; g& x( U2 [" f                //paramSet.opt &= 0xFFFFFFFCu;
" t/ ?1 M0 a. Q/ W$ n) T                ! Z+ M1 W$ k% S9 p0 Y' D
                /* Program the TCC */
+ d# Z; _& E( m8 X                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# N9 [+ W6 \! E- Y! S/ [; S! R2 P1 @8 K! ]2 d% P
                /* Enable Intermediate & Final transfer completion interrupt */7 Z1 W4 [) U! B7 n  k) b
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' l2 m5 z- B% B! v# |7 O- \
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 f1 p! Y  o. C4 S0 @+ Y, n+ `) E8 j3 y& u
                /* AB Sync Transfer Mode */+ n0 W- H' h1 g: [% F  S
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 I! r# w3 t8 j6 d5 \: q               
  B, d6 w, ^0 e+ v2 h8 k: a                /* Program the source and dest addresses for master DMA channel */
* O! K7 C( r. s. ^# V                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! i5 `- {) c5 a2 ~
                paramSet.destAddr   = (uint32_t)(ping_buffer);" g" a: A' A% A1 j
: V8 h9 K( G& A: V3 N
                /* Write to the master DMA channel first. */" x9 d3 u9 U% T( M& U0 h' x
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
* |) M8 l. e* y! |; A8 W: B/ I% b2 @8 Y7 A    }       " U/ w  l4 j" g; F% i$ w' E
. T) D. C, }  Z1 I0 h
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 _9 w5 u4 V' U7 H* f% i' a3 N
        4 s( w: i" y2 l3 J9 k8 `) d
    if(result == EDMA3_DRV_SOK) : R2 U; r6 N5 R. H3 A
    {) C/ K! V1 q; B! a( f! }
            print2arm("edma3 driver init success.",0);
$ {" {$ u0 L- _) P    }
4 n* d4 A( v6 [. u* {+ |7 _}) }: s' K, G- m2 j% h  }9 |; F+ L
5 m5 V$ o, P4 }7 F! p6 q. \
0 |3 O- l4 G: H' @6 o8 O* D
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 v# c8 a. D, G9 B+ \
' E! i9 L% |( `$ f+ T
( Z% l/ F  P$ A0 q# @- P$ p

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 Y9 X0 d+ _1 c# p% F% S
每次DMA传输完成后都要再次使能传输
4 d7 Y) ]6 w+ {
原来是这样,我明天去试试,谢谢了!




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