嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ q: x2 K- d# D4 y#define  PING_PONG_ACNT          1% ?. K1 u! J% u
#define  PING_PONG_BCNT          8*32*40
; i( w; c- N- f* l+ t4 G/ u& u//#define  PING_PONG_BCNT       1
4 A( e/ y/ U! k4 ^" H. R# }#define  PING_PONG_CCNT          1
+ H4 O/ m; z$ M- n  t- i& d" p#define  MCASP_BASEADDR          0x01D00000
/ C: N  E0 E9 y7 a: s. C#define  Mcasp_RXEVENTQUE        (0u)
3 F1 V9 ~9 o: y" r/ J8 w
2 Z# I. l4 ]# U: F% Q' j/* OPT Field specific defines */" a" K2 F; g- _- a
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
2 \# M) N: H( {9 S! q  |8 P! I#define OPT_TCC_MASK                        (0x0003F000u)1 F1 f/ \5 u( g( H; R
#define OPT_TCC_SHIFT                       (0x0000000Cu)
& Q7 G+ o/ C) V9 }2 a2 O6 e$ T#define OPT_ITCINTEN_SHIFT                  (0x00000015u)7 U) H! U6 p2 B! q5 [, |. e
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ Q' O* l- O; |) U* {, G. I2 Q: z
char ping_buffer[PING_PONG_BCNT];1 U. [4 L& r0 U! w% H, y. C/ E; b
char pong_buffer[PING_PONG_BCNT];
; F7 @5 o' _  m9 q. `" D8 {. ~
! s3 p) Z& y! A" \# c
) o% M0 k( n7 ?$ n8 X4 w" y/ ~: B7 G  D# V& A
$ j: v' F0 \9 x3 m
static void ys_edma3_init()
! X3 z7 O/ H% w5 `# s  J7 v3 V) \{
* X4 h  u, j2 v" u% \        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ i" q( `4 }' U: t8 C
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- f$ X+ M0 N1 Z( x        EDMA3_DRV_Handle hEdma;# T% {/ {2 J9 f9 O6 D5 ~
    uint32_t chId   = 0;
0 Q6 |$ i9 i- _3 v    uint32_t tcc    = 0;
7 z( k3 s% n4 A, A7 K4 o, W4 q( M) c
    print2arm("edma3 driver init...",0);
5 e' u* s9 l1 z' G; n/ m0 Q  v
. R+ z7 N) u9 E% n! ]# p4 A        hEdma = edma3init(0,&result);
% S, ?9 A; i4 s& Q9 u        if(hEdma)) y; p" i/ V/ ~2 W5 \6 w3 w
        {  i! F  Q0 }7 U7 H
                print2arm("edma3init() Passed.",0);
. b* G1 M* N4 ~        }
+ D8 f& n, O+ i7 B3 P8 n* \        else
0 `' e9 r9 V0 r& M; E; u- x# _# x        {( i7 m; c, d7 e8 G/ w* C/ d% I  @
                print2arm("edma3init() Failed.",0);
, V; I# V& w1 I, G: T% l1 g        }
# e# A1 l' ]/ e1 P3 h6 U8 f2 U: j% i% N        + r! t2 Z! H$ h6 `1 c
        if (result == EDMA3_DRV_SOK)  X+ F! n2 v0 `# a) A
    {
6 H! ^& F4 r5 K* j- D/ ~/ D' y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 v  p: S& f* L: n5 G6 }                                                       (EDMA3_RM_EventQueue)0,
4 P2 r2 F' n. C0 j1 L                                                            &edma3_isr, NULL);8 e0 E: K" C. S. }' v" ]
    }' p! I1 Y/ l& s
        0 n1 U  @' Y- ?, [) }
        if(result == EDMA3_DRV_SOK)& [* Q1 Z" ]; U; M
        {
8 n" m+ f. `# V8 B% g4 K; H                paramSet.srcBIdx    = 0;* O9 z* m6 A+ `5 S$ O( ~6 O0 U! d
                paramSet.destBIdx   = 1;+ z, d, v+ \- G9 [! X: x
                paramSet.srcCIdx    = 0;
- ~+ d4 `* p& n6 U0 u. {                paramSet.destCIdx   = 0;. |2 L+ j- e- J
                paramSet.aCnt       = PING_PONG_ACNT;& P  }) e. ?- D1 c: h: r9 a
                paramSet.bCnt       = PING_PONG_BCNT;
( x* h: `" w! f, c                paramSet.cCnt       = PING_PONG_CCNT;
9 X6 c7 @2 {5 m' i' I: l               
& _7 B6 `' W. D$ W                /* For AB-synchronized transfers, BCNTRLD is not used. */
& E) e0 X9 A: f# L, j                paramSet.bCntReload = PING_PONG_BCNT;( H1 S# t& z0 [2 ^
- l( I4 K" I8 P, k" m
                /* Src in constant mode Dest in INCR modes */; M2 }& F. f* G! N( u( J1 Z6 [4 N
                paramSet.opt &= 0xFFFFFFFDu;
, Z) [6 }2 z1 H0 v8 \9 z: S                //paramSet.opt &= 0xFFFFFFFCu;
! o3 T% u* Z# \( L3 l                & j, a* v. K/ x+ e& B4 h
                /* Program the TCC */' h' p( g+ L( j& u% I4 {
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 ?5 U. b. Y1 }9 E2 u( J0 f

3 p  p0 s' M) |                /* Enable Intermediate & Final transfer completion interrupt *// X. m7 v$ J# r
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 l- s' W' G: Y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ R8 J/ ^" a/ b+ t8 `
) f8 `$ F4 Q4 z% c0 M" o                /* AB Sync Transfer Mode */4 D' U& W- q- U( P# P8 X- F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) z1 o9 S2 l: ], L
               
1 d0 M  ~$ J5 \4 z                /* Program the source and dest addresses for master DMA channel */
* ~$ G5 F  t- S9 m% m+ Q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 A! V. t, y$ ]( g+ a# t                paramSet.destAddr   = (uint32_t)(ping_buffer);
5 {$ ]& S+ i5 i# k7 L
! ^- |+ G& b& y- A7 `, c5 z                /* Write to the master DMA channel first. */
0 i' U( d0 s5 ?                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! V6 Q4 T8 [5 b6 k  v    }      
" [7 i6 a9 `( e1 ]9 o6 G
5 t/ \4 W6 j% n        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 r1 I0 j; X1 M7 {2 D# x% i- a        2 w$ b  ?! x7 a
    if(result == EDMA3_DRV_SOK)
3 Z0 P7 c& g/ f5 |# [% g    {
" J: m( y( b- g0 U7 A2 B( N2 @            print2arm("edma3 driver init success.",0);
3 w3 x, C1 V: D: K6 E    } . a, W7 D. L& e& F, \
}3 \6 k* ~! g% t7 I) d+ z
, r+ E4 \/ d' o1 A! Z) J: {! z
8 d7 t$ i( c: \  V' x1 \: J: R* u) \6 w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& |% p: K6 S1 Z2 @& C$ e4 j. c+ O) w9 @  k$ U! r0 E) [  O8 l: s
9 o. R) V7 E) C: ~$ ]8 b& m

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 |0 N$ x0 `. ]; V# X3 f, t+ @每次DMA传输完成后都要再次使能传输

: K& o% E3 m) v. b. g原来是这样,我明天去试试,谢谢了!




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