嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- s1 Y2 ~3 v+ k) M, a; q6 k
#define  PING_PONG_ACNT          12 B0 L, L, i' g1 s) L+ e8 W" n
#define  PING_PONG_BCNT          8*32*40 - O9 t( N* N3 a; p) L1 o1 f
//#define  PING_PONG_BCNT       1 - Y6 a8 B* G% U
#define  PING_PONG_CCNT          1
- d2 e; w1 h: ]; g, f$ }. |  y5 P#define  MCASP_BASEADDR          0x01D00000
( N+ \4 U* Z4 f6 G$ f#define  Mcasp_RXEVENTQUE        (0u)
; a7 q; G/ N& P" N  x7 W4 r8 X$ Q5 n  ?9 m$ @; a1 Z
/* OPT Field specific defines */
# G& I2 x6 Q5 w2 D& j: s#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 \! E0 \- d7 o1 G: T- Y
#define OPT_TCC_MASK                        (0x0003F000u)5 Q1 n  W: N! j* R, E9 X
#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 M. ?* n# T) E0 a2 D5 V- c- e#define OPT_ITCINTEN_SHIFT                  (0x00000015u)- t( `3 O; e# {1 \# N; [1 n
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
, s! h/ s) I$ H4 ^, [1 ^" v* ~/ w* [' R. Q9 d
char ping_buffer[PING_PONG_BCNT];- f+ g1 V, O. w1 h
char pong_buffer[PING_PONG_BCNT];
: L) Z9 V$ K* }
9 p' Q: r- V" z# w: ], q- i
5 F# B# W3 d. S0 z# a
% h4 D5 T1 p/ o% z0 a' Z' L; l8 f% \- z0 s  w
static void ys_edma3_init(). s+ U% A* W8 l) k7 h- l: e
{
: \& C" g! X* u( C! M. d  A        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& {& k& |! b) O2 p1 s( J
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) P% |  |! Z$ t# |        EDMA3_DRV_Handle hEdma;
7 h( E! Z  z; M    uint32_t chId   = 0;
" z4 C1 z: U1 Y0 t  K" Q    uint32_t tcc    = 0;5 D/ v8 j- `1 ?0 |

& ~  p/ q6 i6 I3 V/ l1 b8 p! O    print2arm("edma3 driver init...",0);) e2 G5 F$ d" l

5 |+ C! A) i! i* P2 e2 \        hEdma = edma3init(0,&result);) E+ q0 x3 S8 I
        if(hEdma)5 G1 D5 S7 m3 n; C  k
        {
: F3 n: |4 y7 o4 @! ?                print2arm("edma3init() Passed.",0);% H  x( a; W1 e7 b
        }
4 h' q( d" T" ~        else
; O1 X, T6 _0 U) S        {" {4 ]$ s9 J+ K- J% }1 C. H. d
                print2arm("edma3init() Failed.",0);
8 }9 s+ K2 w& P: k        }
! r. \& ^, K, ]4 m3 g       
, g& j$ z# z) T8 `8 U8 w6 h2 T8 r        if (result == EDMA3_DRV_SOK)% ~, G! h( O" c% ?; G
    {0 U' [. Q/ ?8 [5 \# Y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,& C5 _' Q' w* H7 L& T! o" l2 b
                                                       (EDMA3_RM_EventQueue)0,
# E  F5 e5 [- H6 r4 Z                                                            &edma3_isr, NULL);
2 G! ]! p" a" W! J    }7 G1 }1 F; l7 G' q' W2 n" t! i
       
! B9 w7 n$ e" h' i& p( f3 n        if(result == EDMA3_DRV_SOK)
6 ~) d$ F5 b0 \  \0 t        {
! ]: l8 @3 t* k* X4 z% `6 E                paramSet.srcBIdx    = 0;
' w* t, T- K; r9 @* W5 Q                paramSet.destBIdx   = 1;
! g8 E3 \6 q+ y6 F; Z                paramSet.srcCIdx    = 0;; d& w4 b# g# a) X/ n& U# ?0 u
                paramSet.destCIdx   = 0;  c7 U0 w8 k! a! |& W0 J
                paramSet.aCnt       = PING_PONG_ACNT;. ~% a# ~8 Z$ t1 T( V( M: `# P5 d& x
                paramSet.bCnt       = PING_PONG_BCNT;5 o+ P* M  Z: Q0 A* `+ q4 [3 d
                paramSet.cCnt       = PING_PONG_CCNT;7 q" F/ `9 p# {: @2 K" J
                % m" |  O; V$ a7 B; B
                /* For AB-synchronized transfers, BCNTRLD is not used. */( T! G# S  U4 p$ Z
                paramSet.bCntReload = PING_PONG_BCNT;
3 X( j5 J6 q/ s: T, L9 Z9 h; ~( k- s' W' B* s3 _8 J
                /* Src in constant mode Dest in INCR modes */9 ^3 V  i7 ]+ \* f* `4 v
                paramSet.opt &= 0xFFFFFFFDu;3 x7 X2 s  o4 j3 `3 B/ m; p1 k. M; u
                //paramSet.opt &= 0xFFFFFFFCu;
& e  E0 w2 s" C; W# s* l2 i1 R               
; C4 [3 I  X. y) L/ ]' B8 T. d                /* Program the TCC */- n+ l4 p8 R# f2 d: m
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! c# I1 f+ U) X& |2 w0 B5 l2 C% j/ K$ H: d  K; o
                /* Enable Intermediate & Final transfer completion interrupt */* o! ]+ `7 h; |' S* ^9 Q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) d4 w$ |; Y5 W" |                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 `5 C0 X% t6 @8 Q, K+ |$ M
* o3 A1 O  h: l5 Q9 Z                /* AB Sync Transfer Mode */
0 g- P3 h0 `) u# e; r, s, {2 M                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) |* H7 P$ p7 w6 f) m" ^( }1 c
               
/ J4 L; u7 _9 a9 a7 V# Q                /* Program the source and dest addresses for master DMA channel */5 I6 x4 }0 v; g
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! C# _/ v9 N: V! I
                paramSet.destAddr   = (uint32_t)(ping_buffer);
3 `2 A: q8 J+ g5 J; }, m# J# }+ y6 V  n3 G5 l% ?" q! Y
                /* Write to the master DMA channel first. */
' y  L) U' j4 r7 z                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" H4 v: a) C0 H/ J+ @
    }      
! B. J3 W8 _& C& M- l
7 _) w" w- Y% y1 P        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: n/ X& f8 h$ e5 D/ P       
! N4 `0 N( s% s- V: `    if(result == EDMA3_DRV_SOK)
' C8 G5 H5 T: D: E6 ~    {- Q  W& \# M1 q! l
            print2arm("edma3 driver init success.",0);
- Y! U# C; i2 T. `# ^: W    } ' t( A4 e$ p0 y
}' a) Q& W5 ]: Q' y5 @

& ?' h( X0 F& ~$ h1 C6 j1 S9 h3 V$ Y- G& z# Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" {/ m  [4 u/ \1 i; D+ U

6 B7 P: r( E9 |" J& c9 b& P  K. v( V( T4 |6 J; `

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47& u% l$ t% `4 p, C
每次DMA传输完成后都要再次使能传输

# m; b3 B, G$ P$ P原来是这样,我明天去试试,谢谢了!




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