嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 s" g: }. V' v2 S2 R  X#define  PING_PONG_ACNT          1
  B5 D1 x7 E, ~! a* x) w% r3 }: ]#define  PING_PONG_BCNT          8*32*40
) h) e& U) G5 g6 W: r//#define  PING_PONG_BCNT       1
/ Z9 {+ n- M3 i#define  PING_PONG_CCNT          1
3 S9 K) A$ i* a) A1 {* K9 @. D8 r#define  MCASP_BASEADDR          0x01D00000
2 c5 ~5 [8 e* E) M* Z4 f5 g#define  Mcasp_RXEVENTQUE        (0u)
* i8 T( T2 ]4 I( K2 a: F& r7 @: K" y% n- F/ c6 d9 y
/* OPT Field specific defines */) `5 u2 x, I9 b: G5 D# {# h+ h* o
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
6 v8 L! _5 [; ~) p' ~#define OPT_TCC_MASK                        (0x0003F000u)( H7 w) }+ v2 `& M
#define OPT_TCC_SHIFT                       (0x0000000Cu)  V/ h0 ^& b0 B: F2 {
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)4 E7 K* t3 K3 e6 Q, ]. O' [
#define OPT_TCINTEN_SHIFT                   (0x00000014u)% }% I; z2 H# T. c. K- m! }8 i1 ^- W
* T" _( F# m; w+ T
char ping_buffer[PING_PONG_BCNT];6 ]' i* r# y$ x* n" n0 k9 b
char pong_buffer[PING_PONG_BCNT];
+ m, ?3 y5 s5 ?8 W& d& T( P/ H- D
, u" e$ Z3 Y8 s3 K
9 d: M7 n+ ~% s! ]2 e0 x% F0 c2 C6 [1 O5 y0 ]2 A* K- f) ?- y
+ v# k6 H# P9 O5 f3 J
static void ys_edma3_init()0 G9 j  J& g7 S& q
{$ V  s4 U2 D* E% {8 |) G
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 [7 ~1 t2 @3 Q* T        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 x* h5 W+ s; r4 Y" {        EDMA3_DRV_Handle hEdma;
9 X" d+ }4 W7 [9 K! z    uint32_t chId   = 0;, d9 o% i# o; X" n8 `, G
    uint32_t tcc    = 0;" [0 f6 C. q7 r& {' s2 {
. M2 o. w! I) f8 r/ Q! X$ q( M
    print2arm("edma3 driver init...",0);
2 l' L$ ?, Q2 T* G7 V% i+ O& F$ p1 j7 U& y% f
        hEdma = edma3init(0,&result);5 h1 g" R  w; a7 x3 J0 F$ G3 n4 l
        if(hEdma)
% v4 D/ w3 t( r! Y3 c* E5 I        {
( F4 z3 `4 y4 U3 n: v- c& \* d                print2arm("edma3init() Passed.",0);
" E& ?0 f( v4 n        }) e9 R3 |# R* b) Q
        else
& o! _$ L& }& H/ i4 s        {
* x5 E, l$ ?% d                print2arm("edma3init() Failed.",0);  {. V8 f2 D1 p5 a+ X/ D6 f
        }
5 M/ G. \9 K- w6 {. O# z: r        - r6 ~; }3 \# a) [. ?3 z9 G
        if (result == EDMA3_DRV_SOK)0 U6 g, H8 j) r
    {
4 o8 d$ h5 K" B) x4 [3 A' Y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ A8 j0 ]9 e5 |( I
                                                       (EDMA3_RM_EventQueue)0,# W% l* ^3 o+ Y
                                                            &edma3_isr, NULL);2 `/ M& V# G7 b. b$ [* n
    }0 c; j, x6 d* ^3 k0 i6 z5 R
       
; b: r/ b* s- A+ I; q+ V        if(result == EDMA3_DRV_SOK)
6 K0 g$ t6 }4 o  P/ o        {4 c4 \/ H7 H: R5 [1 J/ \
                paramSet.srcBIdx    = 0;1 `4 V* t, l6 t8 s# S4 T; ]- p3 B
                paramSet.destBIdx   = 1;
3 p# q% @1 T2 k6 f( H4 n                paramSet.srcCIdx    = 0;& C. z5 p9 ]7 q6 m% u! ~* n2 W8 D
                paramSet.destCIdx   = 0;
2 E1 h, t& S# X6 a% k% F; h                paramSet.aCnt       = PING_PONG_ACNT;
7 \+ T7 Z/ i5 |; Q% z                paramSet.bCnt       = PING_PONG_BCNT;* I: Q0 M! {7 B2 E8 F3 G" R% ?
                paramSet.cCnt       = PING_PONG_CCNT;- ~( ?- w1 K7 F6 u6 M* Z
               
- Z6 \7 J# F+ J  n, Z/ u/ A                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ p  n3 f7 D5 \) e$ W8 ~                paramSet.bCntReload = PING_PONG_BCNT;* T! Q6 ?9 B# l
- k1 V- `( B4 W$ s% [
                /* Src in constant mode Dest in INCR modes */
* C; l# K' F: T) w                paramSet.opt &= 0xFFFFFFFDu;. @3 ^$ J! f  P" Y' W
                //paramSet.opt &= 0xFFFFFFFCu;
2 b1 t$ ~, J, {. N) ^$ Q               
: k+ w2 B4 _6 H% @* l                /* Program the TCC */% {' t: f& ?- l# V, ^1 {
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. I- Q5 `, X8 N2 U5 |+ ?* q# C8 g0 D; t" v4 E$ x# S
                /* Enable Intermediate & Final transfer completion interrupt */
9 h$ G+ ?, _" ]$ K8 D                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 `6 H/ Q+ K* b' r& k' h- T                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# `" G* _: P" L! r( p. ?
7 g) z+ y' }4 J  {3 U
                /* AB Sync Transfer Mode */
9 B2 l' C5 d7 w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 o" U! e7 C+ A! G1 K/ v) c                ; _0 r) R- t3 {! A
                /* Program the source and dest addresses for master DMA channel */* n6 t# Q8 N" S+ r2 r+ Q' m: g
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ s6 x. {' k$ O8 c! t0 W
                paramSet.destAddr   = (uint32_t)(ping_buffer);) t) I- C  v6 ?, b9 e0 S
$ u# i* x8 m8 Y- L  y' y1 t5 n
                /* Write to the master DMA channel first. */
2 c0 H* l3 s. R, V( {                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( V  |! J  {4 u& T7 F5 \; q, v8 A  }# Y
    }      
( ~4 D, y2 e5 I! L
" F- H' l* ?& [- e8 Q( [        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; @3 b0 O" F: H. S9 f; N& [5 x$ c
        & T/ h5 H( b% r- h; U6 n
    if(result == EDMA3_DRV_SOK) 4 p5 F3 u( E) a, |; R9 ^
    {- Y/ g/ R7 O: p
            print2arm("edma3 driver init success.",0);
2 W! G' G" j6 l5 i' M    }
; F) D: A5 X# a$ C. b}. `  J/ i' m- u1 N
4 J+ C! b3 G; O2 ^$ @* {

6 O$ ]. h6 m; B1 s  b' eEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 x6 L' C; x8 k
$ O4 {  Z+ o% d3 X5 i, y7 `  l

6 c2 d8 e8 s; D4 S) A( Q( [
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 W0 D3 ]+ s( O0 K* O/ h每次DMA传输完成后都要再次使能传输

  F( U! L2 _. L- P原来是这样,我明天去试试,谢谢了!




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