嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; D9 k. ?8 g+ O; N' U#define  PING_PONG_ACNT          1$ d9 E+ Z6 Q* g9 d# T- y, E
#define  PING_PONG_BCNT          8*32*40 6 |$ c  B# U, p+ r/ M) D  e: U
//#define  PING_PONG_BCNT       1 ; u% ]8 g* j9 L# |
#define  PING_PONG_CCNT          10 m/ ]/ O1 q" A$ P, W
#define  MCASP_BASEADDR          0x01D00000
* z) c; w/ b0 ^#define  Mcasp_RXEVENTQUE        (0u)
! ~3 ~6 {  A/ n) i/ ?4 H
6 f) i  Q5 X& l# b/* OPT Field specific defines */7 O3 o% ~$ c* y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
2 F- e: n. r2 J, s2 X4 L- o7 a#define OPT_TCC_MASK                        (0x0003F000u)% A' L" i3 I- K) X7 A
#define OPT_TCC_SHIFT                       (0x0000000Cu): c, O  l/ y. f* @
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ }( q+ b( v7 m' E7 K% a5 v
#define OPT_TCINTEN_SHIFT                   (0x00000014u)1 D6 I9 B( w$ Q- C* A1 ?& X
6 G) \/ ~2 l' A3 [( N1 }# J
char ping_buffer[PING_PONG_BCNT];0 I/ a; D- B* q. ~
char pong_buffer[PING_PONG_BCNT];
) a+ N; o5 a4 A9 I& j# c- c; s# C
3 T" g! q  \3 ]# p! W
: X$ N) H2 K% I6 c/ x8 J; {" p3 R  \" C! {& P/ ~- B
1 [; ?0 N1 s8 |3 K) @2 N
static void ys_edma3_init()0 n3 |3 E2 d0 p* E% Y% K
{( s* C- z. |5 i9 ?0 `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 P& w+ c& w' q8 O        EDMA3_DRV_Result result = EDMA3_DRV_SOK;. p4 L! ?6 h4 C0 y, B+ p' f. d
        EDMA3_DRV_Handle hEdma;3 p( b: Q- k; g# N
    uint32_t chId   = 0;
4 y  V2 E7 f; ^3 A1 [; K2 m) A+ _0 C    uint32_t tcc    = 0;/ Y1 S9 r* N8 ?; T, r0 Q0 e, w

$ ]% m* X" f0 w) P    print2arm("edma3 driver init...",0);
& J9 ], _! X6 Z4 m' T! m
. ^5 N' Y) o8 z: g. Y; R! F# A        hEdma = edma3init(0,&result);
5 C- Q; b: g" b; W, c" X7 E7 T        if(hEdma)0 g, u1 @' C( v/ A; d( n
        {4 q# K/ U1 l# X) z) g+ A* J. U: S2 Y
                print2arm("edma3init() Passed.",0);; f8 q! ?8 u$ D! x0 K, ?' z
        }
- S; u+ l. j/ W  l# }: O        else# e$ i0 _/ I$ x7 E" n, G
        {5 D/ Z; s1 [' }1 ]1 [  z7 A) N" X
                print2arm("edma3init() Failed.",0);
; q- t( @! `6 U% u7 V' D5 _+ Z        }
; h; Q8 Q. ?9 ?; X% X: x+ l        1 F  i2 O' Y5 B5 F7 I0 O3 ~; |
        if (result == EDMA3_DRV_SOK)& b. k# G0 T# Z" \
    {
* G) M% `- c- F. ^" {                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( g3 S. y# J+ }                                                       (EDMA3_RM_EventQueue)0,
/ n2 [. D0 d7 f2 ?% I                                                            &edma3_isr, NULL);
# M+ Q9 n& l0 e7 p* S0 p    }' [6 J5 o6 h0 ]. A1 N% J# W2 \
       
8 R+ q3 f2 u9 O* `3 L9 t        if(result == EDMA3_DRV_SOK)" _  k7 W7 A  B6 F2 X7 [
        {
6 S$ y4 q: m! p: Q                paramSet.srcBIdx    = 0;( u6 d6 ]4 J' v7 V- `5 S
                paramSet.destBIdx   = 1;
- X6 k' f4 L5 \4 @0 e+ p                paramSet.srcCIdx    = 0;
. [/ W  B# S3 f; n& r" S; {                paramSet.destCIdx   = 0;
# K$ E. Q3 a; t5 ~                paramSet.aCnt       = PING_PONG_ACNT;  @2 w* z$ K) ^3 T2 T5 e+ G3 f! @9 b( O
                paramSet.bCnt       = PING_PONG_BCNT;, a) }! t1 a, A1 B! Z' t: m- c- t
                paramSet.cCnt       = PING_PONG_CCNT;
- n& s4 R# r; p$ ^! H' f                0 w4 s3 e. j* d
                /* For AB-synchronized transfers, BCNTRLD is not used. */* X: [; p1 v. N& y' A4 n: ?
                paramSet.bCntReload = PING_PONG_BCNT;' X' ?+ ^: I6 U8 c* P9 ?( Y. ^

1 W) _+ |( M' b9 \: F8 y% X3 R+ K                /* Src in constant mode Dest in INCR modes */
! L- E! o/ f4 f                paramSet.opt &= 0xFFFFFFFDu;
# ~5 B& J9 y+ g2 G: N! q* h                //paramSet.opt &= 0xFFFFFFFCu;
: }# ^4 ?2 r4 ^  ?               
4 T: N/ `% o( J* c                /* Program the TCC */! ^% [4 U7 U; O2 I; T
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  z9 [' X: m+ X( u4 J' q! E) `2 l8 W9 x$ c; P* p  M, V
                /* Enable Intermediate & Final transfer completion interrupt */
  J7 z$ l7 d% N' I4 l% |                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 g+ B, i4 b) @7 I( {5 |
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
  g' f3 p1 y0 Q
7 ?, x. q. C- W- P                /* AB Sync Transfer Mode */
) ~8 T& x% H( Q( J, y8 ^  i                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 H. _# Q9 ^: I5 J8 y
                ; a$ w- F- A; g3 Q- ^! d: a- s
                /* Program the source and dest addresses for master DMA channel */
' ^2 i- A6 u. X0 `9 w                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
5 }& M/ q1 q" }6 W: T4 r3 J0 j                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 h# X+ W% j" l" Q/ o" Y, \$ S
# T% ]  k% x8 j* B" O. P+ N/ ~2 |                /* Write to the master DMA channel first. */4 Y' u; Z1 b" s3 F, z5 e0 g% m
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
6 V! W* v+ W3 W    }       9 q6 t* a4 J4 @1 z# |
( H$ p$ B1 o; h8 h- o1 _, Y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# g: R# i8 S$ V% ^
       
2 G; K6 J  f$ N7 N# q    if(result == EDMA3_DRV_SOK) , q- W* J6 i/ ~4 _/ k' a0 G1 J
    {
6 z' \5 ^1 C2 y+ i% t            print2arm("edma3 driver init success.",0);4 B' ]/ f8 m6 [# |5 D# }" I4 x
    } / _: k0 L6 n- e; D
}* s: @! Y5 m  o1 O# O
/ _, J* A9 n9 Z/ h! K1 `, Q7 v5 i

8 f: Q4 G! V/ g7 s2 S* z# Y* F4 qEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ V9 K+ Z1 `- R2 k) z
+ Q0 ^& G4 g9 G
  u$ ?) d# `! }. s1 E: h
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 I0 w8 ~' L) `' K+ k& g* v; {3 R每次DMA传输完成后都要再次使能传输

5 ^6 r/ u$ ?' P$ u' B. q原来是这样,我明天去试试,谢谢了!




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