嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 _8 T4 A8 g' h6 p* q; X
#define  PING_PONG_ACNT          1
% w" |; k  N5 j1 s( l# Y  ~#define  PING_PONG_BCNT          8*32*40 ' m7 b8 g2 ]  c( p/ e7 n9 _9 |
//#define  PING_PONG_BCNT       1 6 Y4 j4 }- c8 u8 g
#define  PING_PONG_CCNT          1
. e' T' a+ }# p7 P#define  MCASP_BASEADDR          0x01D00000
$ \8 w2 F* g1 p4 l; h#define  Mcasp_RXEVENTQUE        (0u)
7 f, r9 I7 M/ E+ ~5 a# z# M3 Q  d5 z4 l* _; @( I
/* OPT Field specific defines */
! Q8 v, L/ @- K' x% y2 ?#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
7 c8 M' R; k) N( _0 B+ W, ~! u+ ^#define OPT_TCC_MASK                        (0x0003F000u)
6 }3 z  |, m8 @9 Y. q2 n3 e& X#define OPT_TCC_SHIFT                       (0x0000000Cu)
# G( P- }3 |4 |! T#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 Z% d) |& i- e/ r1 K- P5 {0 |#define OPT_TCINTEN_SHIFT                   (0x00000014u)5 S$ P8 ~' `7 t2 ~4 f
' ]6 x# L1 I' ?3 j' T$ h
char ping_buffer[PING_PONG_BCNT];
( c( M9 U$ p( K6 S! `5 h) Echar pong_buffer[PING_PONG_BCNT];
7 k6 D- L/ u6 u( z1 v1 G7 o8 o
) i4 V9 Z* X: @7 s2 m3 K; n
. t( m* D; u6 l4 l0 A
) T. V' {7 I' ^0 n
& N( V  o. L+ r8 zstatic void ys_edma3_init()
& B% n3 z/ q" g{
& I% p$ i9 c' Y- V3 k8 M        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};  m, {7 [, o0 ?% X3 X6 p
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! |6 V+ b8 C& G' D; B0 Z( c$ E4 e        EDMA3_DRV_Handle hEdma;
. x; G  b& Q5 V6 |% j0 h- ~; V    uint32_t chId   = 0;
% f+ m7 ]. _6 g* f: [) _    uint32_t tcc    = 0;0 o" Q7 Q& C/ M7 H) z9 Y! U
$ t1 a' U8 {! W+ s% S: |
    print2arm("edma3 driver init...",0);
$ r2 M# I2 E: `5 j" s% Q" Q$ w4 j! h. w  ^( @: c
        hEdma = edma3init(0,&result);
4 F$ r7 j4 o* t8 K  |4 v! B& e        if(hEdma)
/ X- F, H9 Q6 F  [; r' ]  @        {
- m% ]/ i, ~2 e5 ~6 Q1 u" D                print2arm("edma3init() Passed.",0);
' ?* r! e2 A/ s        }- T: P  b4 T4 f
        else( W8 Q) i( ^0 M7 B
        {4 f+ b2 y& Z/ l6 P( ?* ]
                print2arm("edma3init() Failed.",0);5 l( Y9 n7 q2 Y0 V' @5 k
        }( X+ n- O0 l- V- a& a5 o
       
. C% @5 P. C$ }1 e5 Y        if (result == EDMA3_DRV_SOK)
0 }6 D. r: p' U. A& l% X4 s% H; r. C9 }& M    {; |& a' m. |3 N, j  ?
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( l8 o0 X+ ]+ [( n
                                                       (EDMA3_RM_EventQueue)0,8 ?4 J* p+ K/ W" y& P. q3 G
                                                            &edma3_isr, NULL);! D3 F7 d" a* O4 ]5 X
    }
' c' Z; Z7 T/ C: y8 x# ^        9 X) w4 f/ n$ C- q$ |& k7 v
        if(result == EDMA3_DRV_SOK)
" z" j! F) n4 a: f' x  w        {
4 h/ G# M6 ~0 C' J                paramSet.srcBIdx    = 0;9 y6 p) i% {; T$ L
                paramSet.destBIdx   = 1;& G  r- `# l( z& `/ b7 M
                paramSet.srcCIdx    = 0;0 u1 C6 j, q  T0 w: j$ g
                paramSet.destCIdx   = 0;
/ w$ F) w" K. i8 e                paramSet.aCnt       = PING_PONG_ACNT;
% a; S5 p/ X- f- ]  ~, P; j                paramSet.bCnt       = PING_PONG_BCNT;( @# ]2 I* r" q0 b% [
                paramSet.cCnt       = PING_PONG_CCNT;0 Y2 O, z) @0 z0 K  s- C8 l' z
               
# l8 q9 x( L. |4 a6 }9 A8 U4 e" t. ]                /* For AB-synchronized transfers, BCNTRLD is not used. */
. Y9 B% I; V4 Z8 S1 y                paramSet.bCntReload = PING_PONG_BCNT;
, z& W8 Z$ \0 l! L0 P  W8 T
9 s  `2 x6 l* ^2 B; W+ Q& T" c7 P                /* Src in constant mode Dest in INCR modes */* r) N" e+ ]. }& ^# i
                paramSet.opt &= 0xFFFFFFFDu;
  r# P; }: x9 [                //paramSet.opt &= 0xFFFFFFFCu;5 B+ b0 G: Q3 K. c
               
' \9 ~0 }. u4 r4 f                /* Program the TCC */) @! M0 R; V* _
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 N/ {* }) W3 }7 P

$ ]& c4 [8 d9 Y. ~" O                /* Enable Intermediate & Final transfer completion interrupt */
: X! m1 m* a% d: D) s$ `+ Q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ H: _( F' ]; q' t' d7 i6 S# P: R
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# {7 |* I' C: ^! o+ z# f: r8 d, y+ a9 I1 m
                /* AB Sync Transfer Mode */
6 Q. m/ T0 E1 k' J* i                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) A- L- g* c- a                : E+ E5 T" H2 W1 R$ v
                /* Program the source and dest addresses for master DMA channel */
# G6 o$ U9 O$ z& v$ K6 j                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
& n5 U8 G( R' k; v; E+ C                paramSet.destAddr   = (uint32_t)(ping_buffer);& v' }9 u" V! p) t
. m" Q) y! g- p/ Q
                /* Write to the master DMA channel first. */; g4 x" }8 n2 l9 E0 i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);: c* A' R5 P7 |0 E6 r
    }       0 z* U6 G( @6 b( F

8 X1 W( D# g: X) v1 r+ R        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 o2 O" Z- ]8 y% B4 ^+ n       
! I$ J; `) O4 |  O/ p& z( M8 t    if(result == EDMA3_DRV_SOK)
/ F2 m' x$ m+ o+ y" ]9 [, c    {
% O* ]5 R, B" N2 i( m+ y! m7 L7 V            print2arm("edma3 driver init success.",0);
* G4 G% C- F$ v! T3 s% A' ]    } 9 B0 N( b; S+ U0 r% R
}
- B/ g9 q% x8 K/ e8 S) A* A
" ?$ w& m  a9 K# d. R
6 y$ i2 m/ e$ o& c; K8 F$ \6 I3 r* vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。3 G% ~% Z/ K. R. D8 ^& E4 G1 b
/ M4 r/ _8 [4 d

# f+ R' }) d" z  Q# ^  N6 s
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 q: x! x- y$ e2 [
每次DMA传输完成后都要再次使能传输

2 V4 R( h4 G7 M( D* d8 C原来是这样,我明天去试试,谢谢了!




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